对一个crackme的简单爆破分析①

 

 

刚开始的摸索过程就不多写了。。。 
我最后是下的这个断:BP GetWindowTextA 。  然后运行, 停在这儿~

 1 75FCFB86 >  6A 08           push 0x8
 2 75FCFB88    68 F0FBFC75     push USER32.75FCFBF0
 3 75FCFB8D    E8 9365FFFF     call USER32.75FC6125
 4 75FCFB92    8B5D 0C         mov ebx,dword ptr ss:[ebp+0xC]
 5 75FCFB95    33C0            xor eax,eax
 6 75FCFB97    3BD8            cmp ebx,eax
 7 75FCFB99    0F84 43020000   je USER32.75FCFDE2
 8 75FCFB9F    3945 10         cmp dword ptr ss:[ebp+0x10],eax
 9 75FCFBA2    0F84 3A020000   je USER32.75FCFDE2
10 75FCFBA8    8945 FC         mov dword ptr ss:[ebp-0x4],eax
11 75FCFBAB    8803            mov byte ptr ds:[ebx],al
12 75FCFBAD    8B4D 08         mov ecx,dword ptr ss:[ebp+0x8]
13 75FCFBB0    E8 506BFFFF     call USER32.75FC6705
14 75FCFBB5    8BF0            mov esi,eax
15 75FCFBB7    8BFA            mov edi,edx

 

这是系统领空,我们ALT+F9返回到程序领空~

 1 00409E61  |.  90            nop
 2 00409E62  |.  90            nop
 3 00409E63  |.  90            nop
 4 00409E64  |.  90            nop
 5 00409E65  |.  3965 F0       cmp [local.4],esp
 6 00409E68  |.  74 0D         je XCM.00409E77
 7 00409E6A  |.  68 06000000   push 0x6
 8 00409E6F  |.  E8 74730000   call CM.004111E8
 9 00409E74  |.  83C4 04       add esp,0x4
10 00409E77  |>  8B45 F8       mov eax,[local.2]
11 00409E7A  |.  85C0          test eax,eax
12 00409E7C  |.  74 15         je XCM.00409E93
13 00409E7E  |.  50            push eax
14 00409E7F  |.  8BD8          mov ebx,eax

到了00409E61这儿了,这个时候怎么办呢?  我们就慢慢滴F8单步跟吧~ 在跟的时候每步过一个call就看下内存窗口里面。 不着急,么么哒~

跟到0040147E这儿之后~

1 00401478   .  50            push eax
2 00401479   .  E8 97020000   call CM.00401715  //步过这个call之后
3 0040147E   .  8945 F4       mov dword ptr ss:[ebp-0xC],eax
4 00401481   .  8B5D F8       mov ebx,dword ptr ss:[ebp-0x8]
5 00401484   .  85DB          test ebx,ebx

在右下角窗口发现了新大陆啊~

0018D53C   0018D5C2  ASCII "1F05EF25202D069B8EC6083CFF876E12CCD0062679A27B2190792E8E2282FB35F0F20DFDB6BBC82C98686EA27C2A8C2DE2E201C1C5E5B5ED9C9C0F43D00A10A70A019AF84ED596BE61100008788D5E4D03603783943F70149D91F7A7388A5CAB95E637FECEACA6DAF95023F002F11E6A34A379D8173FA"...

0018D540   004139D1  CM.004139D1  //这个信息很重要啊

0018D544   0018D5C2  ASCII 
"1F05EF25202D069B8EC6083CFF876E12CCD0062679A27B2190792E8E2282FB35F0F20DFDB6BBC82C98686EA27C2A8C2DE2E201C1C5E5B5ED9C9C0F43D00A10A70A019AF84ED596BE61100008788D5E4D03603783943F70149D91F7A7388A5CAB95E637FECEACA6DAF95023F002F11E6A34A379D8173FA"...
0018D548   0018D56C  ASCII "eb557f3f4abdcf6c23f85f268aa7b8c6"


那我们重载CM,直接ctrl+G跟 004139D1 过去瞅瞅吧,么么哒~

 

 1 004139BE   > /4D            dec ebp
 2 004139BF   . |48            dec eax
 3 004139C0   . |C645 00 30    mov byte ptr ss:[ebp],0x30
 4 004139C4   .^\75 F8         jnz XCM.004139BE
 5 004139C6   >  8D4424 20     lea eax,dword ptr ss:[esp+0x20]
 6 004139CA   .  50            push eax
 7 004139CB   .  55            push ebp
 8 004139CC   .  E8 6F060100   call CM.00424040                       ;  关键call
 9 004139D1   .  8B8C24 502000>mov ecx,dword ptr ss:[esp+0x2050]       ;  到这儿了、
10 004139D8   .  83C4 08       add esp,0x8
11 004139DB   .  F7D8          neg eax
12 004139DD      1BC0          sbb eax,eax

上面有个call~  call执行之后出现了很敏感的信息啊~  那么这个call可能就是我们的关键call了。 而且,大家还可以发现,这个call执行完之后,没几步就retn了~  所以大胆的猜想这个call就是关键call~  下断吧!

