リバースエンジニアリングチャレンジ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問目
- OllyDbgで開く。
- パックされてるげなので、とりあえずF9で実行する。
- ゲームオーバーになる。
- プログラムが終了する。
- OllyDbgで表示→level2を選択。
- Ctrl+Aでコードを分析。
- 検索→全ての参照文字列で、文字列を抽出。
- 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で開くと、ちゃんと逆アセンブルが表示されます。
読み進めていくと、
- 0〜255の値を配列に格納。
- ランダムにSWAPしまくって、ぐちゃぐちゃにする。
- 入力ファイルを1バイトずつ読み込み、読み込んだ値番目の配列に入っているデータを出力。
- 最後にその配列を0x55でXORして出力
となっているので、ラスト0x100バイトを読み込んで、
0x55でXORして、それを元にデコードしてやればOK。
encode3.bin は、うまくARM環境を作れなくてお手上げ状態\(^o^)/
また時間が出来たらやってみたいと思います。
あくまでLevel3についてははっきりと解答が出ていない=答え合わせも出来ていないので、
間違っている可能性が大いにあります。参考程度にお願いします。