首页 > 逆向调试 > [转]CrackMe技术等级自测3级一个CrackMe分析

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

几天前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反汇编引擎不能识别的指 令。如下图:
od反汇编引擎不能识别的指
3. IDA分析
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  ;纯粹占地方的,可以同时有多行nop
push 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 ;等同于jmp
push offset
;上面三种的混淆
retn   ;还是jmp

4. IDAPython脚本编写
根据总结出来的规律,我们就可以写脚本来代替手工了。 代码如下:(略,具体看附件)
脚本并不完美,因为是一个分支解析的,碰到选择分支的话,就会顺序选择一个 分支,所以要多跑几遍脚本(在没有被脚本处理过的分支上)。 跑完脚本后程序流程就出来了,寻找爆破点,或者注册算法就方便了。 脚本跑完后如下图:
IDA脚本处理完后的流程图
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分析
作者:代码疯子(Wins0n) 本站内容如无声明均属原创,转载请保留作者信息与原文链接,谢谢!


更多



  1. 2012年3月17日10:49 | #1

    好久没玩crackme了,据说过了四级推荐9K以上的工作,很想过一下 [em013]

    [回复]

    代码疯子 回复:

    @胡阳, 难度还是比较大的,9K的价钱算不错了。

    [回复]

  2. EvilKnight
    2012年12月20日16:38 | #2

    哦哦,这个东西是我们部门一个91年的小盆友弄的.

    [回复]

    代码疯子 回复:

    @EvilKnight, 不错

    [回复]