Puzzle:[HackThisSite! 攻略 Application編]

リバースエンジニアリングに関する問題。残念ながら4問目からはWindows専用となっている。

使用したソフトは一番下にまとめた。

Challenge 1

パスワードを見つける問題。起動するとダイアログが現れる。適当に入れてボタンを押すと、 Invalid Password と怒られる。

WindowsAPIで文字列を比較しているのだろうか。Stirlingで調べると、CompareStringが見つかる.

OllyDbgで開いて、検索>ラベル名、からCompareStringを探し、ブレイクポイントを設置する。

すると、スタック上にシリアルナンバーが見つかる。

Challenge 2

これも正しいパスワードを探す問題。どこかへ接続しにいっている。

まずは送受信パケットを覗いてみる。すると、パスワードらしきものが見つかる。

Challenge 3

Challenge 2と同様にどこかへ接続しようとしている。WinDumpで調べると、

http://hackthissite.org
  /application/app3/snauthenticate.php

ためしに表示させてみるとfalseと返ってくる。

StirlingでApp3win.exeを開いてみると、falseの近くにtrueの文字と認証失敗時と 成功時のメッセージが見つかる。受信した文字 (true or false) と比較しているのかな?

認証成功メッセージの近くのtrueをfalseに書き換えて成功。

Challenge 4

ころころ状態が変わるボタンを押す問題。なんか妙にいらいらする。

[Click Me] ボタンはマウスが乗ると無効状態に変わるので、ボタンに直接、クリックのメッセージを送ればいい。

  1. FindWindowでApp4winのウィンドウハンドルを得る
  2. EnumChildWindowsでボタンを含む子ウィンドウハンドルを得る
  3. GetWindowLong(hwind, GWL_STYLE)でウィンドウの状態を得る
  4. GetWindowTextで表示文字を得る
  5. 状態が有効(WS_DISABLED がたってない)かつ"Click Me"と表示されているなら
  6. SendMessage(hwind, BM_CLICK, 0, 0)を送る
BM_CLICK
コマンドボタンに送ると、WM_LBUTTONDOWNとWM_LBUTTONUPを受け取る。 親ウィンドウに BN_CLICKを送る。アクティブでないときは失敗する。 [MSDN BM_CLICK Message]

Challenge 5-7

コマンドラインのApp. 忘れた(´ω`)

Challenge 8

正しい7つの数字を押せとのこと。でも結局必要ないのだけれど。

まず、OllyDbgで開いてみると、UNICODE文字列の"Correct!"が見つかる。 正しい数字を入れるとここに跳ぶのだろう。

次に、"Correct!"を参照しているところへ移動し、"Correct!"へ通じてい る(もしくは回避している)ジャンプを探す。

ジャンプを書き換えて "Correct!"へ導く。

Challenge 9

3つのボタンの音程を[Play]の3つの音程にあわせたい。

まず、OllyDbgで開いて参照文字列を眺める。UNICODE文字列に怪しい3つ組の数字が見つかる。 これが音程かな?ためしに書き換えてみるとボタンの音程が変わる。

他にも数字が見つかる。いくつか試してみると、[Play]の音程と同じものがあるのが分かる。 左から順に3つとも合わせる。

Challenge 10

相変わらず、パスワードは関係ない。適当なパスワードを入れて[Proceed]を押すと、

Error-266
Error: 404 object(pwd); not found!

というエラーメッセージが出る。OllyDbgで開き、エラーメッセージとその参照元を探す。

参照元に通じているジャンプは一つしかない。ジャンプ元を辿ると、他にも2つのジャンプが並んでいる。

ためしに他のジャンプ先を見てみる。一番上のジャンプ先で文字列を作っているようなので、 エラーメッセージのジャンプを一番上のジャンプ先アドレスに書き換える。

Challenge 11

OllyDbgで開いても、"Your looking in the wrong place..."とか言われる(´・ω・`)

Forum 曰く、「VbReformerを使えば一発さ!(訳)」

でも、VbReformer使えないし...

さらに読むと、どうやら絵の中に隠されているらしい。ねこまんまで取り出せるかな?

JPEGが一つ取り出せた。JPEGを開くとパスワードが見つかる。

Challenge 12

他のものより少しタフな問題。

適当に入力してボタンを押すと、 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/ですぐに見つかる。

Challenge 13

これまでの12問とはアプローチ方法が大きく違うみたい。アンパック(? して解けないかな。

実行時間の比較から解く方法があるみたい。

まだ、解けていない。

Challenge 14

.NET Frameworkアプリケーションを解く問題。Reflectorで調べてみると、レジストリを使ってvalidかどうか見ているらしい。regeditでHKEY_CURRENT_USERを探すと、validキーが見つかる。この値を0から1に変えてValidateボタンを押すと、パスワードが手に入る。

使用ソフト

Stirling
構造体編集やファイル比較など使いやすい機能がそろっている。
OllyDbg
定番。コメントできるほど使えていない。
listexp
偽者のDLL を作る際の面倒な仕事(関数名の調査、共通なテンプレートの作成など)を肩代わり。
パケット・マニア
パケットモニターではじめに引っかかったもの。シェアウェア。
スペシャルねこまんま57号
とても多機能なデバッガ兼プロセスメモリエディタ。
vbde
VB用 逆コンパイラ。フォームとイベントの整理程度だが、便利。
戻る

2007-03-23 公開 2007-08-30 更新 Copyright(C) 2007 tar0t All rights reserved.