首页
社区
课程
招聘
[旧帖] [分享]ISCLAB竞赛破解关的一点心得(附视频教程) 0.00雪花
发表于: 2012-1-13 14:31 1345

[旧帖] [分享]ISCLAB竞赛破解关的一点心得(附视频教程) 0.00雪花

2012-1-13 14:31
1345
希望斑竹给个邀请码。
第一关
题目:第一关相对简单,只需要填写注册码验证,得到正确的注册码即可过关,
如图1。
思路:用Peid查壳,Microsoft Visual C++ 6.0 [Overlay],将CrackMe载入
Ollyice,右键选择查找--所有参考字符串。进入文本字串参考,向上滚动,寻找
比较敏感的字符串,看到图2的地方。双击“加油”,回到反汇编窗口。向上滚动
一点,看到图3的位置,可以看出跳转向成功或失败的关键部分如下:
00401064   .  3945 F8       cmp     dword ptr [ebp-8], eax
00401067   .  0F85 40000000 jnz     004010AD
如果dword ptr [ebp-8]与 eax相等,则ZF标志位为1,就转向成功,否则为失败

对于CM程序通常需要单步调试一次,这样会对程序有较好的把握。刚入程序单步
时会进入死循环,按F4跳过,下面的就好说了,多试几次就好。
在00401064处按F2下断点。重新载入程序。直接运行,输入注册码,单击确定,
程序会停在下断点处即cmp比较的地方,如图四。注意此时寄存器的内容。
EAX=000007DB,而堆栈 ss:[0012F6FC]即dword ptr [ebp-8]=0000007B。这里7B
是十进制123,就是我输入的注册码。那么7DB就应该是真正的注册码。转换一下
,图4,真正的注册码是2011。
第二关
题目:一个注册机,界面如图5,题目要求是以2011为用户名得带正确的注册码。
思路:同样是个没有加壳的程序Microsoft Visual C++ 6.0 [Overlay],还是载
入Ollyice查找字符串参考,同样能达到目的,这是分析到后来发现的,crackme1
和crackme2竟然可以用同种方法破解,囧了。有图为证,如图6。
这里是我尝试时的另一种方法:函数断点法。利用的是Windows常用的一个的API
:MessageBoxA。也是比较简单的。程序载入到Ollyice后,在左下角命令行输入
BP MessageBoxA,或者右键--查找--当前模块中的名称(标签),如图7。找到
MessageBoxA,右键选择在每个参考上设置断点,如图8。这时按下Ctrl+F2重新载
入程序 ,按F9运行,输入2011和错误的注册码1234,程序自动停在断点处。断点
这里是马上就调用MessageBoxA了,表明程序已将用户名和注册码比较完毕,向上
翻一番,会发现下面区域:

