リバースエンジニアリングチャレンジ2009

REC2009に参加しましたー。

1問目:ランク外
2問目:2位
3問目:リタイア

でした!
翌日に予定が控えていたので、3問目は途中で諦めちゃいました。
せっかくなので、解いたところまで自分の解き方を書いてみます。
ネタバレ内容になるので、自力で解こうと持っている方は読まないでください。













1問目
OllyDbgで開く。
0040116E |. 83F8 65 CMP EAX,**
00401184 |. 83F8 5A CMP EAX,**
0040119A |. 83F8 38 CMP EAX,**
004011B0 |. 83F8 30 CMP EAX,**
004011E5 |. 68 28A14000 PUSH level1_b.0040A128 ; |Arg1 = 0040A128 ASCII "PASSWORD: %c%c%c%c
"

それっぽいマジックナンバーがあり、そのすぐ下の付近にはPASSWORD。
解析するまでもないっていうやつでした。終わり!
(本番では解析してたので凄く時間かかっちゃいました・・・)





2問目

  1. OllyDbgで開く。
  2. パックされてるげなので、とりあえずF9で実行する。
  3. ゲームオーバーになる。
  4. プログラムが終了する。
  5. OllyDbgで表示→level2を選択。
  6. Ctrl+Aでコードを分析。
  7. 検索→全ての参照文字列で、文字列を抽出。
  8. PASSWORD: %sの部分を見る。



生でパスワードが見えてるので、終わり。





3問目
解けていないのではっきりとは分かりませんが、7回デコードしないといけなさそうな感じ。


まず、encode6.bin。
Lhaplusで解凍すると、Perlのコードが出てくるので、中身を見ると
DESで暗号化していることが分かる。パスワードも書かれているので、複合化するだけ。


次はencode5.bin。
encode5 [input] [output]
で実行すると、inputが暗号化されてoutputが出てきますが、
何のファイルを入れてもWAVEファイルになって出てきます。
OllyDbg等で解析を行うと、



00401150 /$ 55 PUSH EBP ; ヘッダデータ生成


ここでWAVEヘッダを生成した後に、



00401207 /$ 55 PUSH EBP ; 読み込み・書き込み


ここで読み書きしていることが分かります。
更に見てみると、元のデータを1バイトずつ、上位4ビットと下位4ビットに分けて、
なんか生成したデータの間にはめ込んでいることが分かります。
(FFC3は2進で 1111111111000011、C3FFは 1100001111111111 であり、
後から0000の部分にはめ込んでいます。)


元データ:XXXXYYYY
なんかのデータ:AAAAAAAAAAAAAAAAとBBBBBBBBBBBBBBBB
生成データ:AAAAAAAAAAYYYYAA BBXXXXBBBBBBBBBB


更に、1バイトにつき0x100回分生成しているので、容量は元の容量の1024倍+ヘッダ分(0x2C)になります。


これに沿って、デコーダを作れば終わり。




次はencode4.bin。
64ビットの実行ファイルなので、OllyDbgで開けない・・・!
仕方ないので、PEBrowseで開くと、ちゃんと逆アセンブルが表示されます。


読み進めていくと、

  1. 0〜255の値を配列に格納。
  2. ランダムにSWAPしまくって、ぐちゃぐちゃにする。
  3. 入力ファイルを1バイトずつ読み込み、読み込んだ値番目の配列に入っているデータを出力。
  4. 最後にその配列を0x55でXORして出力


となっているので、ラスト0x100バイトを読み込んで、
0x55でXORして、それを元にデコードしてやればOK。







encode3.bin は、うまくARM環境を作れなくてお手上げ状態\(^o^)/
また時間が出来たらやってみたいと思います。


あくまでLevel3についてははっきりと解答が出ていない=答え合わせも出来ていないので、
間違っている可能性が大いにあります。参考程度にお願いします。