漏洞挖掘方法之静态扫描+经典栈溢出实例

Posted Tishion

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了漏洞挖掘方法之静态扫描+经典栈溢出实例相关的知识,希望对你有一定的参考价值。

标 题: 漏洞挖掘方法之静态扫描+经典栈溢出实例
时 间: 2014-02-11,01:52:50

这是笔者公开发表的关于漏洞挖掘的第二篇文章,与发第一篇的时间差不多间隔了整整一年,在这一年里虽然工作细碎,但我还是抽出了大量的时间关注安全,因为当初的既定目标就是走安全的路。这一年了也做了不少关于安全方面的事情,比如参加各大*SRC的漏洞提交什么的,曾今有一段时间也是走火入魔了一样,但是后来我停下来了,因为我觉得那种事情偏离我最初对“漏洞“挖掘的定义,看了那些提交的所谓“漏洞”,基本都是功能缺陷的漏洞(这里只说PC终端产品,Web漏洞不在本文讨论范围内),比如说过xxx主防加载驱动,写启动项,干掉xxx杀软等等,这些也属于一个产品的漏洞,但是这种功能缺陷型漏洞大都带有一种高层次对抗的意味,这种漏洞的挖掘和利用过程完全脱离了对底层二进制级别的指令执行过程的分析,这样的漏洞挖掘中的唯一用处就是你可能对一个操作系统上的各个小子系统更加熟悉,当然前提是你是一个喜欢总结追根摸底的人,你会“系统性“学习,否则的你只能成为一个什么武功都会个一招半式的人,只能知其然,却不能知其所以然。漏洞挖掘还是要回归本质,就我所知,目前国内真正做漏洞挖掘比较务实并且有很多成果的公司瀚海源和360。瀚海源和安全宝从发展过程来看比较类似,但是前者偏向Host安全,后者偏向Web安全。看过瀚海源的一些博客以及给微软提交的漏洞,觉得他们做的才是真正的漏洞挖掘。

言归正传,回到本文的话题,前一篇文章是关于漏洞挖掘的Fuzz方法并且介绍了Windows XP里面的AFD.sys里面的Local DOS漏洞,这篇文章是关于漏洞挖掘的另一种方法—静态扫描潜在危险函数。为了使文章内容充实有干活,笔者在自己使用静态扫描发现的漏洞中选择一个经典栈溢出来讲解,包括对该溢出的挖掘过程,利用方法,shell code构造等。
Part Ⅰ静态扫描方法论及工具开发
漏洞挖掘的方法众多,比如Fuzz,源码审计,二进制代码扫描等等。Fuzz属于动态方法,凡是动态方法的都需要有一个比较全面的路径覆盖,所以需要比较高的自动化系统,实现成本比较高。源码审计实现比较简单,但是需要接触到源代码,所以对很于第三方检测机构来说一般得不到源码无法采用这种方法。

接下来就是今天的主角了—二进制代码扫描:这种漏洞挖掘方法的思路就是扫描目标程序的二进制文件,通过PE文件分析,指令分析等来发现目标程序中存在的潜在漏洞代码。最容易想到的就是通过扫描PE文件的倒入表,查找是否存在危险函数,这种扫描方法速度快,而且比较有效,但是也有缺点:检出率不高,存在遗漏,因为只能扫描到倒入表这一方面,而如果一些模块是使用了静态lib链接的话,那就可能直接把某些危险函数嵌入了模块内部,倒入表中不存在。所以还需要加以指令分析的方法,但是指令分析的实现难度和成本都比较高,因为要考虑到所有的漏洞模式,这也导致了另一个缺点检测速度非常慢。

对于零散的漏洞挖掘人员来说,没有经历和时间来实现比较系统化的工具,但是倒入表的扫描这一点来说还是比较容易实现的。如果不闲麻烦,找到一个程序目录,然后使用Dependency Walker一个一个去查找倒入表,找到你认为危险的函数,谁会有这么多体力呢……所以,动动小手写个工具吧,BinCodeAudit就此诞生了。

BinCodeAudit是一个基于Python语言开发的用于批量扫描程序导入的潜在危险函数的工具,该工具的最初设计结构如下图:
Click image for larger versionName:	image001.jpgViews:	53Size:	567 KBID:	86949
P1
现在,除了UI界面之外其他功能都已经实现。这里贴出一下目前的一个命令行模式的主程序模块代码: