首页
社区
课程
招聘
[原创]另类方式实现爆破
发表于: 2013-2-23 13:16 10159

[原创]另类方式实现爆破

2013-2-23 13:16
10159

ps:  原本用小号发在新人交流投稿区的,无奈沉了  ,所以转到这里来发 .....
偶不是什么文艺青年 , 想不出强大华丽的词藻 , 只求写得 逻辑清楚 , 简洁明了, 希望对各位有用 ...

【文章作者】: 七色
【作者QQ号】: 952209657
【使用工具】: ollyice(1.10), odbgScript.dll(1.82) , logTrace.osc
【系统版本】: xp sp3
【发帖背景】:
        做调试都是体力活啊,有木有? 如果遇害到大量的垃圾代码你会怎么做? 硬着头皮一层层分析 ?
        关键是如何在这一大堆的代码里面将程序的流程梳理出来,有人提议runTrace
        事实上 runTrace 远远没有达到我们的要求,于是偶写了这个 od脚本.
        家里断着网,手头上实在没有什么软件来搞, 于是从看雪 CrackMe 2007中随意挑选了几个
         CrackMe来试刀 ,各位也可以结合原文的分析来做比较
        只是为了演示自己写的logTrace脚本的用法,关键在于思路,请各位原作者匆喷....

简单说一下, 运行脚本之后,程序所执行的控制语句 ( jcc call retn retf  等等) 将会被顺序记录到 odScript 的log窗口之中, 方便我们对流程进行回顾和分析 .

                爆破一: aalloverred 之 KGM1Tal
--------------------------------------------------------------------------------
首先我们下一断点
        bp 77D2436E        ;77D2436E | user32.GetDlgItem 这是getDlgTextA要调用到的,这不是一个常用断点,可以防止程序检测

新建一个脚本,KGM1Tal.osc ,内容如下:

        KGM1Tal.osc:
        --------------------
        push 0
        call logTrace
        #inc "logTrace.osc"
        ---------------------
程序断下来以后,运行这个脚本,打开脚本运行记录,我们从最后面开始观察 ,注意这里

        -----------------------
        4013A9     $RESULT_1: jnz     short 004013B0         ; 这是最后一个跳转
        4013AB     ...
        4013AB     $RESULT_1: jmp     004014F5                ; 调用 MessageBox 用来显示注册失败,
        ---------------------

我们需要修改这个跳转,使注册成功,接下来,来修改一下我们的脚本

        KGM1Tal.osc:
        --------------------
        rtu
        go 4013A9
        asm 4013A9,"je   short 004013B0"
        push 0
        call logTrace

        #inc "logTrace.osc"
        ---------------------

看一下新跑出来的流程

        ---------------------
        4013A9     $RESULT_1: je      short 004013B0        ;这个跳转已经修正了
        4013B0     ...
        4013B0     $RESULT_1: jmp     00401480
        401480     ...
        401480     $RESULT_1: call    00401510               
        401510     ...
        401517     $RESULT_1: jnz     short 004014F5        ;再次跳转
        4014F5     ...                                        ;调用 MessageBox 用来显示注册失败,
        401503     $RESULT_1: call    <jmp.&user32.MessageBoxA>

        ---------------------
我们再次修正脚本,添加一行 asm 401517,"je     short 004014F5" 跑出流程看一下

很明显,程序又做了两次循环,至于是不是校验我们不做分析,在这里我们只关注流程,下面是两个可疑跳转

        ---------------------
        401406     $RESULT_1: jbe     short 0040140A
        40140A     ...
        40141D     $RESULT_1: jnz     004014F5

        ---------------------
<C-F2> 我们重新载入,ctrl+f 输入 jcc 004014F5,我们来查一下共有几个跳转到注册失败的节点

        ; 004013C6   /0F85 29010000   jnz KGM1Tal.004014F5
        ; 0040141D   /0F85 D2000000   jnz KGM1Tal.004014F5
        ; 0040144B   /0F85 A4000000   jnz KGM1Tal.004014F5
        ; 00401475   /75 7E           jnz short KGM1Tal.004014F5
        ; 004014DD   /75 16           jnz short KGM1Tal.004014F5
        ; 00401517  ^\75 DC           jnz short KGM1Tal.004014F5

将这几个跳转都反过来,脚本如下
        ---------------------
        rtu
        go 4013A9
        asm 4013A9,"je   short 004013B0"
        ;asm 004013C6 ,"jz 004014F5"                ;
        asm 0040141D , "jz 004014F5"
        asm 0040144B , " jz 004014F5"
        asm 00401475 , "jz short 004014F5"
        asm 004014DD , "jz short 004014F5"
        asm 00401517 ,"jz short 004014F5"
        push 0
        call logTrace

        #inc "logTrace.osc"
        ---------------------