00401460   .  83EC 64       sub     esp, 64
00401463   .  56            push    esi
00401464   .  8B7424 74     mov     esi, dword ptr [esp+74]
00401468   .  57            push    edi
00401469   .  8B7E 08       mov     edi, dword ptr [esi+8]
0040146C   .  57            push    edi
0040146D   .  E8 7EC00000   call    0040D4F0
00401472   .  83C4 04       add     esp, 4
00401475   .  85C0          test    eax, eax
00401477   .  74 10         je      short 00401489
00401479   .  8D4424 08     lea     eax, dword ptr [esp+8]
0040147D   .  50            push    eax
0040147E   .  56            push    esi
0040147F   .  E8 0CFFFFFF   call    00401390
00401484   .  83C4 08       add     esp, 8
00401487   .  EB 42         jmp     short 004014CB
00401489   >  81FF 04000080 cmp     edi, 80000004                    ;  
Switch (cases 80000002..80000004)
0040148F   .  75 04         jnz     short 00401495
00401491   .  8B0E          mov     ecx, dword ptr [esi]             ;  
Case 80000004 (SINGLE STEP) of switch 00401489
00401493   .  EB 3A         jmp     short 004014CF
00401495   >  81FF 02000080 cmp     edi, 80000002
0040149B   .  75 12         jnz     short 004014AF
0040149D   .  8B16          mov     edx, dword ptr [esi]             ;  
Case 80000002 (DATATYPE MISALIGNMENT) of switch 00401489
0040149F   .  8D4C24 08     lea     ecx, dword ptr [esp+8]
004014A3   .  51            push    ecx
004014A4   .  52            push    edx
004014A5   .  E8 269B0100   call    0041AFD0
004014AA   .  83C4 08       add     esp, 8
004014AD   .  EB 1C         jmp     short 004014CB
004014AF   >  81FF 03000080 cmp     edi, 80000003
004014B5   .  75 1C         jnz     short 004014D3
004014B7   .  8B4E 04       mov     ecx, dword ptr [esi+4]           ;  
Case 80000003 (BREAKPOINT) of switch 00401489
004014BA   .  8B16          mov     edx, dword ptr [esi]
004014BC   .  8D4424 08     lea     eax, dword ptr [esp+8]
004014C0   .  50            push    eax
004014C1   .  51            push    ecx
004014C2   .  52            push    edx
004014C3   .  E8 48940100   call    0041A910
004014C8   .  83C4 0C       add     esp, 0C
004014CB   >  8D4C24 08     lea     ecx, dword ptr [esp+8]
004014CF   >  85C9          test    ecx, ecx
004014D1   .  75 09         jnz     short 004014DC
004014D3   >  C64424 08 00  mov     byte ptr [esp+8], 0              ;  
Default case of switch 00401489
004014D8   .  8D4C24 08     lea     ecx, dword ptr [esp+8]
004014DC   >  8B46 20       mov     eax, dword ptr [esi+20]
004014DF   .  BA 30924700   mov     edx, 00479230
004014E4   .  85C0          test    eax, eax
004014E6   .  74 03         je      short 004014EB
004014E8   .  8B56 18       mov     edx, dword ptr [esi+18]
004014EB   >  8B46 0C       mov     eax, dword ptr [esi+C]
004014EE   .  8BF0          mov     esi, eax
004014F0   .  F7D6          not     esi
004014F2   .  81E6 00100000 and     esi, 1000
004014F8   .  8D0470        lea     eax, dword ptr [eax+esi*2]
004014FB   .  50            push    eax                              ;
/Style
004014FC   .  52            push    edx                              ;
|Title
004014FD   .  51            push    ecx                              ;
|Text
004014FE   .  6A 00         push    0                                ;
|hOwner = NULL
00401500   .  FF15 A0834600 call    near dword ptr [<&USER32.Message>;
\MessageBoxA

00401460 是该部分的头部,那就在此处按F2下断点。接下来的思路很好想,就是
找到哪里用到或说调用了00401460这里 。右键选择转到--没有发现什么调用。那
就换个思路,右键选择查找参考--选定命令。这样就进入XX窗口。
上面两个关于00401460 的调用相距较近,没什么区别,我就双击第一个。进入图
11的代码区域,关键代码如下:
00401064   .  3945 F8       cmp     dword ptr [ebp-8], eax
00401067   .  0F85 40000000 jnz     004010AD
0040106D   .  68 04000080   push    80000004
00401072   .  6A 00         push    0
00401074   .  68 519B4600   push    00469B51
00401079   .  68 01030080   push    80000301
0040107E   .  6A 00         push    0
00401080   .  68 40000000   push    40
00401085   .  68 04000080   push    80000004
0040108A   .  6A 00         push    0
0040108C   .  68 569B4600   push    00469B56
00401091   .  68 03000000   push    3
00401096   .  BB 60144000   mov     ebx, 00401460
0040109B   .  E8 51010000   call    004011F1
004010A0   .  83C4 28       add     esp, 28
004010A3   .  E9 40000000   jmp     004010E8
004010A8   .^ E9 60FFFFFF   jmp     0040100D
004010AD   >  68 04000080   push    80000004
004010B2   .  6A 00         push    0
004010B4   .  68 5F9B4600   push    00469B5F                         ;  
ASCII "加油"
此部分与CrackMe1部分是极相似的,也是在00401064处通过cmp比较dword ptr
[ebp-8]与eax。下面思路就明了,和第一关一样00401064按F2下断点。运行即可
。这个CRACKME2的算法分析可以找一下,就在上方的一个CALL调用里,黑帽朋友
有兴趣可以分析一下。
第三关
题目:这道题看起来和第一关很像,其实可不太一样。第三关的CrackMe运行如图
12。
思路:PEID查壳,一个强壳ASPack 2.x (without poly) -> Alexey
Solodovnikov [Overlay]。也就是说,第三关是一个检验脱壳能力的一关。至于
这个壳我试过很多遍,普通单步试图不脱壳破解最终只会陷入死循环里,一跳出
死循环就直接运行。所以只有解决掉壳才可以实现破解。正如问题所说,其实与
第一关可不太一样。
首先载入Ollyice,按下SHIFT+F9忽略所有异常进入程序。弹
出图14所示的对话框。说明这个壳有对程序代码进行压缩。这里还是选择否。终
于进入程序的汇编窗口。没别的好方法,只好单步走了,单步走几下会
有一个返回,代码如下:
00485010    5E              pop     esi
00485011    FF3432          push    dword ptr [edx+esi]
00485014    310424          xor     dword ptr [esp], eax
00485017    8F0432          pop     dword ptr [edx+esi]
0048501A    4E              dec     esi
0048501B    83EE 03         sub     esi, 3
0048501E  ^ 75 F1           jnz     short 00485011
00485020    16              push    ss
在00485020 按F4跳过,否则是走不完的死循环,呵呵。跳过后代码立即变了
00485020    E8 7D010000     call    004851A2
00485025    0000            add     byte ptr [eax], al
00485027    0000            add     byte ptr [eax], al
00485029    0040 00         add     byte ptr [eax], al

00485020处按F7跟进。(如果不跟进程序就会运行),来到了这片代码区域:
004851A2    55              push    ebp
004851A3    8BEC            mov     ebp, esp
004851A5    81C4 B4FEFFFF   add     esp, -14C
004851AB    C645 F7 00      mov     byte ptr [ebp-9], 0
004851AF    8BC5            mov     eax, ebp
004851B1    83C0 04         add     eax, 4
004851B4    8B10            mov     edx, dword ptr [eax]
004851B6    83EA 05         sub     edx, 5
004851B9    8955 FC         mov     dword ptr [ebp-4], edx
004851BC    8B4D FC         mov     ecx, dword ptr [ebp-4]
004851BF    81C1 84000000   add     ecx, 84
004851C5    894D F8         mov     dword ptr [ebp-8], ecx
004851C8    8B45 FC         mov     eax, dword ptr [ebp-4]
004851CB    8B50 0C         mov     edx, dword ptr [eax+C]
004851CE    8B4D FC         mov     ecx, dword ptr [ebp-4]
004851D1    0351 08         add     edx, dword ptr [ecx+8]
004851D4    8BC5            mov     eax, ebp
乍一看004851A2处很像是DELPHI入口点的特征码。但事实是这个壳不会这么容易
就可以脱掉的(可以试一下,不会成功的)。现在ESP寄存器已经变化了。这时用
ESP定律,在命令窗口输入hr 0012FFC0,并回车。如图16。按F9运行,第一次断
点停在004851B6    83EA 05         sub     edx, 5
很明显,这里不是。继续按一次F9。来到这里:
004851DB    FF75 F8         push    dword ptr [ebp-8]                ;
CrackMeP.004850A4
这里也不是,继续到达这里,这里有点眉目了,看此处的代码
00482001    60              pushad
00482002    E8 03000000     call    0048200A
00482007  - E9 EB045D45     jmp     45A524F7
0048200C    55              push    ebp
0048200D    C3              retn
0048200E    E8 01000000     call    00482014
看起来很像经典的ASPack,但事实是这里还没完呢(可以跳出来试一试)。继续
F9到达如图17的地方。单步走几下,经验告诉我们,快到OEP了,单步跟踪这里
0047F001    60              pushad
仍然没有到,要有耐心,嗯,再按几下,终于到了这里,如图18。
004012FC   /EB 10           jmp     short 0040130E
004012FE   |66:623A         bound   di, dword ptr [edx]
00401301   |43              inc     ebx
00401302   |2B2B            sub     ebp, dword ptr [ebx]
00401304   |48              dec     eax
00401305   |4F              dec     edi
00401306   |4F              dec     edi
00401307   |4B              dec     ebx
00401308   |90              nop
00401309  -|E9 98504600     jmp     008663A6
0040130E   \A1 8B504600     mov     eax, dword ptr [46508B]
00401313    C1E0 02         shl     eax, 2
00401316    A3 8F504600     mov     dword ptr [46508F], eax
004012FC这里就是OEP了,我想大家会问怎么知道这里是入口点。其实我也不确定
,只是凭感觉。即使不是也没关系,我们可以继续嘛。从这里DUMP出来,如图19
。脱壳后再用PEID查一下壳,如图20,Borland C++ 1999。这样再运行一下,正
常,脱壳完毕。至此,第三关的难点已经过去了。脱壳后的程序载入Ollyice,经
典的查找字符串如图21,很容易发现注册码就是a4d6sdsf3。想来出题者不想在这
里为难参赛者吧。注册一下,成功,
作为CrackMe,必定不止我提及的几种方法。更多的方法靠黑帽朋友发掘了。针对
三个CrackMe,我把我破解的过程录了下来,朋友们可以看一下。
下载地址:5adK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3c8D9i4K6u0W2k6r3u0S2L8X3E0Q4x3X3g2U0L8$3#2Q4x3V1k6U0x3r3k6D9z5o6W2T1x3Y4u0C8

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回