NetAgent Security Contest 2010 参戦記
11/27-11/28に開催されたNetAgent Security Contest 2010に参加しました。問題は8問出題され、私に解けたのは1,3,6,7番の問題です。各問題について私がどのように解いたかを書こうと思います。
Level 1 (Activation)
使用したツール: OllyDbg
2010年8月14日に起動させると表示されるパスワードを求めよ、というのが問題。まずは普通にOllyDbgで開く。MessageBoxを呼び出しているところの近くでGetSystemTime関数の呼び出しを発見した。呼び出しまで実行して返されたSYSTEMTIME構造体を2010年8月14日になるよう書き換えた。
Level 3 (Crypto)
使用したツール: Reflector, Visual C++
この問題が一番面白かった。問題はC++製のDLLを呼び出しているC#製のプログラムで暗号化したファイルを復号化せよ、というもの。ReflectorでC#製のプログラムを開くと暗号化処理が普通に見える。問題文で暗号化の鍵は示されているが復号化には別の鍵が必要となる。平文1バイトと鍵から暗号化結果が一意に定まるのでそのテーブルを作って復号化する。以下にソースを記す。
int main() { unsigned int g_n = 13511; unsigned int g_e = 2645; unsigned int numArray; unsigned int num3; unsigned int temp; unsigned char *table; FILE *fp; FILE *out; table = calloc(0x10000, 1); for (num3 = 0; num3 < 0x100; num3++) { fnCrypt_cp(1, &numArray, &num3, g_n, g_e); table[numArray] = num3; } fp = fopen("password", "rb"); out = fopen("decrypted", "wb"); while (fread(&temp, 1, 4, fp)) { fwrite(&(table[temp]), 1, 1, out); } fclose(out); fclose(fp); free(table); return 0; }
Level 6 (UnPack EXE)
使用したツール: うさみみハリケーン
Phant0mでデバッガーチェックを無効化してもOllyDbgで開けなかったので、別のやり方で取りかかることにした。うさみみハリケーンを使ってゲーム改造の要領で勝利数が格納されているアドレスをいくつかに絞り込んだあと10000を超えるように書き換えるとパスワードが表示された。一応解けたからいいが、正攻法ではどのように解くのか気になる。
Level 7 (JavaScript)
使用したツール: Firebug
どこからも参照されていない変数Answer
に入る値を求めよ、というのが問題。zipを開くと難読化されたJavaScirptを含んだ.htmlファイルが一つあった。JavaScriptの難読化では最終的にevalしていることが多いので、まず以下のJavaScirptを挿入してevalをフックした。呼び出されるとFirebugのConsoleに引数が出力されるはずだ。
var hook = (function(hooked, hooking) { return (function(arg) { hooking(arg); return hooked(arg); }); }); window.eval = hook(window.eval, console.log);
goボタンを押してみてもFirebugのConsoleには何も表示されなかったのでevalは使用されていないことが分かる。
難読化されたJavaScriptを眺めていると何か見覚えがある。調べてみたらjjencodeの出力結果と類似している。解説のPowerPointによると、jjencodeではNumber.constructor
でeval相当のことをしているようなので、ものは試しとこれもフックしてみる。
// hook関数は上で書いたので省略する window.Number.constructor = hook(window.Number.constructor, console.log);
goボタンを押すとConsoleにいくつか出力された。中でも以下が注意を引く。
var s="$=/p..D/.exec(window.Na['Pwd']);"; alert(s); var Answer=s.replace(/\W/g,"");
"$=/p..D/.exec(window.Na['Pwd']);".replace(/\W/g,"")
を実行して出力された結果を入力してみると「solved!」と表示された。どうやらこれが正解だったようだ。
感想
様々な種類の問題が出題され、とても楽しめました。ただ、フォレンジック系の問題に全く手が出なかったのが残念です。使うツールから分からない状態なので模範解答に期待します。