level1.bin: Windows exe VC上で逆アセンブルすると引数二つが必要であることがわかる. こんな感じ. x = argv[1]; y = argv[2]; if (x == "good luck") { z = NOT y; // yの各要素について if (Σz[i] == CONST1) { if (z == CONST2) { put (y[i] + 1); } } } というわけで,CONST2のnotを求めてそれをyとする. level2.bin: Windows exe x = arv[1] の先頭4文字; if (MD5(NOT x) ^ 0x86 == CONST1) { put f(x); } というわけで,CONST1 ^ 0x86になる4byteのMD5を逆算する. ここで失敗.入力値xがprintableと仮定して探索して見つからず, #だってコマンドラインの引数だし. えんえんと逆アセンブルが間違ってないかを確認するはめに. かと言って全数探索は時間が掛かりすぎるし…(@P4D). 別のマシン(Core2Duo)で少しずつ探索範囲を大きくして漸く発見. コマンドラインで渡せないのでデバッガ上で入力. 最初から速いマシンでやればよかった. level3.bin: 最初level1, level2と同様にEXEにリネームして実行して落ちた. stage1 Linux elf これは簡単. if (argv[1] == "level3 start") { put msg1; } msg1はtarファイルだった.展開すると二つのファイル. 片方は.NET exe, もう片方は不明. stage2 .NETの逆アセンブル.しかし肝心なところが表示されない. 起動するとGUIダイアログがでてIDとパスワード入力待ち. 適当な値を入れても何も起こらない.ひとまず退散. 気を取り直してprocessMonitorで見ながら実行. "Dlevel3.zip"という存在しないファイルを開こうとしていた. stage1で出来たもう一つのファイルをDlevel3.zipにリネームして 再度適当な値を入れるとDlevel3cというファイルが出来た. 中身はぐちゃぐちゃ. Dlevel3.zipを0で埋めて,IDとパスワードと適当に変えつつ 出力されるDlevel3cを観察.どうやら何か4byteの値を生成して inputとxorしている模様.微妙に線型なんだがところどころ非線形 なためアルゴリズムを推測できず. そもそもinputもoutputも分からないのでどうしようもない. ふと,なんでDlevel3.zipにリネームさせたのかと思ってoutputの先頭が zipのヘッダになるようにxorの値を求めて自分のプログラムでDlevel3.zip をxorしてみたら,本当のzipファイルになった. zipを展開するとlevel3.classともうひとつのファイルが出来た. stage3 今度はJavaかよ〜と思いつつJava SDKをダウンロードしてインストール(泥縄). Javaの逆アセンブルは初めてだなあ.ざっとみてある値をkeyとするDES 処理っぽかったので手元のツールでやってみたらあっさり復号できた. stage4 elfに戻ってきた.逆アセンブルしても何もせずにすぐ終わる関数を 呼び出して終わり.引数無し.しかし,その付近に何かしてそうな関数が あったのでそちらを呼ぶように変更&実行.標準出力に何やら出力される. パスワードが書かれたPNG画像だった. level4.bin: ARM用objdumpでみるとblowfish関係っぽいけどそれ以上は未調査. 実家のZaurusかWindowsCE機があればもうちょい挑戦したんだけどなあ.