- UID
- 2927
注册时间2005-8-29
阅读权限20
最后登录1970-1-1
以武会友
该用户从未签到
|
【破文标题】五个crackme中的第五个分析
【破文作者】surge[PYG]
【作者邮箱】[email protected]
【作者主页】http://surge.blog.com.cn
这是我发的五个crackme中的第五个,提供的答案是老外用delphi写的控制台程序源代码,不过他没有给出第五个的答案。这里简单分析一下。
程序加壳了,od载入就出现异常,shift+F9通过异常后,单步几下,用esp定律很容易脱去。
这个crackme的关键其实是keyfile,下面的代码载入了map文件,map文件可以用ida生成,因为是borland c++程序,用dede也应该可以生成map,不过我用了ida。
为了看起来更整齐一点我将机器码删了。
- 004012B0 push ebp ; DialogFunc
- 004012B1 mov ebp, esp
- 004012B3 push ebx
- 004012B4 mov ebx, 0040D878
- 004012B9 mov eax, [ebp+C]
- 004012BC sub eax, 10 ; Switch (cases 10..111)
- 004012BF je 00401394
- 004012C5 sub eax, 8
- 004012C8 je short 004012DA
- 004012CA sub eax, 0F9
- 004012CF je 004013A5
- 004012D5 jmp 004013CF
- 004012DA push 0040B26F ; /step 5 of 5 by: [xorolc]
- 004012DF push dword ptr [ebp+8] ; |hWnd
- 004012E2 call <SetWindowTextA> ; \SetWindowTextA
- 004012E7 push 0040B296 ; /r
- 004012EC push 0040B289 ; |step5key.key
- 004012F1 call <_fopen> ; \5.004040C0
复制代码
上面可以知道是在读step5key.key文件,所以创建这个文件,随便输入点内容。
再次载入脱壳的程序。
- 004012F6 add esp, 8
- 004012F9 mov [40D89C], eax
- 004012FE cmp dword ptr [40D89C], 0
- 00401305 je 004013D3
- 0040130B xor edx, edx
- 0040130D mov [ebx], edx
- 0040130F jmp short 00401331
- 00401311 /push dword ptr [40D89C] ; /Arg1 = 00000000
- 00401317 |call 00404C5C ; \5.00404C5C
- 0040131C |pop ecx
- 0040131D |mov [40D875], al ; al=文件中的一个字节内容
- 00401322 |mov ecx, [ebx]
- 00401324 |mov al, [40D875]
- 00401329 |mov [ecx+40B14C], al ; 文件中的内容放到40b14c开始的内存处
- 0040132F |inc dword ptr [ebx] ; 计数加1
- 00401331 cmp dword ptr [ebx], 0F ; 读0x0F个字节
- 00401334 \jb short 00401311
- 00401336 push dword ptr [40D89C] ; /Arg1 = 00000000
- 0040133C call <_fclose> ; \5.00403D54
- 00401341 pop ecx
- 00401342 xor edx, edx
- 00401344 mov [ebx], edx ; 计数清0
- 00401346 jmp short 00401357
- 00401348 /mov cl, [ebx]
- 0040134A |add cl, 77 ; 循环次数加上0x77
- 0040134D |mov eax, [ebx]
- 0040134F |xor [eax+40B14C], cl ; (读入文件内容的每一个字节) 异或 (循环次数加0x77)
- 00401355 |inc dword ptr [ebx]
- 00401357 cmp dword ptr [ebx], 0F ; 计数加1
- 0040135A \jb short 00401348
- 0040135C push 0040B15C ; step 5 was fun!
- 00401361 push 0040B14C ; 计算结果与[40b15c]开始的内容比较,相等ok
- 00401366 call <_strcmp>
复制代码
构造正确的step5key.key内容,先不着急计算,因为算法只是简单的异或一次,根据异或原理,a==a xor a xor a,所以把40b15c的内容输入到step5key.key中,并在401361下断点,让程序自己来帮我们算正确的key,重新运行,断下来后看40b14c的内容是什么240C1C0A5B495D091EF3A1E4F6EAA400,找个十六进制编辑器,把这些写入step5key.key。
再次运行程序显示:
Step5 has been solved
Step5 unlock code is: 1A2E3D
这应该是crackme的作者想看到的答案吧。
【版权声明】本文纯属技术交流,转载请注明作者信息并保持文章的完整,谢谢! |
|