结果还是失败,这里我就不帖出来了,大家可能已经注意到004013C6处的跳转,无论是 jz或者 jnz 都会跳转到失败的处理流程中去.那么,怎么办呢,
改一下我们的脚本,asm 004013C6 ,"jmp  short 004013CC",
重新载入,跑起来 ,程序弹出 Great Job!

                爆破二:深海游侠 之 crackme1

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

这一个程序注册失败,是没有提示的,和前一个例子同样的断点,记录流程,首先我们不输入任何字串,记录下流程 1.txt , 再随便输入几个字串,记录下流程 2.txt
打开beyond Compare,比较两个流程记录, 2.txt 中间多了几个步骤,很显然就是用来校验的.

        ---------------------
        4015CC     ...
        4015D6     $RESULT_1: jnz     short 0040164A
        4015D8     ...
        4015DB     $RESULT_1: jg      short 0040164A
        4015DD     ...
        4015E1     $RESULT_1: jle     short 00401637
        4015E3     ...
        4015FB     $RESULT_1: jle     short 00401600
        401600     ...
        401603     $RESULT_1: jge     short 0040160E
        401605     ...
        401611     $RESULT_1: jle     short 00401625
        401613     ...
        401616     $RESULT_1: jge     short 00401625
        401618     ...
        40162C     $RESULT_1: jnz     short 0040164A
        40164A     ...                                        ;如果注册失败都会跳转到这里

        ---------------------
ctrl+f  查找 jcc 0040164A 我们查到如下几个跳转,在流程中要注意这几个地址

        ; 004015CA   . /7C 7E         jl      short 0040164A
        ; 004015D6   . /75 72         jnz     short 0040164A
        ; 004015DB   . /7F 6D         jg      short 0040164A
        ; 0040162C   . /75 1C         jnz     short 0040164A

和上例同样的情况,我们发现单纯的将某处判断反转是行不通的, 此处的 0040162C 执行了多次判断 ,我们将它nop掉

最终的脚本是这样的

        ---------------------
        asm 0040162C  ,"nop"
        asm 0040162d  ,"nop"
        rtu
        push 0
        call logTrace
        #inc "logTrace.osc"
        ---------------------
重新载入,断下来之后,运行脚本,程序提示 well done crack!

写本文的目的并不是讲如何爆破某个程序,而是简短讲一下这个脚本的用法,正所谓,授人以鱼不如授人以渔,如果有兴趣可以试着做一下!

由于odbgScript 插件自己的问题.脚本之中仍然存在未处理的bug,有跑飞的危险,所以请不要过于相信这个脚本跑出来的结果.
在多线程的程序中,建议将其它线程先手动挂起,再运行脚本.

写在最后: 发了这篇, 就不打算再发文了, 去写cm ,  找坛里人来切磋  !!!!

---------------------End -------------------------

【版权声明】: 本文系原创并发表于看雪, 转载请注明作者并保持文章的完整性并注明出处, 谢谢!!!


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

上传的附件:
收藏
免费 6
支持
分享
最新回复 (10)
雪    币: 143
活跃值: (263)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
2
自个顶一个吧
2013-2-23 13:25
0
雪    币: 288
活跃值: (212)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
3
给楼主顶一个,方法很实用。
2013-2-23 13:59
0
雪    币: 31
活跃值: (48)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
顶楼主。。。
2013-2-23 22:01
0
雪    币: 656
活跃值: (448)
能力值: ( LV12,RANK:360 )
在线值:
发帖
回帖
粉丝
5
我有一个类似的思路,对于脱壳后解除程序暗桩,不知道能不能实现.
写一个调试程序,同时单步调试 带壳程序(需要让他先运行到OEP)和脱壳后的程序,然后一步步监控他们每一步,直到出现执行不同位置的时候,提示~
2013-2-24 08:31
0
雪    币: 143
活跃值: (263)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
6
可以用文本比较工具,比较出两个流程的差别,能够实现你说的。只不过稍微简陋了些!
有时间的话考虑写成od插件
2013-2-24 10:06
0
雪    币: 46
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
paimei 有这样的功能..
2013-2-24 10:08
0
雪    币: 265
活跃值: (74)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
真的是很好的思路啊
2013-3-26 21:17
0
雪    币: 10631
活跃值: (3549)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
对于有加密狗的情况下可能很方便。
2013-4-22 09:56
0
雪    币: 30
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
有些看不明白,继续努力
2013-7-24 09:29
0
雪    币: 210
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
好好学习呀!天天向上!
2013-7-24 10:30
0
游客
登录 | 注册 方可回帖
返回
//