テキストファイル Dockerfile
と、ELFファイル solver
が与えられた。
solver
をentry
関数から__libc_start_main
関数にFUN_001014b2
関数が渡されていることがわかった。
FUN_001014b2
は、以下のものであった。
A text file Dockerfile
and a ELF file solver
were given.
Decompiling solver
using entry
passes the function FUN_001014b2
to the function __libc_start_main
.
This is the function FUN_001014b2
:
このプログラムは、環境の情報に基づいて64bitの値を作り、それに基づく鍵を埋め込まれたデータとxorして出力するものである。
この鍵の生成では、値を0xa5
で割っていき、0になったら値をリセットする処理が行われていた。
そこで、1 << 63
を 0xa5
で繰り返し割ってみると、9回目で値が1を下回った。
よって、xorする鍵は9バイト程度の周期を持つと推測できる。
まず、以下の
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
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.
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.
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_
.