千家信息网

CrackMe 分析

发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,0x00 流程分析提示输入帐号密码图片2回车后 提示 需要重新输入载入OD图片3字符串搜索找main函数图片4此时停在 00401060这里,是个00401060 /$ 83EC 30 sub esp
千家信息网最后更新 2025年01月20日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//al0 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


这样就过了。


0