- 76 名前:デフォルトの名無しさん mailto:sage 54268741 [2006/12/09(土) 18:29:55 ]
- >>71に基本的に同意なので俺のアプローチ紹介しとく。
exeをデバッガに投げてコード眺めてたら文字列取得関数(lstrlenA)使ってるとこ(004013AF)がある。 これはクサい。という事で関数使ってるループの先頭(00401387)にブレーク仕掛けて適当な文字列入れて 実行してみる。するとブレーク時点で入力したpassを使ってる(BYTE PTR [EBP+EBX-100]が文字列部分)。 ここが判定部分でFA!ということでステップ実行でアルゴリズムを追う。どうやら文字列を1文字づつ読み込み 0x30〜0x39の範囲(ASCIIで'0'〜'9')ならその1文字を変数に格納し10倍(即ち1桁だけ桁上げ)している。 それを文字列の終端まで繰り返す。つまるところ"9247"という文字列が入力されたなら9247という 数字を作りだすアルゴリズムらしい(いわゆるatoiとかstrtol)。そうやって作りだした数値に0x58967452との xorを取って、その値が0x5BAA6717ならガッメッセージを出す。ここまでわかったら話は簡単。 X ^ 0x58967452 = 0x5BAA6717 を満たすXの10進表記の文字列が正解のPASSだ。 恥ずかしながら俺は論理演算に関する知識が乏しいのでXはコード書いてPCに走査してもらった。 int main(void){ int i; const int a = 0x58967452; const int b = 0x5BAA6717; for(i=0;i<0xFFFFFFFF;i++)if((i^a)==b)printf("%d",i); return 0; } こんな感じ。で、出てきたのがメル欄の数値。 アルゴリズムから考えて文字列に数値以外なら混ぜても大丈夫。 つまり「54df26fsa87sfa4f1」とかでも正解。
|

|