2012年11月12日月曜日

SECCON CTF in NAIST Binary hello-x86-world

またしてもWindowsの実行ファイルからの問題です。実行するとヘルプメッセージを出してくれるとか親切です。
では何を引数に入れたらいいのかを探していきましょう。
下図がmain関数の逆アセンブリです。
call _printfまで実行されたら負けなのでjz short lot_40122Dを追います。loc_40122Dはジャンプ元の直下にあるところで、コマンドライン引数をchar *型として関数sub_4010E0に渡します。では関数sub_4010E0を見てみましょう。
まずeax = _strlen(char *)を求めていることが分かります。
そしてcmp eax, 0xEがあるのでこのコマンドライン引数が14文字であるかどうかを確かめています。14文字の場合、その次のjmpは成立しないので上から順に実行されます。
mov ecx [ebp+ arg_0]
movsx edx, byte ptr [ecx+8]
この2命令でecxにコマンドライン引数であるargv配列の先頭を指すアドレスが入り、edxにargv[8]が入ります。
その次にedx = argv[8] == 0x61 ('a') ? かどうかを比較しているのでargv[8] = 'a'とわかります。
では比較がなりたつ場合、jzは成立せず、また順に実行されます。
上記の手順と同様に
mov eax, [ebp+arg_0]
movsx ecx, byte ptr [eax+7]
mov edx, [ebp+arg_0]
movsx eax, byte ptr [edx+8]
より、ecx, eax = argv[7], argv[8]となりました。
つぎに
sub ecx, eax
cmp ecx, 13h
によりargv[7] = argv[8] + 0x13ということがわかります。
つまりargv[7] = 'a' + 0x13 = 't'となり、argv = "*******ta*****"となります。
以降同様のようなアルゴリズムでargv[0x0] ~ argv[0x10]まで確定しますが、そこで関数が終了しています。(下図)

なのでこれで求まったargv[0:0x10] + "???"の14文字をコマンドライン引数にして代入して実行してあげると同じディレクトリに123というファイルが作成されます。
このファイルの中身からは未だにとくにヒントらしきものが見つからないので
求まったargv[0:0x10]あるいはargv[0:0x10] + "123"がkeyなのではないかと推測しています。

0 件のコメント:

コメントを投稿