アセンブラいじってみる -crackme!-
暇で暇でしょうがない。じゃあ自分でcrackme作って遊んでみるかなーって。思って遊んでみた。
level0.exe
…って続くはずだったんだけどこれに似たものしか思いつかなかったww あとは暗号化&パスワードのハッシュを計算→計算済みの物比較っていうパスワードが分かる訳ないものぐらいしか。なんか頭が冴えない。
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こうなりますわな。
- scanf()呼んで
- 入力受け付けて
- その直後のCMPで4D2=1234と比較
- Zフラグがたってなければ、つまり入力が1234と同じであればジャンプしない
- ジャンプしなければ
- printf()でok出力
- RETN、つまり関数終了
- ジャンプするのであれば
- printf()でno出力
- RETN、つまり関数終了
…って続くはずだったんだけどこれに似たものしか思いつかなかったww あとは暗号化&パスワードのハッシュを計算→計算済みの物比較っていうパスワードが分かる訳ないものぐらいしか。なんか頭が冴えない。
コメント
コメントを投稿