浅唱小男人 发表于 2014-10-22 14:28

【吾爱破解2014CrackMe大赛】【第一组】

本帖最后由 ximo 于 2014-10-23 20:45 编辑

    首先我的第一想法是搜索ASCII码,第一感觉发现没有什么提示。
然后想到对MessageBox下断点,然后运行程序,输入用户名和假码,点击注册,发现并没有断下来。
查了下,此程序是VC的,想下按钮事件,sub eax,0a,也没有找到

然后返回去去看搜索的ASCII码,找找看。
将error处上面临近的跳转下断。
每个error处都下上断点。
点击运行程序,输入用户名和假码,点击register,发现断下来了,单步跟踪一下
找到这里
0040285F    8D4C24 6C       lea ecx,dword ptr ss:
00402863    51            push ecx                                 ; 假码
00402864    8B4C24 18       mov ecx,dword ptr ss:
00402868    8D5424 3C       lea edx,dword ptr ss:          ; 用户名
0040286C    52            push edx
0040286D    51            push ecx
0040286E    FFD0            call eax                                 ; 这里进去应该就是判断+算法

跟入call eax
继续单步,发现到了这里,单步完后,程序跑起来了,提示注册失败
10001E9D    8B55 08         mov edx,dword ptr ss:
10001EA0    52            push edx
10001EA1    E8 9AFEFFFF   call 10001D40

发现此时的ebx为刚才输入的假码
接着跟入这个CALL,发现了惊喜:
10001DF3    837D FC 08      cmp dword ptr ss:,0x8
10001DF7    75 1C         jnz short 10001E15
10001DF9    8B45 08         mov eax,dword ptr ss:
10001DFC    6A 40         push 0x40
10001DFE    68 1C880010   push 0x1000881C                        ; ASCII "吾爱破解2014CrackMe大赛"
10001E03    68 38880010   push 0x10008838                        ; ASCII "恭喜你,注册成功,请提交答案到答题区吧!"
10001E08    50            push eax
10001E09    FF15 E0700010   call dword ptr ds:         ; user32.MessageBoxA
10001E0F    5F            pop edi

下断点运行到此处
10001DF7   /75 1C         jnz short 10001E15;将这里nop掉

运行程序,发现成功~

发现这样不能保存文件,又没有什么办法,个人认为作者先定义了些常量,然后把所有信息交给api处理
第一次玩这个,如果有错误,请不吝赐教{:1_931:}

ximo 发表于 2014-10-22 14:47

第一:发帖没有加权限,规则里明确说明发帖需要加权限,警告一次。
第二:没有提交爆破后的文件。
因此,该答案无效。继续加油。

浅唱小男人 发表于 2014-10-22 14:47

忘了加阅读权限了,找不到编辑的地方

浅唱小男人 发表于 2014-10-22 14:49

ximo 发表于 2014-10-22 14:47
第一:发帖没有加权限,规则里明确说明发帖需要加权限,警告一次。
第二:没有提交爆破后的文件。
因此, ...

好的,我继续研究下

浅唱小男人 发表于 2014-10-22 17:05

【吾爱破解2014CrackMe大赛】【第一组】

