对一个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#

浙公网安备 33010602011771号