Flag = WhiteHat{SHA1(key)}Download fileを解凍すると、Re200.exeができます。
Download file
fileコマンドでファイル形式を確認してみます。
% file Re200.exeWindowsのコンソールアプリであることが分かりました。
Re200.exe: PE32 executable (console) Intel 80386, for MS Windows
コマンドプロンプトで実行してみます。
>Re200.exekeyが間違っているようです。おそらくコマンドライン引数で正しいキーを与えれば良いのでしょう。
Key wrong!
ここで、IDA Proで解析してみます。
main関数の最初で次のようにmovでメモリコピーしています。
mov ecx, ds:dword_403158実際にmovでコピーされる値は次の通りです。最後に0(null)終端していますので、文字列化されることが分かります。
mov [ebp+var_27C], ecx
mov edx, ds:dword_40315C
mov [ebp+var_278], edx
mov eax, ds:dword_403160
mov [ebp+var_274], eax
mov ecx, ds:dword_403164
mov [ebp+var_270], ecx
mov dl, ds:byte_403168
mov [ebp+var_26C], dl
.rdata:00403158 dword_403158 dd 41683056h ; DATA XREF: _main+6DrIntel x86プロセッサのバイトオーダはリトルエンディアンなので、次のようにメモリにコピーされます。
.rdata:0040315C dword_40315C dd 47464364h ; DATA XREF: _main+79r
.rdata:00403160 dword_403160 dd 6E464762h ; DATA XREF: _main+85r
.rdata:00403164 dword_403164 dd 3D675350h ; DATA XREF: _main+90r
.rdata:00403168 byte_403168 db 0 ; DATA XREF: _main+9Cr
27C | 27B | 27A | 279 | 278 | 277 | 276 | 275 | 274 | 273 | 272 | 271 | 270 | 26F | 26E | 26D | 26C |
56 | 30 | 68 | 41 | 64 | 43 | 46 | 47 | 62 | 47 | 46 | 6E | 50 | 53 | 67 | 3D | 00 |
V | 0 | h | A | d | C | F | G | b | G | F | n | P | S | g | = |
この文字列は16文字(4の倍数)で最後が=で終わっているので、おそらくBASE64ですね。
復号すると次のようになります。
WH@t!Flag=(続いて2つ目のmovの塊が出てきます。
mov ecx, ds:dword_40316C実際にコピーされるデータは次の通りです。
mov [ebp+var_3A4], ecx
mov edx, ds:dword_403170
mov [ebp+var_3A0], edx
mov eax, ds:dword_403174
mov [ebp+var_39C], eax
mov ecx, ds:dword_403178
mov [ebp+var_398], ecx
mov dl, ds:byte_40317C
mov [ebp+var_394], dl
.rdata:0040316C dword_40316C dd 48523151h ; DATA XREF: _main+BEr同様にして、
.rdata:00403170 dword_403170 dd 54355554h ; DATA XREF: _main+CAr
.rdata:00403174 dword_403174 dd 55645555h ; DATA XREF: _main+D6r
.rdata:00403178 dword_403178 dd 3D3D514Bh ; DATA XREF: _main+E1r
.rdata:0040317C byte_40317C db 0 ; DATA XREF: _main+EDr
3A4 | 3A3 | 3A2 | 3A1 | 3A0 | 39F | 39E | 39D | 39C | 39B | 39A | 399 | 398 | 397 | 396 | 395 | 394 |
51 | 31 | 52 | 48 | 54 | 55 | 35 | 54 | 55 | 55 | 64 | 55 | 4B | 51 | 3D | 3D | 00 |
Q | 1 | R | H | T | U | 5 | T | U | U | d | U | K | Q | = | = |
BASE64で復号すると、
CTGMNSQGT)さらに3つ目のmovの塊です。
mov ecx, ds:dword_403180
mov [ebp+var_16C], ecx
mov edx, ds:dword_403184
mov [ebp+var_168], edx
mov eax, ds:dword_403188
mov [ebp+var_164], eax
mov cl, ds:byte_40318C
mov [ebp+var_160], cl
.rdata:00403180 dword_403180 dd 79495551h ; DATA XREF: _main+10Frこれも同様に、
.rdata:00403184 dword_403184 dd 4246444Eh ; DATA XREF: _main+11Br
.rdata:00403188 dword_403188 dd 3D3D7751h ; DATA XREF: _main+127r
.rdata:0040318C byte_40318C db 0 ; DATA XREF: _main+132r
16C | 16B | 16A | 169 | 168 | 167 | 166 | 165 | 164 | 163 | 162 | 161 | 160 |
51 | 55 | 49 | 79 | 4E | 44 | 46 | 42 | 51 | 77 | 3D | 3D | 00 |
Q | U | I | y | N | D | F | B | Q | w | = | = |
BASE64で復号すると、
AB241AC復号した3つの文字列をうまく連結すると、次のようになります。
WH@t!Flag=(AB241ACCTGMNSQGT)さて、ここで実行ファイルに上記で得られた文字列をコマンドライン引数に渡して起動してみましょう。
> Re200.exe WH@t!Flag=(AB241ACCTGMNSQGT)ということで、この文字列がkeyのようです。
Key OK!
この文字列をSHA1でハッシュ化した次の文字列がFlag(答え)となります。
WhiteHat{1ceeebacb946479997e13a289124ac080693c0bc}