首页
社区
课程
招聘
[旧帖] [原创]爆破Crackme_S.rar_079 0.00雪花
发表于: 2016-1-17 19:59 1675

[旧帖] [原创]爆破Crackme_S.rar_079 0.00雪花

2016-1-17 19:59
1675
crackme提供者:4st0ne
原帖:http://bbs.pediy.com/showthread.php?t=8024

工具:od
平台:winxpsp3

又一个有壳的程序,和前面的壳类似,脱掉,开始爆破。
0040E4A4    50              push    eax
0040E4A5    53              push    ebx
0040E4A6    E8 0943FFFF     call    004027B4                                ; CreateProcessA

程序在启动后不久创建了一个进程。那么,是什么进程呢?看一下数据解释窗口就明白了。
eax=0015E214, (ASCII "C:\Documents and Settings\Administrator\My Documents\Crackme_S.rar_079\test.exe 4st0ne")

原来是自身,只不过加了参数。接下来,
0040E83B    50              push    eax
0040E83C    E8 9B3EFFFF     call    004026DC                                ; DebugActiveProcessA
0040E841    8B35 34104000   mov     esi, dword ptr [<&MSVBVM60.__vbaSetSyst>; MSVBVM60.__vbaSetSystemError
0040E847    FFD6            call    esi
0040E849    8D4D 84         lea     ecx, dword ptr [ebp-7C]
0040E84C    68 48284000     push    00402848                                ; UNICODE "GO!"
0040E851    51              push    ecx
0040E852    FF15 DC104000   call    dword ptr [<&MSVBVM60.__vbaStrToAnsi>]  ; MSVBVM60.__vbaStrToAnsi
0040E858    50              push    eax
0040E859    6A 00           push    0
0040E85B    68 03001F00     push    1F0003
0040E860    E8 1F3DFFFF     call    00402584                                ; OpenEvenA
0040E865    8BF8            mov     edi, eax
0040E867    FFD6            call    esi
0040E869    8D4D 84         lea     ecx, dword ptr [ebp-7C]
0040E86C    FF15 00114000   call    dword ptr [<&MSVBVM60.__vbaFreeStr>]    ; MSVBVM60.__vbaFreeStr
0040E872    57              push    edi
0040E873    E8 403CFFFF     call    004024B8                                ; SetEven
0040E878    FFD6            call    esi
0040E87A    8B1D 14104000   mov     ebx, dword ptr [<&MSVBVM60.__vbaEnd>]   ; MSVBVM60.__vbaEnd
0040E880    8D55 8C         lea     edx, dword ptr [ebp-74]
0040E883    6A FF           push    -1
0040E885    52              push    edx
0040E886    E8 053EFFFF     call    00402690                                ; WaitforDebugEven
0040E88B    FFD6            call    esi
0040E88D    837D 8C 05      cmp     dword ptr [ebp-74], 5
0040E891    75 28           jnz     short 0040E8BB
0040E893    8B45 90         mov     eax, dword ptr [ebp-70]
0040E896    50              push    eax
0040E897    6A 00           push    0
0040E899    68 FF0F1F00     push    1F0FFF
0040E89E    E8 C93EFFFF     call    0040276C                                ; OpenProcess
0040E8A3    8BF8            mov     edi, eax
0040E8A5    FFD6            call    esi
0040E8A7    6A 00           push    0
0040E8A9    57              push    edi
0040E8AA    E8 793EFFFF     call    00402728                                ; TerminateProcess
0040E8AF    FFD6            call    esi
0040E8B1    57              push    edi
0040E8B2    E8 893CFFFF     call    00402540                                ; CloseHandle
0040E8B7    FFD6            call    esi
0040E8B9    FFD3            call    ebx
0040E8BB    8B4D 94         mov     ecx, dword ptr [ebp-6C]
0040E8BE    8B55 90         mov     edx, dword ptr [ebp-70]
0040E8C1    68 02000100     push    10002                                   ; UNICODE "LLUSERSPROFILE=C:\Documents and Settings\All Users"
0040E8C6    51              push    ecx
0040E8C7    52              push    edx
0040E8C8    E8 633DFFFF     call    00402630                                ; ContinueDebugEven
0040E8CD    FFD6            call    esi
0040E8CF  ^ EB AF           jmp     short 0040E880

程序对创建的进程进行调试模拟循环。显然要爆破这个程序就要调试被创建的进程才行。那么,怎样调试第二个进程呢?我们注意到程序在创建第二个进程的时候是带参数的。同时,在程序启动后,
0040E1E0    BA 24284000     mov     edx, 00402824                           ; UNICODE "4st0ne"
0040E1E5    8D4D B8         lea     ecx, dword ptr [ebp-48]
0040E1E8    FFD6            call    esi
0040E1EA    8D85 34FFFFFF   lea     eax, dword ptr [ebp-CC]
0040E1F0    50              push    eax
0040E1F1    FF15 78104000   call    dword ptr [<&MSVBVM60.rtcCommandVar>]   ; MSVBVM60.rtcCommandVar
0040E1F7    8D95 34FFFFFF   lea     edx, dword ptr [ebp-CC]
0040E1FD    8D8D DCFEFFFF   lea     ecx, dword ptr [ebp-124]
0040E203    FF15 08104000   call    dword ptr [<&MSVBVM60.__vbaVarMove>]    ; MSVBVM60.__vbaVarMove
0040E209    8B35 70104000   mov     esi, dword ptr [<&MSVBVM60.__vbaVarTstE>; MSVBVM60.__vbaVarTstEq
0040E20F    8D8D DCFEFFFF   lea     ecx, dword ptr [ebp-124]
0040E215    8D95 24FFFFFF   lea     edx, dword ptr [ebp-DC]
0040E21B    BF 08800000     mov     edi, 8008
0040E220    51              push    ecx
0040E221    52              push    edx
0040E222    C785 2CFFFFFF 4>mov     dword ptr [ebp-D4], 00402244
0040E22C    89BD 24FFFFFF   mov     dword ptr [ebp-DC], edi
0040E232    FFD6            call    esi                                     ; MSVBVM60.__vbaVarTstEq
0040E234    66:85C0         test    ax, ax                                  ;检查命令行参数
0040E237    0F84 FA020000   je      0040E537                                ;根据结果分支

程序检查命令行参数后进行了分支。显然,我们人工加上参数就可以直接调试第二个进程。加上参数后我们如愿进入分支,
0040E548    8995 2CFFFFFF   mov     dword ptr [ebp-D4], edx
0040E54E    89BD 24FFFFFF   mov     dword ptr [ebp-DC], edi
0040E554    FFD6            call    esi
0040E556    66:85C0         test    ax, ax                       ;检查
0040E559    0F84 E2000000   je      0040E641                     ;(爆破点)

程序再次检查是否采用非正常手段进入分支,爆破。接下来,
0040E59A    6A FF           push    -1
0040E59C    57              push    edi
0040E59D    E8 4642FFFF     call    004027E8                                ; WaitforsingleObject
0040E5A2    FFD6            call    esi

我们需要人为跳过这几条指令,否则在主进程没有运行的情况下执行这个调用就陷入死等待状态了。接下来就该寻找注册响应函数了。
0040D8B3   .  51            push    ecx
0040D8B4   .  68 44224000   push    00402244
0040D8B9   .  FF15 6C104000 call    dword ptr [<&MSVBVM60.__vbaStrCmp>]     ;  MSVBVM60.__vbaStrCmp
0040D8BF   .  8B55 B0       mov     edx, dword ptr [ebp-50]
0040D8C2   .  8BF0          mov     esi, eax
0040D8C4   .  F7DE          neg     esi
0040D8C6   .  1BF6          sbb     esi, esi
0040D8C8   .  52            push    edx                                     ; /String
0040D8C9   .  46            inc     esi                                     ; |
0040D8CA   .  F7DE          neg     esi                                     ; |
0040D8CC   .  FF15 10104000 call    dword ptr [<&MSVBVM60.__vbaLenBstr>]    ; \__vbaLenBstr
0040D8D2   .  33C9          xor     ecx, ecx
0040D8D4   .  83F8 05       cmp     eax, 5                                  ;要求用户名长度大于5  
0040D8D7   .  8D55 B0       lea     edx, dword ptr [ebp-50]
0040D8DA   .  8D45 B4       lea     eax, dword ptr [ebp-4C]
0040D8DD      0F9CC1        setl    cl                                      ;处理比较结果
0040D8E0   .  52            push    edx
0040D8E1   .  50            push    eax
0040D8E2   .  F7D9          neg     ecx
0040D8E4   .  6A 02         push    2
0040D8E6   .  0BF1          or      esi, ecx                                ;结果传到esi
0040D8E8   .  FF15 C4104000 call    dword ptr [<&MSVBVM60.__vbaFreeStrList>>;  MSVBVM60.__vbaFreeStrList
0040D8EE   .  8D4D A4       lea     ecx, dword ptr [ebp-5C]
0040D8F1   .  8D55 A8       lea     edx, dword ptr [ebp-58]
0040D8F4   .  51            push    ecx
0040D8F5   .  52            push    edx
0040D8F6   .  6A 02         push    2
0040D8F8   .  FF15 20104000 call    dword ptr [<&MSVBVM60.__vbaFreeObjList>>;  MSVBVM60.__vbaFreeObjList
0040D8FE   .  83C4 18       add     esp, 18
0040D901      66:3BF3       cmp     si, bx                                    ;检查比较结果
0040D904   .  0F85 B7040000 jnz     0040DDC1                                  ;根据结果转向(爆破点)

这个地方爆破后输不输用户名就无所谓了。
0040D9CE   > /8B17          mov     edx, dword ptr [edi]
0040D9D0   . |57            push    edi
0040D9D1     |85F6          test    esi, esi                                  ;是否比对完毕?
0040D9D3   . |0F84 63020000 je      0040DC3C                                  ;(爆破点)

爆破点之下是大段比对代码,终于要结束了
0040DC77   .  50            push    eax                                     ; /String
0040DC78   .  FF15 10104000 call    dword ptr [<&MSVBVM60.__vbaLenBstr>]    ; \__vbaLenBstr
0040DC7E   .  0FBF4D B8     movsx   ecx, word ptr [ebp-48]
0040DC82   .  33D2          xor     edx, edx
0040DC84   .  3BC8          cmp     ecx, eax
0040DC86      0F94C2        sete    dl
0040DC89   .  F7DA          neg     edx
0040DC8B   .  8D4D B4       lea     ecx, dword ptr [ebp-4C]
0040DC8E   .  8BF2          mov     esi, edx
0040DC90   .  FF15 00114000 call    dword ptr [<&MSVBVM60.__vbaFreeStr>]    ;  MSVBVM60.__vbaFreeStr
0040DC96   .  8D4D A8       lea     ecx, dword ptr [ebp-58]
0040DC99   .  FF15 04114000 call    dword ptr [<&MSVBVM60.__vbaFreeObj>]    ;  MSVBVM60.__vbaFreeObj
0040DC9F   .  66:85F6       test    si, si                                  ;再次检查比对结果
0040DCA2      0F84 17010000 je      0040DDBF                                ;(爆破点)

大功告成,收工。发现程序一个小问题,爆破用户名长度检查后,不输入可以注册成功。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//