ret4win

TCPサーバの接続情報と、サーバのファイル一式が与えられた。

chall.c を読むと、以下の関数があることがわかった。

次に、TDM-GCCのobjdumpを用いて chall の逆アセンブルを行った。結果の一部を以下に示す。

Information to connect to a TCP server and the files for the server were given.

Reading chall.c, I found these functions:

Also I disassembled chall via objdump in TDM-GCC. This is a part of the result:

dump_part.txt

vuln関数において、データを-0x20(%rbp)に読み込んでおり、リターンアドレスは%rbpの8バイト先にあるので、 読み込むデータの0x28バイト目(0-origin)からがリターンアドレスになることがわかる。

以下のデータをTera Termの「ファイル送信」で送信することで、
リターンアドレスをwin関数の冒頭に設定することで "cat flag.txt" のアドレスを%raxに入れさせ、
その次のアドレスをmov %rax, %rdi; call systemのアドレスに設定することで、system("cat flag.txt"); を実行させ、flagが得られた。

We can say that data from the 0x28-th byte (the first byte is 0th) of the input will be used as the return address
because the function vuln stores data read to -0x20(%rbp) and the return address is 8 bytes ahead from %rbp.

I obtained the flag by sending this data via "Send file" on Tera Term.
This data sets the return address to the beginning of the function win to have it store the address of "cat flag.txt" to %rax,
and places the address of mov %rax, %rdi; call system after the return address to have it execute system("cat flag.txt");.

payload.bin

buckeye{ret2win_t1m3s_tw0_1s_ret4win_1_guess}

BuckeyeCTF 2021