CrackMe技术等级自测3级一个CrackMe分析

来源:互联网 发布:一洋电商软件 编辑:程序博客网 时间:2024/05/29 12:56

几天前EvilKnight在看雪发了一个CrackMe技术等级自测系统(http://bbs.pediy.com/showthread.php?t=147054),正好当时候我也看到了就下下来玩了下;说过了三级推荐6K的工作,不过由于我技术太菜,第三关完全不知道如何分析。其实我也一直想玩玩CrackMe(正好最近Crackmes.de重新开放了),但还是感觉太浮躁了,另外业余时间也很少了,所以依旧很菜。今天看到论坛上有人发了分析报告,觉得分析得很不错,所以转了过来。

原帖地址:http://bbs.pediy.com/showthread.php?p=1052032
作者:cpfive
1. 用到的工具
peid 查壳, depends 查看导入函数, ida (idapython)静态分析
2. 开始
下载完这个Crack me后一看才7kb, 先用peid查壳,什么也没有,Win32控制 台程序。 然后用depends查看导入函数,只有7个,不确定是否加壳。 先用od来调下吧。载入之后,傻了,全是问号,看来有od反汇编引擎不能识别的指 令。如下图:

3. IDA分析
ida只分析出了开头的代码,后面的就没有了。如下图:

看到IDA识别出了开头的机器码,nop dword ptr [eax+233CFAA6h] nop后面还能带操作码? 查查Intel手册,原来是多字节nop。各种多字节nop如下表:

Length  AssemblyByte                                Sequence
2 bytes 66 NOP                                      66 90H
3 bytes NOP DWORD ptr [EAX]                         0F 1F 00H
4 bytes NOP DWORD ptr [EAX + 00H]                   0F 1F 40 00H
5 bytes NOP DWORD ptr [EAX + EAX*1 + 00H]           0F 1F 44 00 00H
6 bytes 66 NOP DWORD ptr [EAX + EAX*1 + 00H]        66 0F 1F 44 00 00H
7 bytes NOP DWORD ptr [EAX + 00000000H]             0F 1F 80 00 00 00 00H
8 bytes NOP DWORD ptr [EAX + EAX*1 + 00000000H]     0F 1F 84 00 00 00 00 00H
9 bytes 66 NOP DWORD ptr [EAX + EAX*1 + 00000000H]  66 0F 1F 84 00 00 00 00 00H
nop只是修改eip,后面的操作数毫无作用。这里的多字节nop纯粹是让人混乱的。 整段代码真正起作用的只有:

push    offset loc_40103E
retn
就是跳转到40103E处,在0x40103E处按’c'直接把数据转换为代码。 继续分析,又是混淆代码,一堆无用操作,继续寻找地址手工转换成代码,找出一部分代 码后,我们来分析下这些混淆代码的特征,争取用脚本来自动分析代码。 这个crack me的混淆比较简单,只有几种模式,找出来总结如下:

nop mem  ;纯粹占地方的,可以同时有多行noppush reg1
xchg reg2,[esp]
pop reg2  ;等于什么都没有做, 其中任何一行都可能有上面一种混淆
   ;也会有jz jnz和push offset ret形式的混淆夹在其中push eax
push edx
rdtsc  ;rdtsc会改变edx, eax
pop edx
pop eax ;其中任何一行中间都可能会有上面2种混淆jz xxx
;上面的三种混淆
jnz xxx ;等同于jmppush offset
;上面三种的混淆
retn   ;还是jmp
4. IDAPython脚本编写
根据总结出来的规律,我们就可以写脚本来代替手工了。 代码如下:(略,具体看附件)
脚本并不完美,因为是一个分支解析的,碰到选择分支的话,就会顺序选择一个 分支,所以要多跑几遍脚本(在没有被脚本处理过的分支上)。 跑完脚本后程序流程就出来了,寻找爆破点,或者注册算法就方便了。 脚本跑完后如下图:

5. 分析
如果用户名等于2个字母或大于10个字母,登录错误 用户名等于’shadow’,'lamer’,guest’登录错误 如果用户名等于密码, 获得了guest权限。 检查权限的函数是0x401E87,非常简单,只是计算密码中含有’S'的个数。 最后如果密码中含有4个’S',则是guest权限,超过4个,就是root权限。
6. 总结
这个crack me 主要是练习静态分析,学习简单的代码混淆。
附件中有带代码着色的html版,和crackmelv3的程序和idb文件。点击下载附件。

P.S. 关于RTDSC指令:http://www.pediy.com/kssd/pediy07/pediy7-510.htm

 

--------------------------------------------------------------------------------

本博客很少转载他人文章,如未特别标明,均为原创,转载请注明出处:
本文出自程序人生 >> [转]CrackMe技术等级自测3级一个CrackMe分析


Copyed From 程序人生
Home Page:http://www.programlife.net
Source URL:http://www.programlife.net/crackme-3-analysis.html

原创粉丝点击