脳内テキストの垂れ流し

プログラミングとか絵とか色々

リバースエンジニアリング初心者向け HackThisSite アプリケーションチャレンジ 5

 

今回はApplication Challenge 5をやりますー

Hack This Site!からapp5win.zipをダウンロードしてきましょう。

 

初心者の方には今回のは少し難しいかもしれませんが、なるべく分かりやすくやってみます。

 

動かしてみると、コンソールが表示されパスワードの入力を促されます。どうやら今回はCUIアプリケーションの様です。

f:id:ibuninngu:20170930215253p:plain

 

・早速デバッガで見てみる

では早速デバッガで解析していきましょう。

エントリーポイントからF8(Step Over)で進んでいくと、"0x004012E0"で"app5win.401000"を呼び出している命令が見つかると思います。

f:id:ibuninngu:20170930222353p:plain

この命令をF8で実行するとコンソールに"Please enter the password: "と表示されて入力待ち状態になります。ここを探っていきましょう。

一旦リスタートしてここをF7(Step into)で実行してみましょう。

 

飛んだ先でF8を使って進めていくと、"0x00401054"の"call app5win.401140"を実行した段階でプログラムが入力待ち状態になると思います。

何か入力してエンターを押せば戻ってくるので、この命令の後ろにブレークポイントをかましときましょう。

f:id:ibuninngu:20170930224015p:plain

 

パスワードを入力してエンターを押すと、すぐに止まるはずです。

f:id:ibuninngu:20170930224428p:plain

(リターン後のレジスタの様子)

f:id:ibuninngu:20170930224630p:plain

 

"0x00401054"から"0x00401084"までの処理で、入力された文字列はスタックに4byteずつリトルエンディアンで格納されます。

f:id:ibuninngu:20170930225647p:plain

(文字列が格納されたスタック)

f:id:ibuninngu:20170930225819p:plain

 

スタックにはこんな感じで値が格納されています。

0x69, 0x72, 0x6F, 0x67 = "i, r, o, g"
0x67, 0x61, 0x6C, 0x6C = "g, a, l, l"
0x6C, 0x69, 0x72, 0x6F = "l, i, r, o"
0x00, 0x0A, 0x61, 0x6C = ", \n, a, l"

 

少し進むと、"0x004010C0"から"0x004010C3"に怪しい命令があることに気がつくでしょう。

f:id:ibuninngu:20170930225213p:plain

 

0x004010C0: mov eax, dword ptr ds:[ecx+eax*4]
0x004010C3: cmp eax, dword ptr ss:[esp+edx*4-18]

ここがポイントです。"0x004010C3"まで処理を進めて、アドレス"esp+edx*4-18"にある内容を見てみましょう。

f:id:ibuninngu:20170930232812p:plain

 

どうやら"powe"という文字列を指しているようです。

f:id:ibuninngu:20170930233038p:plain

この文字列はリトルエンディアンで参照され、スタックに格納された"gori"と比較されます。等しかった場合はこの先の"jmp"命令で"0x0040109C"へ飛び、edxの値を-1して参照場所を4バイト後ろにずらしてから文字列を再び比較します。

スタックの参照場所(ecx+eax*4)も次の4文字を参照するように変更されます。

 

ではダンプ画面に戻り、比較する文字列を見てみましょう。

f:id:ibuninngu:20170930235027p:plain

ASCIIダンプに"g...ppinrtripowe"と書かれています。これを参照される順番に並び替えてみましょう。

"g   "
"ppin"
"rtri"
"powe"  >>> "powertripping"

 これで正しいパスワードが分かりました、早速リスタートしてパスワードを入力しましょう!

その前に"0x004010F2"辺りにブレークポイントを設定しておきましょう。これが無いとプログラムは一瞬で終了してしまいます。

f:id:ibuninngu:20170930235712p:plain

 

・クリア!

f:id:ibuninngu:20171001000129p:plain

今回のはちゃんとトレースができないとクリアできない問題だと思います。ただ、パスワードが入力された後の処理を追っていけば簡単にクリアできます。

これが出来たら一歩成長したということw初心者にとってブレイクスルーになるかもしれない問題でしたー