频道栏目
读书频道 > 安全 > Rootkit:系统灰色地带的潜伏者(原书第2版)
3.3.9 案例研究:为TREE.COM命令打补丁
2013-10-15 09:38:43     我来说两句
收藏   我要投稿
全书共分四部分。第一部分(第1~6章),全新阐释rootkit 本质、rootkit与反取证关系、安全领域态势,以及反取证技术的策略、应对建议和攻击优势。之后,从硬件、软件(系统)、行业工具和内核空间方面介绍root  立即去当当网订购

修改应用程序的另一种方式是通过注入跳转语句拦截程序控制,跳转语句将控制权转移到特定的代码节,该代码节是被我们嫁接到可执行文件中的。这种修改可以通过为磁盘上的应用程序文件打补丁,或者通过改变驻留于内存中且正在运行的程序来完成。在这种情况下,我们将关注前一种策略(虽然后一种策略由于更难检测而更加有效)。

我们先从由FreeDOS分发中获取一个程序包的tree命令实现开始。Tree命令使用树结构形象地显示目录内容,该结构以特殊扩展的ASCII字符形式加以实现。

 

我们要做的是使用一个通常由病毒实现的标准技巧。具体而言,我们会用JMP指令替换tree命令二进制程序的前几个字节,以便把程序的控制权转移到附加至文件结尾的补丁代码中(参见图3.8)。一旦补丁代码执行完毕,将执行被替换的前几个字节,然后跳转至原始前几个字节之后的机器指令。

 

然而,在我们注入跳转语句之前,最好知道我们将要替换什么。如果使用debug.exe打开FreeDOS的tree命令并反汇编该程序内存映像的开始部分,我们能看到前四个字节是一个比较语句。幸运的是,这是一种能够安全重定位的指令。

 

因为我们正在处理.COM文件,此文件必须存在于单一的64KB段范围中,所以我们可以使用近转移。从我们先前对近转移和远转移的讨论可以知道,近转移大小是3字节,我们可以用NOP指令(占用一个字节,0x90)填充这个JMP指令,以便替换指令时不至于引入一些让处理器混乱不清的东西。

因此,我们替换指令:


 

Tree命令文件大小为9893字节(即第一个字节在偏移0x00100处,最后一个字节在偏移0x027A4处)。因此,跳转指令需要对当前指令指针(0x103)增加位移0x26A2以到达原始文件的正式结尾(0x27A5),也就是我们放置补丁代码的地方。为了真正的用新代码替换旧代码,可以用十六进制编辑器打开FreeDOS的tree命令,并手工替换前4个字节。

注意:英特尔处理器以小端字节序格式存储数字值,也就是说低位字节存储在低地址。记住这个原则,因为当读内存转储以及用十六进制编辑器对二进制文件进行详查时很容易感到迷惑。

补丁代码本身就是.COM程序。为了保持示例相对简单,本程序就只打印输出一条信息,执行我们在程序开始处替换的代码,然后跳转回去,以便能够继续执行,就像什么都未发生一样。我还在紧邻每行汇编代码的注释中包含了每条指令的实模式机器编码。


 

在大多数情况下,我们只需要编译这段代码并使用十六进制编辑器将生成的机器代码粘贴到tree命令文件的结尾。我们补丁的机器代码相当地少,按照十六进制编码,它看起来类似于:

 

但是在执行打过补丁的命令文件之前,还有需要改变的地方:由MOV指令加载到DX中的文本消息的偏移必须从0x0002修正,以反映运行时它在内存中的实际位置(即0x27A7)。因此,必须用十六进制编辑器将机器代码由BA0200改变为BAA727(不要忘记我讲的小端字节序格式)。一旦完成了这种更改,就可以执行tree命令以验证补丁是否运行成功。

 

当然,我使用简单的示例是为了重点关注基本机制。一旦执行的路径发生改变,使用该技术的病毒将采用一整套的既定动作。更微妙的是,你可以改变跳转的初始位置,以使它深藏于文件中。为了规避校验工具,可以在运行时为内存映像打补丁,我将在后面再次介绍此技术的详尽细节。

您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:3.3.8 案例研究:隐藏TSR
下一篇:3.3.10 小结
相关文章
图文推荐
排行
热门
最新书评
特别推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站