Oil Spill

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

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

  1. 以下の情報を出力する。
    • puts 関数のアドレス
    • printf 関数のアドレス
    • 後の fgets 関数でデータを読み込む先のスタック上のアドレス
    • temp 関数のアドレス
  2. メッセージを出力する。
  3. fgets 関数で文字列を読み込む。
  4. 読み込んだ文字列を printf 関数の第1引数に渡す。
  5. メッセージを出力する。

Information to connect to a TCP server was given.
An ELF file OilSpill and a file Dockerfile were also given.

I disassembled OilSpill 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 these information:
    • The address of the function puts
    • The address of the function printf
    • The address of the region on the stack to read some data via the function fgets called later
    • The address of the function temp
  2. Print some messages.
  3. Read a string using the function fgets.
  4. Pass the string read as the first argument of the function printf.
  5. Print a message.

I entered this string and examined the output:

%p%p%p%p%p%p%p%p%p%p%p%p%p%p%p%p%p%p%p%p%p%p%p%p%p%p%p%p%p%p

を入力し、出力を調べると、入力した文字列は8番目以降のデータに反映されることがわかった。

また、出力された puts 関数および printf 関数のアドレスを libc-database に入力して調べると、 libc6_2.27-3ubuntu1.5_amd64 のみがヒットした。

これらに基づき、printf関数とデータの読み込み先のアドレスを受け取り、入力するべきデータを出力する以下のプログラムを作成した。

As a result, I found that the string entered is used as the 8th data and data after that.

Also, I put the printed addresses of puts and printf to libc-database. As a result, only libc6_2.27-3ubuntu1.5_amd64 was presented as a result.

Based on these, I created this program that takes addresses of printf and where to read the data, and outputs data to enter.

payload_gen.pl

このプログラムにより作成したデータを入力すると、書式 %n により以下の動作をする。

作成したデータをTera Termの「ファイル送信」を用いてサーバに送信すると、再び文字列の入力を要求される。
ここで /bin/sh と入力することで、シェルを起動することができる。

起動したシェルで ls -al コマンドを実行することで、ファイル flag.txt があることがわかった。
cat flag.txt コマンドを実行すると、flagが得られた。

When the data created via this program is entered, thanks to the format specifier %n, the behavior will be:

After sending the data via "Send File" on Tera Term, the server will ask for another string.
We can launch the shell by entering /bin/sh here.

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{th4nks_f0r_S4V1nG_tH3_duCk5}

San Diego CTF 2022