yyy

CTFつよくなりたい

ASIS CTF Quals 2019 Key maker

問題文

The Keymaker: Only the One can open the door. And only during that window can that door be opened.

Niobe: How do you know all this?

The Keymaker: I know because I must know. It is my purpose. It is the reason I am here. The same reason we are all here.

PEファイルを解析する問題.ポイントは最終的に93で,solve数は51だった.

$ file key_maker.exe
key_maker.exe: PE32+ executable (console) x86-64 (stripped to external PDB), for MS Windows
$ key_maker.exe
KeyMaker is old, you are the one to help Neo!!
Please enter licence key: hoge
Sorry, given licence is invalid!

crackmeだとわかる.適切なライセンスキーを入力する必要がある.

入力値を扱っている箇所の逆アセンブル結果が少々複雑なため,最近話題のGhidraを初めて使ってデコンパイルしてみたが,かなりよかった.以下はmain関数のデコンパイル結果.

f:id:ywkw1717:20190422145756p:plain
main

50文字の入力をFUN_00401637に渡していて,この関数が入力値を検証するものだとわかる.

f:id:ywkw1717:20190422183829p:plain
FUN_00401637

FUN_00401637では,最初のif文で入力値の17文字目と34文字目が _ になっているか,5文字目と最後の文字を掛け合わせた結果が0x3c0fになっているか(これはつまり,5文字目が { で,最後の文字が } かどうか)を確認している.この時点で正規のライセンスキーが,ASIS{........} みたいなフラグの形式になっていそうだとわかる.

その後,3つのWhileループで _ を除いた文字を3分割,つまり16文字ずつ,36進数( strtol(&local_38,(char **)0x0,0x24) )で配列に代入している.

f:id:ywkw1717:20190422145846p:plain
FUN_00401637

その後,3つの配列の全ての組み合わせ,6通りをFUN_00401530の第1引数と第2引数に渡し,第3引数に渡した配列にFUN_00401530での演算結果を代入するような仕組みになっている.

f:id:ywkw1717:20190422145828p:plain
FUN_00401530

肝心のこの関数では,param1とparam2やカウンタ変数などを使って加算処理を行って,結果をparam3に代入している.この結果,param3に渡された配列には16個の要素が入ることになる.

f:id:ywkw1717:20190422145846p:plain
FUN_00401637

FUN_00401637をもう一度見てみると,作成した6つの配列をそれぞれとある要素(*(int *)(&DAT_00404040 + ((longlong)local_20 + (longlong)local_1c * 4) * 4)みたいなの)と比較している.これは,以下の部分にそれぞれ4バイトで計64個格納されている値のこと.

f:id:ywkw1717:20190422145930p:plain
比較されるやつ

以上の解析結果から,z3を使用して解く方針で進める.

完成したスクリプトは以下.

gist.github.com

実行結果.

$ python key_maker.py
[u_15 = 0,
 u_14 = 3,
 u_13 = 14,
 u_12 = 21,
 u_11 = 12,
 u_10 = 4,
 u_9 = 27,
 u_8 = 24,
 u_7 = 27,
 u_6 = 3,
 u_5 = 20,
 u_4 = 4,
 u_3 = 22,
 u_2 = 34,
 u_1 = 3,
 u_0 = 20,
 t_15 = 0,
 t_14 = 24,
 t_13 = 0,
 t_12 = 24,
 t_11 = 14,
 t_10 = 23,
 t_9 = 13,
 t_8 = 23,
 t_7 = 10,
 t_6 = 34,
 t_5 = 7,
 t_4 = 18,
 t_3 = 23,
 t_2 = 1,
 t_1 = 27,
 t_0 = 29,
 s_15 = 33,
 s_14 = 33,
 s_13 = 33,
 s_12 = 1,
 s_11 = 27,
 s_10 = 7,
 s_9 = 4,
 s_8 = 22,
 s_7 = 3,
 s_6 = 17,
 s_5 = 7,
 s_4 = 0,
 s_3 = 28,
 s_2 = 18,
 s_1 = 28,
 s_0 = 10]

flag: ASIS{7H3M47R1XXX_TR1NI7YANDNEO0O0_K3YM4K3ROR4CLE3}

この問題のCategory, Reverse Baby warm-up となっていてびびる.