2011/06/22

EnigmaGroupのSoftware Cracking 9

最近EnigmaGroupのcrackmeとかやってます。
このサイトはHack This Site!とかHellBound Hackersみたいな感じに、
ミッションをクリアするたびにポイントがたまってランク付けされます。

最初は確かBasic SkillsのPrerequisitesってところの3つをクリアしてからじゃないと
他のミッションにチャレンジできない仕様だったと思います。
これは注意書き読めば誰でもできるような簡単なやつでした。

私はほとんどSoftware Crackingってカテゴリのしかやってないんですけど
1~14までレベルがあって、今回紹介するのはレベル9の話です


レベル9は、入力したパスワードがそのままこのレベルの答えになるってことなので、
レベル8までみたいに条件付きJMP命令を書き換えるだけではできません。
成功と失敗が分かれる条件分岐の所を見ると、ある値と0x146942を比べて同じなら成功となります。
それを手がかりにいろいろ調べてくとこんな処理を見つけました。


入力された文字をループで1文字づつ処理してる途中です。
memch関数の第2引数に現在の文字(この場合は数字の文字)、第3引数には0xAが渡されてます。
memch関数ってのはMSDNによると、
void *memchr(
   const void *buf,
   int c,
   size_t count
);

第1引数のbufには"0123456789"というASCII文字のポインタが入ってるんで、
つまり数字の文字を数字に変換するみたいなことをしてるんですね。


[前回のループのときに計算した値] * 0xA + [今回出てきた数字]
というのを計算してるようです。

最終的に0x146942になるのを探すってことは
自分でプログラムつくって総当りかな~と思って、pythonで書いて

def calc_key(password):
    x = 0
    for c in password:
        x = x * 0xA + int(c)
    return x
総当りのメイン関数作る前に試しに"1234567"とか渡して実行してみました。

>>> calc_key("1234567")
1234567

あれ?おっかしいなーそのまま返ってきちゃった、とコード見直してからやっと気づきましたw
0xA倍すなわち10倍して次の数を足すってことは、
10進法で考えれば一桁繰り上げて次の数を元の数があった桁に入れてるのと同じです。

結局は0x146942を10進法に直した1337666が答えでした。
成功失敗の条件分岐の所で0x146942と比べてる16進数を10進数に直して考えてれば、
入力したパスワードと同じだってすぐわかったんでしょうけど

Prerequisites3つとSoftware Crackingのレベル9までやって
今のところ2230ポイントで388位です。

0 件のコメント:

コメントを投稿