重新发一贴,一开始的答案不符合规则
首先我的第一想法是搜索ASCII码,第一感觉发现没有什么提示。然后想到对MessageBox下断点,然后运行程序,输入用户名和假码,点击注册,发现并没有断下来。查了下,此程序是VC的,想下按钮事件,sub eax,0a,也没有找到
然后返回去去看搜索的ASCII码,找找看。
将error处上面临近的跳转下断。每个error处都下上断点。运行的时候再去掉无用的断点。点击运行程序,输入用户名和假码,点击register,发现断下来了,单步跟踪一下
找到这里0040285F    8D4C24 6C       lea ecx,dword ptr ss:
00402863    51            push ecx                                 ; 假码
00402864    8B4C24 18       mov ecx,dword ptr ss:
00402868    8D5424 3C       lea edx,dword ptr ss:          ; 用户名
0040286C    52            push edx
0040286D    51            push ecx
0040286E    FFD0            call eax                                 ; 这里进去应该就是判断+算法跟入call eax
继续单步,发现到了这里,单步完后,程序跑起来了,提示注册失败10001E9D    8B55 08         mov edx,dword ptr ss:
10001EA0    52            push edx
10001EA1    E8 9AFEFFFF   call 10001D40发现此时的ebx为刚才输入的假码
接着跟入这个CALL,发现了惊喜:10001DF3    837D FC 08      cmp dword ptr ss:,0x8
10001DF7    75 1C         jnz short 10001E15
10001DF9    8B45 08         mov eax,dword ptr ss:
10001DFC    6A 40         push 0x40
10001DFE    68 1C880010   push 0x1000881C                        ; ASCII "吾爱破解2014CrackMe大赛"
10001E03    68 38880010   push 0x10008838                        ; ASCII "恭喜你,注册成功,请提交答案到答题区吧!"
10001E08    50            push eax
10001E09    FF15 E0700010   call dword ptr ds:         ; user32.MessageBoxA
10001E0F    5F            pop edi下断点运行到此处10001DF7   /75 1C         jnz short 10001E15;将这里nop掉运行程序,发现成功~发现这里的跳转修改掉之后,不能在此保存文件,故想到将在主线程中的代码copy出来,放到CrackMe模块的没有用的地方
复制是将该CALL的整个段都复制。
首先跟入这个段0040286E    FFD0            call eax将整段代码二进制复制找到一处空白处选择二进制粘贴,为了解释方便现起名为段1然后跟入10001EA1    E8 9AFEFFFF   call 10001D40同上复制到一处空白处,起名段2 好了,现在弄一下修复一下段1和段2这两个段之间的逻辑关系段1中的源代码call 10001D40本是跳转到段2的 ,现在段2的段首地址改变,故改成call 段2首地址 然后更改程序让程序进入段1, 源程序是call eax, eax为段1的原来的首地址,现在首地址改变,故应该更改eax,所以找到call eax上的最近的call,00402838    56            push esi
00402839    8D4424 20       lea eax,dword ptr ss:
0040283D    E8 7EEAFFFF   call CrackMe1.004012C0
00402842    85C0            test eax,eax
00402844    75 19         jnz short CrackMe1.0040285F
00402846    8B4424 14       mov eax,dword ptr ss:
0040284A    6A 10         push 0x10
0040284C    68 98B44000   push CrackMe1.0040B498                   ; 吾爱破解2014CrackMe大赛跟随进0040283D    E8 7EEAFFFF   call CrackMe1.004012C0将该段改为:Mov eax,段1首地址
Retn0x4保存一下文件, 复制出来的两个段00408E18      00            db 00
00408E19      55            push ebp
00408E1A      8BEC          mov ebp,esp
00408E1C      8B4D 0C       mov ecx,dword ptr ss:
00408E1F      E8 DC81BF0F   call 10001000
00408E24      85C0          test eax,eax
00408E26      75 1A         jnz XCrackMe.00408E42
00408E28      8B45 08       mov eax,dword ptr ss:
00408E2B      6A 10         push 0x10
00408E2D      68 1C880010   push 0x1000881C
00408E32      68 80880010   push 0x10008880
00408E37      50            push eax
00408E38      FF15 E0700010 call dword ptr ds:         ;USER32.MessageBoxA
00408E3E      5D            pop ebp
00408E3F      C2 0C00       retn 0xC
00408E42      53            push ebx
00408E43      E8 1888BF0F   call 10001660
00408E48      8B5D 10       mov ebx,dword ptr ss:
00408E4B      8BC3          mov eax,ebx
00408E4D      8D50 01       lea edx,dword ptr ds:
00408E50      8A08          mov cl,byte ptr ds:
00408E52      40            inc eax
00408E53      84C9          test cl,cl
00408E55    ^ 75 F9         jnz XCrackMe.00408E50
00408E57      2BC2          sub eax,edx
00408E59      75 1B         jnz XCrackMe.00408E76
00408E5B      8B4D 08       mov ecx,dword ptr ss:
00408E5E      6A 10         push 0x10
00408E60      68 1C880010   push 0x1000881C
00408E65      68 9C880010   push 0x1000889C
00408E6A      51            push ecx
00408E6B      FF15 E0700010 call dword ptr ds:         ;USER32.MessageBoxA
00408E71      5B            pop ebx
00408E72      5D            pop ebp
00408E73      C2 0C00       retn 0xC
00408E76      8B55 08       mov edx,dword ptr ss:
00408E79      52            push edx
00408E7A      E8 11000000   call CrackMe.00408E90
00408E7F      83C4 04       add esp,0x4
00408E82      5B            pop ebx
00408E83      5D            pop ebp
00408E84      C2 0C00       retn 0xC
00408E87      00            db 00
00408E88      00            db 00
00408E89      00            db 00
00408E8A      00            db 00
00408E8B      00            db 00
00408E8C      00            db 00
00408E8D      00            db 00
00408E8E      00            db 00
00408E8F      00            db 00
00408E90      55            push ebp
00408E91      8BEC          mov ebp,esp
00408E93      83EC 08       sub esp,0x8
00408E96      56            push esi
00408E97      33F6          xor esi,esi
00408E99      57            push edi
00408E9A      33C9          xor ecx,ecx
00408E9C      8D6424 00   lea esp,dword ptr ss:
00408EA0      B8 4FECC44E   mov eax,0x4EC4EC4F
00408EA5      F7E1          mul ecx
00408EA7      C1EA 02       shr edx,0x2
00408EAA      6BD2 0D       imul edx,edx,0xD
00408EAD      8BC1          mov eax,ecx
00408EAF      2BC2          sub eax,edx
00408EB1      40            inc eax
00408EB2      C704CD 50E800>mov dword ptr ds:,0x1
00408EBD      8904CD 54E800>mov dword ptr ds:,eax
00408EC4      41            inc ecx
00408EC5      83F9 68       cmp ecx,0x68
00408EC8    ^ 72 D6         jb XCrackMe.00408EA0
00408ECA      E8 F187BF0F   call 100016C0
00408ECF      E8 0C89BF0F   call 100017E0
00408ED4      8BC3          mov eax,ebx
00408ED6      8D50 01       lea edx,dword ptr ds:
00408ED9      8DA424 000000>lea esp,dword ptr ss:
00408EE0      8A08          mov cl,byte ptr ds:
00408EE2      40            inc eax
00408EE3      84C9          test cl,cl
00408EE5    ^ 75 F9         jnz XCrackMe.00408EE0
00408EE7      2BC2          sub eax,edx
00408EE9      A8 01         test al,0x1
00408EEB      74 21         je XCrackMe.00408F0E
00408EED      68 34880010   push 0x10008834
00408EF2      68 24100000   push 0x1024
00408EF7      53            push ebx
00408EF8      E8 CA8FBF0F   call 10001EC7
00408EFD      8BC3          mov eax,ebx
00408EFF      83C4 0C       add esp,0xC
00408F02      8D50 01       lea edx,dword ptr ds:
00408F05      8A08          mov cl,byte ptr ds:
00408F07      40            inc eax
00408F08      84C9          test cl,cl
00408F0A    ^ 75 F9         jnz XCrackMe.00408F05
00408F0C      2BC2          sub eax,edx
00408F0E      D1E8          shr eax,1
00408F10      C745 F8 05000>mov dword ptr ss:,0x5
00408F17      8975 FC       mov dword ptr ss:,esi
00408F1A      8BF8          mov edi,eax
00408F1C      74 47         je XCrackMe.00408F65
00408F1E      8BFF          mov edi,edi
00408F20      0FBE0473      movsx eax,byte ptr ds:
00408F24      8D4D F8       lea ecx,dword ptr ss:
00408F27      51            push ecx
00408F28      0FBE4C73 01   movsx ecx,byte ptr ds:
00408F2D      E8 7E8CBF0F   call 10001BB0
00408F32      8D55 FC       lea edx,dword ptr ss:
00408F35      52            push edx
00408F36      E8 258DBF0F   call 10001C60
00408F3B      46            inc esi
00408F3C      83C4 08       add esp,0x8
00408F3F      3BF7          cmp esi,edi
00408F41    ^ 72 DD         jb XCrackMe.00408F20
00408F43      837D FC 08    cmp dword ptr ss:,0x8
00408F47      90            nop
00408F48      90            nop
00408F49      8B45 08       mov eax,dword ptr ss:
00408F4C      6A 40         push 0x40
00408F4E      68 1C880010   push 0x1000881C
00408F53      68 38880010   push 0x10008838
00408F58      50            push eax
00408F59      FF15 E0700010 call dword ptr ds:         ;USER32.MessageBoxA
00408F5F      5F            pop edi
00408F60      5E            pop esi
00408F61      8BE5          mov esp,ebp
00408F63      5D            pop ebp
00408F64      C3            retn
00408F65      8B4D 08       mov ecx,dword ptr ss:
00408F68      6A 10         push 0x10
00408F6A      68 1C880010   push 0x1000881C
00408F6F      68 60880010   push 0x10008860
00408F74      51            push ecx
00408F75      FF15 E0700010 call dword ptr ds:         ;USER32.MessageBoxA
00408F7B      5F            pop edi
00408F7C      5E            pop esi
00408F7D      8BE5          mov esp,ebp
00408F7F      5D            pop ebp
00408F80      C3            retn按照上面的原理找到00408F3F      3BF7          cmp esi,edi
00408F41    ^ 72 DD         jb XCrackMe.00408F20
00408F43      837D FC 08    cmp dword ptr ss:,0x8
00408F47      90            nop
00408F48      90            nop
00408F49      8B45 08       mov eax,dword ptr ss:
00408F4C      6A 40         push 0x40这几句代码 将原来的那个jnz跳转nop掉即可,保存爆破文件。附上爆破文件第一次玩这个,如果有错误,请不吝赐教{:1_931:}

