アセンブラいじってみる -crackme!-

暇で暇でしょうがない。じゃあ自分でcrackme作って遊んでみるかなーって。思って遊んでみた。

1. level0

パスワードを探り当ててください。
level0.exe




#include<stdio.h>
void main()
{
    int passwd=0;
    scanf("%d",&passwd);
    if(passwd == 1234)
        printf("ok\n");
    else
        printf("no\n");
}
これをOllyDbgでデバッグしてscanf()でブレークポイント引っ掛けてmain()をさがすと
PUSH EBP
MOV EBP,ESP
PUSH ECX
LEA EAX,DWORD PTR SS:[EBP-4]
PUSH EAX
PUSH OFFSET crackme_.??_C@_02DPKJAMEF@?$>; /format = "%d"
MOV DWORD PTR SS:[EBP-4],0               ; |
CALL DWORD PTR DS:[<&MSVCR100.scanf>]    ; \scanf
ADD ESP,8
CMP DWORD PTR SS:[EBP-4],4D2
JNZ SHORT crackme_.00F9103A
PUSH OFFSET crackme_.??_C@_02MFDMBIJM@ok>; /format = "ok"
CALL DWORD PTR DS:[<&MSVCR100.printf>]   ; \printf
ADD ESP,4
XOR EAX,EAX
MOV ESP,EBP
POP EBP
RETN
PUSH OFFSET crackme_.??_C@_02KAJCLHKP@no>; /format = "no"
CALL DWORD PTR DS:[<&MSVCR100.printf>]   ; \printf
ADD ESP,4
XOR EAX,EAX
MOV ESP,EBP
POP EBP
こうなりますわな。
  1. scanf()呼んで
  2. 入力受け付けて
  3. その直後のCMPで4D2=1234と比較
  4. Zフラグがたってなければ、つまり入力が1234と同じであればジャンプしない
    • ジャンプしなければ
      1. printf()でok出力
      2. RETN、つまり関数終了
    • ジャンプするのであれば
      1. printf()でno出力
      2. RETN、つまり関数終了
って手順になってるのでパスワードは1234。うん、簡単すぎて面白くない。

…って続くはずだったんだけどこれに似たものしか思いつかなかったww あとは暗号化&パスワードのハッシュを計算→計算済みの物比較っていうパスワードが分かる訳ないものぐらいしか。なんか頭が冴えない。

コメント

このブログの人気の投稿

[Win]Xboxコントローラーのバッテリ残量確認と電源を切るツールXControllerTool

UWPアプリでSuicaの履歴を複数件読みだす方法