Dodgy Databases

TCPサーバの接続情報と、サーバのプログラム (C言語のソースコードとバイナリ) 、 そしてファイルDockerfiledatabase.txtが与えられた。

与えられたソースコードを読むと、主に以下の処理をしていた。

  1. fgets関数で入力を読み込む
  2. adminの情報を作成する
  3. adminの情報をfree関数で開放する
  4. 入力データを用いて、userの情報を作成する
  5. adminroleROLE_GODならば、FLAGを出力する

rolenameの後に配置されると予想でき、十分な長さの入力が許されるので、 入力によってroleの値を設定することが可能である。
また、adminの情報を開放した後にuserの情報を作成するが、 このとき確保する領域の大きさは同じなので、領域が再使用されると予想できる。

これらの仮定に基づき、以下のデータをTera Termで「ファイル送信」すると、flagが出力された。

Information to connect to a TCP server, the program of the server (C source code and binary), and files Dockerfile and database.txt were given.

Reading the source code given, I found the program is mainly doing following things:

  1. Read some input via the function fgets
  2. Create data for admin
  3. Deallocate the data for admin via the function free
  4. Create data for user using the data read
  5. If the role of admin is ROLE_GOD, print the FLAG

role looked being placed after name and enough length of input is allowed, so it is possible to set the value of role by the input.
Also, the data for user is created after deallocating data for admin. The size of buffer for them are the same, so the buffer may be reused.

Based on these assumptions, sending this data via "Send File" on Tera Term had the server print the flag.

payload.dat

ractf{w0w_1_w0nD3r_wH4t_free(admin)_d0e5}

RACTF 2021