リバースエンジニアリングに関する問題。残念ながら4問目からはWindows専用となっている。
使用したソフトは一番下にまとめた。
パスワードを見つける問題。起動するとダイアログが現れる。適当に入れてボタンを押すと、 Invalid Password と怒られる。
WindowsAPIで文字列を比較しているのだろうか。Stirlingで調べると、CompareStringが見つかる.
OllyDbgで開いて、検索>ラベル名、からCompareStringを探し、ブレイクポイントを設置する。
すると、スタック上にシリアルナンバーが見つかる。
これも正しいパスワードを探す問題。どこかへ接続しにいっている。
まずは送受信パケットを覗いてみる。すると、パスワードらしきものが見つかる。
Challenge 2と同様にどこかへ接続しようとしている。WinDumpで調べると、
http://hackthissite.org /application/app3/snauthenticate.php
ためしに表示させてみるとfalseと返ってくる。
StirlingでApp3win.exeを開いてみると、falseの近くにtrueの文字と認証失敗時と 成功時のメッセージが見つかる。受信した文字 (true or false) と比較しているのかな?
認証成功メッセージの近くのtrueをfalseに書き換えて成功。
ころころ状態が変わるボタンを押す問題。なんか妙にいらいらする。
[Click Me] ボタンはマウスが乗ると無効状態に変わるので、ボタンに直接、クリックのメッセージを送ればいい。
コマンドラインのApp. 忘れた(´ω`)
正しい7つの数字を押せとのこと。でも結局必要ないのだけれど。
まず、OllyDbgで開いてみると、UNICODE文字列の"Correct!"が見つかる。 正しい数字を入れるとここに跳ぶのだろう。
次に、"Correct!"を参照しているところへ移動し、"Correct!"へ通じてい る(もしくは回避している)ジャンプを探す。
ジャンプを書き換えて "Correct!"へ導く。
3つのボタンの音程を[Play]の3つの音程にあわせたい。
まず、OllyDbgで開いて参照文字列を眺める。UNICODE文字列に怪しい3つ組の数字が見つかる。 これが音程かな?ためしに書き換えてみるとボタンの音程が変わる。
他にも数字が見つかる。いくつか試してみると、[Play]の音程と同じものがあるのが分かる。 左から順に3つとも合わせる。
相変わらず、パスワードは関係ない。適当なパスワードを入れて[Proceed]を押すと、
Error-266 Error: 404 object(pwd); not found!
というエラーメッセージが出る。OllyDbgで開き、エラーメッセージとその参照元を探す。
参照元に通じているジャンプは一つしかない。ジャンプ元を辿ると、他にも2つのジャンプが並んでいる。
ためしに他のジャンプ先を見てみる。一番上のジャンプ先で文字列を作っているようなので、 エラーメッセージのジャンプを一番上のジャンプ先アドレスに書き換える。
OllyDbgで開いても、"Your looking in the wrong place..."とか言われる(´・ω・`)
Forum 曰く、「VbReformerを使えば一発さ!(訳)」
でも、VbReformer使えないし...
さらに読むと、どうやら絵の中に隠されているらしい。ねこまんまで取り出せるかな?
JPEGが一つ取り出せた。JPEGを開くとパスワードが見つかる。
他のものより少しタフな問題。
適当に入力してボタンを押すと、 Statusが"Verifying Password"という文字列に変わって、時間の経過とともに 少しずつ変化する。最後に"Password is Incorrect."で止まる。
VisualBasicで作られているので、逆コンパイラVBDEでFormとイベントを整理する。
Command1_Click(addr:006A70)、Timer1_Timer(addr:007100)あたりを眺めてみる。 Command1はTimerのスタート、Timer1は"Verifying Password"の変化だけのようだ。
しかし、"Password is Incorrect."だけ、上の2箇所にも参照文字列にも見つからない。 どこかで作っているのだろうか。Timer2_Timer (addr:007410) を覗いてみると、文字列を作ってそうな処理が見つかる。さらにジャンプ命令を探してみると、上から3つくらい見つかる。
上から順につぶしてみると、3つ目のジャンプでメッセージが"Password is Incorrect."から変わる。
このジャンプはVarTstEqの結果で分岐している。このときスタックに乗っているのは、VarCatの戻り値(EAX)。
VarCatもVarTstEqもVar*という関数だから、引数はバリアント型のはず。バリアント型の値は最後の8byteにある。 [MSDN Dr. GUI Online]
EAXで指示されたアドレスの8byte 後ろを見てみると、"Cr p r"という文字列が見つかる。
しかし、そのままではapp12win.exeもHTSのサイトも受け付けてくれない。
そういえば、VBDEで調べたなかに、"The password is a real word."というのがあった。
しかし、"real word"もパスワードではない。
再びForumに頼ると、英語の単語から探すのだという。なるほど、"real word"は実際の単語という意味らしい。
Wikipediaの英単語票 から/^Cr[a-z][a-z]p[a-z]r/ですぐに見つかる。
これまでの12問とはアプローチ方法が大きく違うみたい。アンパック(? して解けないかな。
実行時間の比較から解く方法があるみたい。
まだ、解けていない。
.NET Frameworkアプリケーションを解く問題。Reflectorで調べてみると、レジストリを使ってvalidかどうか見ているらしい。regeditでHKEY_CURRENT_USERを探すと、validキーが見つかる。この値を0から1に変えてValidateボタンを押すと、パスワードが手に入る。