Horoscope

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

horoscopeTDM-GCCのobjdumpで逆アセンブルし、 strings --radix=x コマンドで文字列の位置に対応する文字列を求めたところ、以下の処理をしていることがわかった。

  1. メッセージを出力する。
  2. fgets 関数でスタック上に文字列を読み込む。
  3. 読み込んだ文字列を 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 TDM-GCC and obtained strings that correspond to the positions of strings using strings --radix-x command.
As a result, I found it doing this:

  1. Print some messages.
  2. Read a string on the stack via the function fgets.
  3. Pass the string read to the function 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");:

40095f: 48 8d 3d 52 02 00 00 lea 0x252(%rip),%rdi # 400bb8 <_IO_stdin_used+0x1b8> 400966: e8 95 fc ff ff callq 400600 <system@plt>

fgets 関数が読み込む文字列の長さの上限は十分大きいので、ここで読み込ませるデータによって main 関数のリターンアドレスを書き換えることができる。
以下のデータをTera Teramの「ファイル送信」で送信することで、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 Tera Term to set the return address of the function main to the address of the part equivalent to system("/bin/sh");.

payload.bin

起動したシェルで 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.

sdctf{S33ms_y0ur_h0rO5c0p3_W4s_g00d_1oD4y}

San Diego CTF 2022