重新运行程序。断在这个call之后,我们F7进去

 1 00424040  /$  55            push ebp
 2 00424041  |.  8BEC          mov ebp,esp
 3 00424043  |.  57            push edi
 4 00424044  |.  56            push esi
 5 00424045  |.  53            push ebx
 6 00424046  |.  8B75 0C       mov esi,[arg.2]
 7 00424049  |.  8B7D 08       mov edi,[arg.1]
 8 0042404C  |.  8D05 1CFE4200 lea eax,dword ptr ds:[0x42FE1C]
 9 00424052  |.  8378 08 00    cmp dword ptr ds:[eax+0x8],0x0
10 00424056  |.  75 3B         jnz XCM.00424093

这是入口~    我们继续F8单步跟吧   不着急,刚走几步就看到下面了~

0042404C  |.  8D05 1CFE4200 lea eax,dword ptr ds:[0x42FE1C]
00424052  |.  8378 08 00    cmp dword ptr ds:[eax+0x8],0x0           ;  控制循环的一个比较
00424056  |.  75 3B         jnz XCM.00424093                         ;  跳1
00424058  |.  B0 FF         mov al,0xFF
0042405A  |.  8BFF          mov edi,edi
0042405C  |>  0AC0          /or al,al
0042405E  |.  74 2E         |je XCM.0042408E                         ;  跳2
00424060  |.  8A06          |mov al,byte ptr ds:[esi]
00424062  |.  46            |inc esi
00424063  |.  8A27          |mov ah,byte ptr ds:[edi]
00424065  |.  47            |inc edi
00424066  |.  38C4          |cmp ah,al
00424068  |.^ 74 F2         |je XCM.0042405C                         ;  显然是个循环   跳3
0042406A  |.  2C 41         |sub al,0x41
0042406C  |.  3C 1A         |cmp al,0x1A
0042406E  |.  1AC9          |sbb cl,cl

很明显了,这儿这三个跳就是核心了。。。

那我们就下好断吧,这下子就可以试验了~

1 EAX 0042FE65 CM.0042FE65
2 ECX 00000100
3 EDX 00000003
4 EBX 00000000
5 ESP 0733DE5C
6 EBP 0733DE68
7 ESI 0733DE99 ASCII "b557f3f4abdcf6c23f85f268aa7b8c6"
8 EDI 0733DEEE ASCII "1F05EF25202D069B8EC6083CFF876E12CCD0062679A27B2190792E8E2282FB35F0F20DFDB6BBC82C98686EA27C2A8C2DE2E201C1C5E5B5ED9C9C0F43D00A10A70A019AF84ED596BE61100008788D5E4D03603783943F70149D91F7A7388A5CAB95E637FECEACA6DAF95023F002F11E6A34A379D81

这个时候我们就发现原来是把eb557f3f4abdcf6c23f85f268aa7b8c6和下面那一长串依次比较哇~  么么哒。

继续走吧~

1 00424060  |.  8A06          |mov al,byte ptr ds:[esi]
2 00424062  |.  46            |inc esi
3 00424063  |.  8A27          |mov ah,byte ptr ds:[edi]
4 00424065  |.  47            |inc edi
5 00424066  |.  38C4          |cmp ah,al
6 00424068  |.^ 74 F2         |je XCM.0042405C                         ;  显然是个循环   跳3
7 0042406A  |.  2C 41         |sub al,0x41
8 0042406C  |.  3C 1A         |cmp al,0x1A
9 0042406E  |.  1AC9          |sbb cl,cl

走到这个跳之后,这个跳没有实现,说明循环进行不下去了,我们下好断F9试试~

发现直接失败了,么么哒~  失败了。 重载,运行来到这个跳,这个跳是死亡跳哦  。。

我们改下吧 

00424068    ^\74 F2         je XCM.0042405C  修改为 
00424068    ^\75 F2         jnz CM.0042405C

然后我们运行下试试看呗 ~  么么哒!

F9直接运行,ok

成功了~  么么哒 ~!~

保存,收工!

ps:最后发现,只要最后返回的eax==0,就成功~ 所以还可以将

 1 004139BE   > /4D            dec ebp
 2 004139BF   . |48            dec eax
 3 004139C0   . |C645 00 30    mov byte ptr ss:[ebp],0x30
 4 004139C4   .^\75 F8         jnz XCM.004139BE
 5 004139C6   >  8D4424 20     lea eax,dword ptr ss:[esp+0x20]
 6 004139CA   .  50            push eax
 7 004139CB   .  55            push ebp
 8 004139CC   .  E8 6F060100   call CM.00424040                       ;  关键call
 9 004139D1   .  8B8C24 502000>mov ecx,dword ptr ss:[esp+0x2050]  //到这儿了、
10 004139D8   .  83C4 08       add esp,0x8
11 004139DB   .  F7D8          neg eax
12 004139DD      1BC0          sbb eax,eax  

这一段中004139DD      1BC0          sbb eax,eax   改成   xor eax,eax   同样可以实现爆破~

 

附上CM的下载地址:http://115.com/file/an8fugzi#


 

 

 

posted @ 2012-06-12 18:41  丶结灬局  阅读(196)  评论(0)    收藏  举报