リバースエンジニアリングチャレンジ過去問 2008 Level1

今年もリバースエンジニアリングチャレンジに挑戦しようと思う。
去年は二問目でハマってしまってやめちゃったので、過去問とか解いて準備しよう。
何気に一問目だけならランキング載ってるんだけどなぁ。



以下、最初のDWORDの値はVirtualAddress。


00401110:main関数の第一引数が3であることを確認。
第一引数なのでいわゆる「int argc」。
つまり、コマンドライン引数の個数。

00401132:その一個目の引数と「good luck」を文字列比較して、同じなら次へ。

0040113C:このcallで渡されるのは、コマンドライン引数の2番目の値。
つもり、これがキーになって答えが出てくる。

004010A0:ここから始まるループで、入力したキーとなる文字列を、1バイトずつビット反転。

004010B8:反転した各バイトを全て足しあわせた合計が、0x7B7であれば次へ。

004010CE:ここでcallされる関数で、反転したキーと、関数内部でスタックに積んだデータを比較する。
一致すると答えを出力するルーチンに行く。
つまり、この内部データを0xffでxorする(ビット反転する)ことで、正しいキーが得られる。
コンパイラの最適化なのか、出題者のいやがらせなのか、スタックに積まれる順番はキーの順ではないことに注意。


ここまで書いて気がついたけど、公式にすごく詳しい解法解説があるじゃないか……orz
なんてこったい。