TCPサーバの接続情報と、サーバのファイル一式が与えられた。
chall.c
を読むと、以下の関数があることがわかった。
vuln
:read
関数で32 + 8 + 16
バイトを読み込んだ後、close(0);
を実行する。win
:引数が条件を満たせば、system("cat flag.txt");
を実行する。
次に、chall
の逆アセンブルを行った。結果の一部を以下に示す。
Information to connect to a TCP server and the files for the server were given.
Reading chall.c
, I found these functions:
vuln
: Reads 32 + 8 + 16
bytes via the function read
, and executes close(0);
.win
: Executes system("cat flag.txt");
if its arguments satisfies the condition.
Also I disassembled chall
via objdump in
vuln
関数において、データを-0x20(%rbp)
に読み込んでおり、リターンアドレスは%rbp
の8バイト先にあるので、
読み込むデータの0x28
バイト目(0-origin)からがリターンアドレスになることがわかる。
以下のデータを
リターンアドレスを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
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");
.