docker_dive

テキストファイル Dockerfile と、ELFファイル solver が与えられた。

solverGhidraで逆コンパイルすると、 entry関数から__libc_start_main関数にFUN_001014b2関数が渡されていることがわかった。
FUN_001014b2は、以下のものであった。

A text file Dockerfile and a ELF file solver were given.

Decompiling solver using Ghidra, I found that the function entry passes the function FUN_001014b2 to the function __libc_start_main.
This is the function FUN_001014b2:

FUN_001014b2.c

このプログラムは、環境の情報に基づいて64bitの値を作り、それに基づく鍵を埋め込まれたデータとxorして出力するものである。
この鍵の生成では、値を0xa5で割っていき、0になったら値をリセットする処理が行われていた。
そこで、1 << 630xa5 で繰り返し割ってみると、9回目で値が1を下回った。
よって、xorする鍵は9バイト程度の周期を持つと推測できる。

まず、以下のCyberChefのRecipeを用い、逆コンパイル結果からデータを取り出した。

This program creates a 64-bit value from information about the environment, generates a key from the value, and prints the exclusive-or of the key and embed data.
During generating this key, the value is divided by 0xa5 and resetted when the value reaches to 0.
I tried repeatedly dividing 1 << 63 by 0xa5, and found that the result becomes less than 1 after the 9th division.
Therefore, the key for exclusive-or can be guessed to have a cycle around 9 bytes.

Firstly, I extracted the embed data using this CyberChef Recipe.

Find / Replace, 2 more - CyberChef

次に、XORした結果の先頭が FLAG{ となるような鍵を長さを変えて試していくと、
長さ9バイトの鍵を用いた時にflagの一部 FLAG{####Kn0W_####to_Ge####to_7h####ckeR} を復元できたようだった。

Then, I tried some keys with different length such that the first part of the result of XOR becomes FLAG{.
As a result, I succeeded to recover a part of the flag FLAG{####Kn0W_####to_Ge####to_7h####ckeR} when I used a 9-byte key.

From Hex, 7 more - CyberChef

flagの残りの部分が全て英大文字、英小文字、数字、アンダーバーのどれかになるようなflagの先頭部分の候補を以下のプログラムで探し、 得られた候補の中からそれっぽいものを当てはめた。

Using this program, I searched for candidates of the first part of the flag such that all of the rest part of the flag becomes uppercase or lowercase English alphabets, numbers, or an underscore.
Then, I selected characters that looks fitting well from the candidates.

search.pl

flagの先頭を FLAG{Y0u_ と仮定して得られた FLAG{Y0u_Kn0W_h0w_to_GeT_1nto_7hE_DockeR} は、incorrectとなった。
flagの先頭を FLAG{y0u_ と仮定すると、flagが得られた。

FLAG{Y0u_Kn0W_h0w_to_GeT_1nto_7hE_DockeR}, obtained by assuming that the first part of the flag is FLAG{Y0u_, was judged as incorrect.
I obtained the flag by assuming that the first part of the flag is FLAG{y0u_.

From Hex, 7 more - CyberChef

FLAG{y0u_Kn0W_H0w_to_Get_1nto_7he_DockeR}

WaniCTF 2021