首页 > 代码库 > CrackMe 分析
CrackMe 分析
0x00 流程分析
提示输入帐号密码
图片2
回车后 提示 需要重新输入
载入OD
图片3
字符串搜索
找main函数
图片4
此时停在 00401060这里,是个
00401060 /$ 83EC 30 sub esp,0x30 //分配栈帧
00401063 |. 68 FC804000 push Crackme.004080FC ; input your name:
00401068 |. E8 6C020000 call Crackme.004012D9// printf
0040106D |. 8D4424 1C lea eax,dword ptr ss:[esp+0x1C]
00401071 |. 50 push eax
00401072 |. 68 F8804000 push Crackme.004080F8 ; %s
00401077 |. E8 46020000 call Crackme.004012C2
0040107C |. 68 E4804000 push Crackme.004080E4 ; input your pass:
00401081 |. E8 53020000 call Crackme.004012D9// scanf
00401086 |. 8D4C24 10 lea ecx,dword ptr ss:[esp+0x10]
0040108A |. 51 push ecx
0040108B |. 68 F8804000 push Crackme.004080F8 ; %s
00401090 |. E8 2D020000 call Crackme.004012C2 ; scanf()
00401095 |. 8D5424 18 lea edx,dword ptr ss:[esp+0x18] ; edx存放帐号地址
00401099 |. 8D4424 30 lea eax,dword ptr ss:[esp+0x30] ; eax存放密码地址
0040109D |. 52 push edx
0040109E |. 50 push eax
0040109F |. E8 5CFFFFFF call Crackme.00401000//call 参数为两个地址 edx eax
004010A4 |. 83C4 20 add esp,0x20// 平衡堆栈
004010A7 |. 84C0 test al,al//若al为0 则 zf = 1 则je成立
004010A9 |. 74 19 je XCrackme.004010C4 //这里会跳到一个提示try again
图片5
这里是提示正确or错误的地方
004010A9 |. /74 19 je XCrackme.004010C4
004010AB |. |68 D8804000 push Crackme.004080D8 ; good job!\n
004010B0 |. |E8 24020000 call Crackme.004012D9
004010B5 |. |68 C0804000 push Crackme.004080C0 ; the key is: md5(pass)
004010BA |. |E8 1A020000 call Crackme.004012D9
004010BF |. |83C4 08 add esp,0x8
004010C2 |. |EB 0D jmp XCrackme.004010D1
004010C4 |> \68 B4804000 push Crackme.004080B4 ; try again!
004010C9 |. E8 0B020000 call Crackme.004012D9
0x01 验证函数分析
入口点
0040109F |. E8 5CFFFFFF call Crackme.00401000 //验证函数
00401000 /$ 55 push ebp
00401001 |. 56 push esi
00401002 |. 8B7424 0C mov esi,dword ptr ss:[esp+0xC] ; 参数一
00401006 |. 57 push edi
00401007 |. 8BFE mov edi,esi
00401009 |. 83C9 FF or ecx,0xFFFFFFFF
0040100C |. 33C0 xor eax,eax
0040100E |. 8B5424 14 mov edx,dword ptr ss:[esp+0x14] ; 参数二
00401012 |. F2:AE repne scas byte ptr es:[edi] ; 长度
00401014 |. F7D1 not ecx
00401016 |. 49 dec ecx
00401017 |. 8BFA mov edi,edx ; edi存放密码地址
00401019 |. 8BE9 mov ebp,ecx ; ebp存放帐号长度
0040101B |. 83C9 FF or ecx,0xFFFFFFFF
0040101E |. F2:AE repne scas byte ptr es:[edi]
00401020 |. F7D1 not ecx
00401022 |. 49 dec ecx ; 密码长度
00401023 |. 3BE9 cmp ebp,ecx ; 长度比较
00401025 |. 74 06 je XCrackme.0040102D ; 长度相等继续 不等退出
00401027 |. 5F pop edi
00401028 |. 5E pop esi
00401029 |. 32C0 xor al,al
0040102B |. 5D pop ebp
0040102C |. C3 retn
0040102D |> 33C0 xor eax,eax
0040102F |. 85ED test ebp,ebp
00401031 |. 7E 19 jle XCrackme.0040104C
00401033 |. 53 push ebx
00401034 |. BF 30804000 mov edi,Crackme.00408030 ; 全局变量 使用edi存放数组首地址
00401039 |> 8A0F /mov cl,byte ptr ds:[edi] ; cl= [edi+eax]
0040103B |. 8A1C10 |mov bl,byte ptr ds:[eax+edx] ; bl=密码地址+eax
0040103E |. 32D9 |xor bl,cl ; 密码=密码xor 数组[eax]
00401040 |. 83C7 04 |add edi,0x4 ; 下一个元素
00401043 |. 881C10 |mov byte ptr ds:[eax+edx],bl
00401046 |. 40 |inc eax ; eax++
00401047 |. 3BC5 |cmp eax,ebp ; eax < strlen(密码)
00401049 |.^ 7C EE \jl XCrackme.00401039 ; eax < ebp
0040104B |. 5B pop ebx
0040104C |> 8BFA mov edi,edx
0040104E |. 8BCD mov ecx,ebp
00401050 |. 33D2 xor edx,edx
00401052 |. F3:A6 repe cmps byte ptr es:[edi],byte ptr ds:[esi]
00401054 |. 8BC2 mov eax,edx
00401056 |. 5F pop edi
00401057 |. 5E pop esi
00401058 |. 5D pop ebp
00401059 |. 0F94C0 sete al//相等 al = 1
0040105C \. C3 retn
加密用的table 值
图片6
首先判断帐号密码长度是否相等
图片7
若长度相等,则首先将 密码中的各个元素与 00408030处的数 xor 操作,得到当前密码,
然后将密码与帐号进行比较
图片8
esi存放的是帐号 edi为密码
sete zf = 1 则al = 1
图片9
这样就过了。
本文出自 “black4yL” 博客,请务必保留此出处http://black4yl.blog.51cto.com/4222963/1576976
CrackMe 分析