CrackMe 分析

0x00 流程分析


wKioL1RnUpOA2agTAACbsEdFa9Y771.jpg

wKiom1RnUiOSzlepAACJ5xm43F8170.jpg

wKioL1RnUpWyXiXAAAHzpU4p4b4357.jpg

wKiom1RnUiSxzDFFAAP0smRCtR8284.jpg

wKioL1RnUpbBRQa0AALvKF3HC_I099.jpg

wKioL1RnUpaxGTJ6AADR9o4VPZM275.jpg

wKiom1RnUiWDLxMDAADGwxxO_b8520.jpg

wKiom1RnUiXDBaW8AADXnYaRKFM029.jpg

wKioL1RnUpeRwsfuAAB1ewJiZ7Y358.jpg



提示输入帐号密码


图片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则 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


这样就过了。


你可能感兴趣的:(字符串,密码)