Turtle Shell (100)

TCPサーバの接続情報と、ファイル Dockerfile および turtle-shell が与えられた。

ファイル turtle-shellfile コマンドを用いた所、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-shellCS50 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