[ksnctf] Riddle

ksnctfにチャレンジ 第11問目です。

※ksnctfは常駐型のCTFサイトです。 ※問題のページはコチラです。

Riddle

バイナリ解析です。 結構めんどうなのでいかにズルをするかもポイントな気がします。

まず、課題の実行ファイルを起動すると なぞなぞが表示されるので

Human
Greenland
42

と順番に正解すると 最後に じゃあフラグはなにさ? と聞かれますが 当然答えはわかりません。

IDA Proなどをつかって解析するしかありません。 Wrong や Correct という文字を表示しているあたりを 調べれば判定部分はすぐに見つかります。

判定手順は

まず入力された文字の長さを調べて正解と長さが違えば即 Wrong 次に文字を処理するルーチンになげて、処理された文字列が 正解の文字列と一致すれば Correct ( 問題番号が3=4問目 は Congraturation) で問題番号を 1増やす 違えば Wrong

ということをやっているようです。

答えと答えの長さは

.data:00405178                                         ; "Which creature in the morning goes on f"...
.data:0040517C dword_40517C    dd 2B37C6B1h            ; DATA XREF: sub_401980+6Fr
.data:00405180                 db  76h ; 

.data:004051A0                 dd offset aWhatIsTheLarge ; "What is the largest island in the world"...
.data:004051A4                 db 0BEh ; セ  G
.data:004051A5                 db 0C1h ; チ  r
.data:004051A6                 db  3Fh ; ?  r
.data:004051A7                 db  2Fh ; /  e
.data:004051A8                 db  76h ; v  n
.data:004051A9                 db  86h ; ・ l
.data:004051AA                 db  3Ch ; <  a
.data:004051AB                 db  58h ; X  n
.data:004051AC                 db 0FDh ;   d

.data:004051C8                 dd offset aAnswerToTheUlt ; "Answer to the Ultimate Question of Life"...
.data:004051CC                 db 0CDh ; ヘ  4
.data:004051CD                 db  81h ; ・ 2

.data:004051F0                 dd offset aWhatIsTheFlag? ; "What is the flag?"
.data:004051F4                 db 0BFh ; ソ  F
.data:004051F5                 db 0FFh      L
.data:004051F6                 db  1Bh      A
.data:004051F7                 db  0Dh      G
.data:004051F8                 db  47h ; G  _
.data:004051F9                 db 0A7h ; ァ
.data:004051FA                 db  18h
.data:004051FB                 db  4Fh ; O
.data:004051FC                 db 0CBh ; ヒ
.data:004051FD                 db 0D6h ; ヨ
.data:004051FE                 db  5Ch ; \
.data:004051FF                 db  59h ; Y
.data:00405200                 db  95h ; ・
.data:00405201                 db  61h ; a
.data:00405202                 db  73h ; s
.data:00405203                 db  57h ; W
.data:00405204                 db 0B3h ; ウ
.data:00405205                 db 0D1h ; ム
.data:00405206                 db  94h ; ・
.data:00405207                 db  9Fh ; ・
.data:00405208                 db 0ACh ; ャ

こんな感じ記録されていました。 肝心の変換処理ですがこれが厄介です。

このTWISTEDと名付けたルーチンがそれっぽいのですが いろいろやった上で xor をとっているみたいです。

実験として

Human
0x48 0x75 0x6D 0x61 0x6E
0xB1 0xC6 0x37 0x2B 0x76
--------------------------xor
0xF9 0xB3 0x5A 0x4A 0x18

Greenland
0x47 0x72 0x65 0x65 0x6e 0x6c 0x61 0x6e 0x64
0xBE 0xC1 0x3F 0x2F 0x76 0x86 0x3C 0x58 0xFD
---------------------------------------------- xor
0xF9 9xB3 0x5A 0x4A 0x18 0xEA 0x5D 0x36 0x99

42
0x34 0x32
0xCD 0x81
-----------xor
0xF9 0xB3

変換前と変換後をXORすると同じ 値が出現しているのでこの路線で良さそうです。 この 0xF9 から始まるデータを 鍵列と呼ぶことにします。 FLAGを求めるにはこの鍵列が 21文字分必要ですが TWISTEDの中身をちゃんと読まないといけません…読みたくありません

ひとまず Greenland から 9文字目まではわかるので

   F    L    A    G    _    M    E    y    R
0x46 0x6c 0x61 0x67 0x5f 0x4D 0x45 0x79 0x52
0xBF 0xFF 0x1B 0x0D 0x47 0xA7 0x18 0x4F 0xCB 0xD6 0x5C 0x59 0x95 0x61 0x73 0x57 0xB3 0xD1 0x94 0x9F 0xAC
---------------------------------------------------------------------------------------------------------xor
0xF9 9xB3 0x5A 0x4A 0x18 0xEA 0x5D 0x36 0x99

ここまではわかります。 ここからズルをします。 まず

21文字分適当な値を放り込んで TWISTEDに処理をさせた文字列を確認します。 TWISTED直後あたりにブレークポイントを挟んで var_24 に

0xBF 0xFF 0x1B 0x0D 0x47 0xA7 0x18 0x4F 0xCB 0xA3 …

が入っているのが確認できます。 当然0xCBまでは正解と一致していますが A3 以降は当然違います。 しかし

 'A' xor 鍵 = 0xA3
ならば
 鍵 = 'A' xor 0xA3

で求まります。 よって

FLAG_MEyRAAAAAAAAAAAA

を用いて

    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?
 0x41 0x41 0x41 0x41 0x41 0x41 0x41 0x41 0x41 0x41 0x41 0x41 
-----------------------------------------------------------------------
 0xA3 0x47 0x7E 0xE0 0x61 0x06 0x5E 0xB4 0xC7 0xE2 0xED 0x86

から 不明な鍵列 ? は

 0xE2 0x06 0x3F 0xA1 0x20 0x47 0x1F 0xF5 0x86 0xA3 0xAC 0xC7

と求まるので TWISTEDは無視します。 鍵列がわかれば

   F    L    A    G    _    M    E    y    R    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?
0x46 0x6c 0x61 0x67 0x5f 0x4D 0x45 0x79 0x52 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX
0xBF 0xFF 0x1B 0x0D 0x47 0xA7 0x18 0x4F 0xCB 0xD6 0x5C 0x59 0x95 0x61 0x73 0x57 0xB3 0xD1 0x94 0x9F 0xAC
-----------------------------------------------------------------------------------------------------------xor
0xF9 9xB3 0x5A 0x4A 0x18 0xEA 0x5D 0x36 0x99 0xE2 0x06 0x3F 0xA1 0x20 0x47 0x1F 0xF5 0x86 0xA3 0xAC 0xC7

余裕でFLAGが求まります。

余裕と言いつつ5,6時間はかかった気もしま