Turtle Shell (100)
TCPサーバの接続情報と、ファイル Dockerfile
および turtle-shell
が与えられた。
ファイル turtle-shell
に file
コマンドを用いた所、64bitのELFファイルだとわかったので、TDM-GCCのobjdumpで逆アセンブルを行った。
以下はその結果の一部である。fgets
でデータを読み込んだ後、strstr
で何かを検索し、見つからなければ読み込んだデータを実行することが読み取れる。
Information for connection to a TCP server, and files Dockerfile
and turtle-shell
were given.
I used the file
command to the file turtle-shell
. It revealed that the file is a 64-bit ELF file, so I disassembled that using objdump from TDM-GCC.
This is a part of the result. In this part, it reads data using fgets
, searches for something from the data using strstr
, and executes the data if it finds nothing.
40069e: 48 8d 45 c0 lea -0x40(%rbp),%rax
4006a2: be 32 00 00 00 mov $0x32,%esi
4006a7: 48 89 c7 mov %rax,%rdi
4006aa: e8 91 fe ff ff callq 400540 <fgets@plt>
4006af: 48 8b 15 7a 04 20 00 mov 0x20047a(%rip),%rdx # 600b30 <bad>
4006b6: 48 8d 45 c0 lea -0x40(%rbp),%rax
4006ba: 48 89 d6 mov %rdx,%rsi
4006bd: 48 89 c7 mov %rax,%rdi
4006c0: e8 8b fe ff ff callq 400550 <strstr@plt>
4006c5: 48 85 c0 test %rax,%rax
4006c8: 75 13 jne 4006dd <main+0x96>
4006ca: 48 8d 45 c0 lea -0x40(%rbp),%rax
4006ce: 48 89 45 f8 mov %rax,-0x8(%rbp)
4006d2: 48 8b 55 f8 mov -0x8(%rbp),%rdx
4006d6: b8 00 00 00 00 mov $0x0,%eax
4006db: ff d2 callq *%rdx
そこで、まずシェルを起動するプログラムを書いた。
Seeing this, I firstly wrote a program to launch the shell.
payload.asm
NASM でアセンブルすると、以下の結果が得られた。
I assembled this using NASM. This is the result.
payload.bin
また、turtle-shell
を CS50 Sandbox 上のgdbで実行し、strstr
で何を検索しているのかを調べると、検索対象は b0 3b
というバイト列であった。
Also I executed turtle-shell
on CS50 Sandbox with gdb to found what is searched for using strstr
. I found that a sequence of bytes b0 3b
is searched for.
$ gdb ./turtle-shell
Reading symbols from ./turtle-shell...(no debugging symbols found)...done.
(gdb) break *0x4006c0
Breakpoint 1 at 0x4006c0
(gdb) r
Starting program: /root/sandbox/turtle-shell
Say something to make the turtle come out of its shell
aaa
Breakpoint 1, 0x00000000004006c0 in main ()
(gdb) p/x $rdx
$1 = 0x400778
(gdb) x/s $rdx
0x400778: "\260;"
(gdb) x/32x $rdx
0x400778: 0xb0 0x3b 0x00 0x00 0x00 0x00 0x00 0x00
0x400780: 0x53 0x61 0x79 0x20 0x73 0x6f 0x6d 0x65
0x400788: 0x74 0x68 0x69 0x6e 0x67 0x20 0x74 0x6f
0x400790: 0x20 0x6d 0x61 0x6b 0x65 0x20 0x74 0x68
(gdb)
今回のアセンブル結果にこのバイト列は存在しなかったため、アセンブル結果を Tera Term の「ファイル送信」で送信すると、シェルを起動できた。
起動したシェルで ls -al
コマンドを実行すると、ファイル flag.txt
があることがわかった。
cat flag.txt
コマンドを実行すると、flagが得られた。
Since the assembled data doesn't have this sequence, sending this data via "Send File" on Tera Term launched the shell.
I executed a command ls -al
in the shell, and I found a file flag.txt
.
I obtained the flag via a command cat flag.txt
.
sdctf{w0w_y0u_m4d3_7h3_7urT13_c0m3_0u7_0f_1t5_5h3l1}
SDCTF 2023