TCPサーバの接続情報と、ELFファイル horoscope
が与えられた。
horoscope
をstrings --radix=x
コマンドで文字列の位置に対応する文字列を求めたところ、以下の処理をしていることがわかった。
fgets
関数でスタック上に文字列を読み込む。processInput
関数に渡す。
processInput
関数は文字列の内容によっては exit
関数を用いて処理を終わらせるが、例えば 1
を入力した時は呼び出し元に帰ることがわかった。
また、system("/bin/sh");
に相当する以下の部分があった。
Information to connect to a TCP server and an ELF file horoscope
were given.
I disassembled horoscope
using objdump from strings --radix-x
command.
As a result, I found it doing this:
fgets
.processInput
.
The function processInput
may terminate execution via the function exit
for some input strings, but I found that entering 1
will have the function return to the caller.
Also, I found this part that is equivalent to system("/bin/sh");
:
fgets
関数が読み込む文字列の長さの上限は十分大きいので、ここで読み込ませるデータによって main
関数のリターンアドレスを書き換えることができる。
以下のデータをmain
関数のリターンアドレスを system("/bin/sh");
に相当する部分のアドレスに書き換え、シェルを起動することができた。
The maximum length of the string to be read via the function fgets
is large enough, so the return address of the function main
can be changed via the data to feed here.
I succeeded to launch the shell by sending this data via "Send File" on main
to the address of the part equivalent to system("/bin/sh");
.
起動したシェルで ls -al
コマンドを実行することで、ファイル flag.txt
があることがわかった。
cat flag.txt
コマンドを実行すると、flagが得られた。
I found that a file flag.txt
exists via ls -al
command on the shell.
I obtained the flag via cat flag.txt
command.