我是用户 发表于 2014-10-22 17:08

win7下运行失败,请重新修改。

Hmily 发表于 2014-10-22 17:11

@浅唱小男人 不要发多个主题,我把你帖子合并了。

浅唱小男人 发表于 2014-10-23 11:30

我是用户 发表于 2014-10-22 17:08
win7下运行失败,请重新修改。

刚才看了一下,win7运行失败的原因是作者在编译的时候选择了随机地址,导致win7的基址不是00400000,所以导致了此程序的某些call定位不正确,
有影响的为这种CALL
10001E41    8BEC            mov ebp,esp
10001E43    8B4D 0C         mov ecx,dword ptr ss:
10001E46    E8 B5F1FFFF   call 10001000
10001E4B    85C0            test eax,eax


解决办法是自定义了一个CALL

009E8E19    B8 00000010   mov eax,0x10000000                     ; 自定义CALL
009E8E1E    C3            retn

009E8E29    E8 EBFFFFFF   call CrackMe.009E8E19                  ; 自己做的call 10001000
009E8E2E    05 00100000   add eax,0x1000
009E8E33    FFD0            call eax

附上win7可运行版本,

L4Nce 发表于 2014-10-23 17:05

硬编码导致,xp下测试内存错误

ximo 发表于 2014-10-23 20:45

最后成绩:0分
评委评价:爆破无效。
谢谢参与,请继续加油。
页: [1] 2
查看完整版本: 【吾爱破解2014CrackMe大赛】【第一组】