基于可执行代码逆向分析的漏洞挖掘方法

文档序号:6469677阅读:204来源:国知局
专利名称:基于可执行代码逆向分析的漏洞挖掘方法
技术领域
本发明涉及一种计算机技术领域的漏洞挖掘方法,具体地说,涉及的是一 种基于可执行代码逆向分析的漏洞挖掘方法。
背景技术
目前己有多种针对漏洞进行挖掘及检测的技术,但往往在检测中需消耗大 量的人力和物力,如采用黑盒方式的自动挖掘技术。为增加检测效率,在代码检 测中也常常采用一些通过规范来检査代码安全性的工具,这种基于匹配査找的方 式可以快速检测出固有漏洞,但对于逻辑性的代码漏洞却无法进行详细的检测。 基于逆向分析的漏洞发掘实际上属于灰盒测试方法,是采用逆向分析技术来辅助 漏洞的挖掘,既能直接对问题域进行衡量,又测试了尽可能多的脆弱点。同时可 以降低检测中消耗的人力成本,同时对于逻辑性漏洞也具备较高的检测率。
另外一种对基于目标代码的检测方法,是先用反汇编工具对待测程序进行 处理,再依赖基于源码的检测分析技术来对所得结果进行处理。返回点检测技术 是一种通过判决调用的返回点位置(堆或者栈)来判决正在执行的代码是否是溢 出代码的方法。这种漏洞发掘方法对普通的溢出代码的防范是有效的,但是存在 不少众所周知的缺点,许多病毒程序绕过其检测的问题依然可以入侵到系统中。 基于可执行代码逆向分析的漏洞挖掘技术由于可以针对程序的决策进行判断,因 此对基于目标代码的检测方法可以进行补充的检测,防止病毒程序绕过。
经对现有技术文献的检索发现,中国专利申请号为200610103592.5 ,名 称为"一种整型溢出漏洞自动化挖掘方法"。该技术自述为"设置填充字符长 度、内容及存储地址,在指定的存储地址用指定的字符填充数据,被测对象执行 对文件型数据或网络协议型数据的处理,捕获被测对象是否有错误发生,如果有 错误发生,记录出错的位置或/和保存出错的数据,并修改存储地址,如此循环 测试,直到被测对象的数据尾为止。"利用该方法,能够实现黑盒测试或独立的 安全测试人员在不知道数据格式的情况下,通过自动对数据内容遍历的方法来尝试发现可能存储整型变量的位置,从而有效地进行整型溢出漏洞挖掘工作,提高 软件开发的质量及稳定性。该检测技术属于黑盒测试的一种,其发现的漏洞类型 比较单一,并且无法知道造成漏洞的输入可能造成的其他问题。采用基于可执行 代码逆向分析的漏洞发掘可以对漏洞产生的所有分支进行检查,因此可以挖掘出 其他类型及代码分支带来的漏洞。

发明内容
本发明的目的在于克服现有技术中的不足,提供一种基于可执行代码逆向分 析的漏洞挖掘方法。使其能够在符合测试要求的前提下,尽可能多地穿越代码树 的所有节点,检测受测软件中固有的与逻辑的脆弱点,同时对问题域进行衡量, 判断漏洞的危害,主要用来辅助网络服务型软件和本地应用型软件的漏洞挖掘和 安全性检测。
本发明是通过以下技术方案实现的,本发明对于可执行文件,这里是指 Windows系统下的PE格式文件,采用的是灰箱的检测方法,利用调试软件捕获 程序的漏洞信息,通过分析漏洞造成程序脱离安全态时的具体代码,并逆向分析 程序指令流及输入决策信息,动态分析交互数据和决策。挖掘出程序中的固有和 逻辑漏洞,确定漏洞的危害,从而达到检测漏洞的目的。
本发明包括如下步骤
第一步,对可执行二进制代码进行软件漏洞的捕捉,软件漏洞捕捉用来提升 对软件系统错误的可观测性。具体为使用受检测软件内置调试程序或附加到软 件上的调试程序,将低观测性的软件变成高观测性软件。漏洞捕捉的可行性在一 定程度上需要取决于受测软件与调试程序的结合度。其结果将用于指导是否将软 件系统错误和导致错误的外部输入进行深入的漏洞探测。
第二步,当漏洞捕捉完成后,由于此时已确定受测软件存在一定的可检测漏 洞,则将造成漏洞的输入数据作为主要输入,因为在输入后系统将脱离安全态。 对于脱离安全态的程序点检测其完整的代码覆盖情况。代码覆盖主要使用指令流 追踪的技术。代码覆盖记录能够测试尽可能多的、已生成的代码树分支。
第三步,通过对代码覆盖检测观察程序执行路径,再通过附加到软件的调试 器追踪指令流,尽可能多地收集程序的内部状态信息,实时收集状态信息从而指 导重构恶意输入,有效影响正在执行的程序的状态,弥补了黑盒测试的盲目性、片面性,并以此确定出现漏洞的具体位置前执行的指令流,来完成漏洞点的回溯。 第四步,指令流回溯寻找到的漏洞点,通过追踪代码执行分支来确定软件漏
洞和外部输入的联系。判断受测软件基于用户提交的数据所做出的决策。通过追
踪交互数据在内存页中断点的情况有利于追踪外部输入的流向,确定漏洞和外部
输入的关联关系,最终用来确定漏洞的危害性。
本发明通过对可执行代码逆向分析,并对捕捉的漏洞进行代码覆盖完整性分
析,可视化其二进制代码的指令流,追踪实际输入输出的交互数据以探测其漏洞
是否真实存在。
本发明经过了性能测试,测试结果表明了本发明对于二进制可执行文件具有 很好的漏洞检测率;特别是对于Windows系统平台下的PE文件,漏洞检测率较 高;对于网络服务型软件的漏洞,当输入接口可以全部定义时,该检测方法能够 较全面地分析漏洞情况;当软件交互比较复杂时,也能够检测出漏洞。


图1基于可执行代码逆向分析的漏洞挖掘方法流程示意图
具体实施例方式
下面结合附图对本发明的实施例作详细说明本实施例在以本发明技术方案 为前提下进行实施,给出了详细的实施方式和具体的操作过程,但本发明的保护 范围不限于下述的实施例。
基于本发明开发了可执行代码逆向分析的漏洞挖掘方法,其主要针对可执行 代码的漏洞进行逆向分析的检测,对其中可能出现的固有漏洞和逻辑漏洞进行灰 箱检测处理,判断并定位出漏洞位置及相应危害。下面描述具体的实施方法
对于可执行代码文件,主要是指Windows下的可执行PE文件,具体的检测 流程见图1。
第一步,根据可执行PE文件的格式,判断定位出可执行文件的执行入口点 位置,作为下面检测分析之用。定位执行入口点可以采用已有的入口点检测软件, 如Windows系统下的PeditorW等,但要注意一些病毒和后门代码为了躲避逆向 分析常常可能修改入口点位置。获取入口点后,可以采用调试器如Windows系统 下的011yDbg从程序的入口点开始通过断点、级指令的追踪、多线程的调试、进 程快照等功能对软件的漏洞进行检査。在使用调试器对程序运行进行检查中出现的任何异常状态如程序异常退出或出现不可预测数据结果等都可以作为漏洞进 行进一步检查。如在调试器单步运行中出现某变量分配内存不足,造成缓冲区溢 出等;程序执行了编写时既定的跳转代码以外的意外代码等问题。
第二步,对捕获的漏洞进行进一步检査,利用调试器通过指令流回溯找到造 成漏洞的输入数据所对应代码的位置,检查不同输入数据导致程序的不同跳转。 并通过调试器追踪代码执行分支来确定软件漏洞和外部输入的联系。如在PE文 件中跳转基本以JMP的汇编代码在调试器中出现。因此检査代码中造成漏洞的所 有可能分支就转变为找到造成漏洞的异常输入后所有JMP的位置。同时收集不同 分支执行后程序运行的状态,对于状态异常的情况,记录导致代码执行到该分支 其输入的具体数值。由于漏洞是程序错误设计导致的,因此采用该步骤就可以寻 找到此错误设计可能造成的多个漏洞或该漏洞代码附近同类型的漏洞。
第三步,对于上一步发现的异常状态的情况,利用调试器单步执行每一条代 码,收集程序的运行状态信息。因为并不是只有一种输入才会导致漏洞的发生, 因此收集到的状态如果发现异常,就可以用来指导构造出造成该问题的所有恶意 输入。只要是输入的数据会使程序由分支跳转到该异常状态,则该输入就是具有 造成漏洞可能的恶意输入内容。通过该步骤就可以较快地找到所有可能造成漏洞 的输入,而通常找到所有恶意输入数据必须通过对所有可能输入的数据进行全部 检査才可能得到结果。如在代码跳转的条件中要求A大于0小于10跳转到路径 一,而路径一在单步执行中发生状态异常,则当A等于1至9时都可能会导致程 序产生漏洞。
第四步,由于程序设计时,在数据被输入后可能在不同的代码位置对数据的
有效性进行检查。因此,在漏洞以及造成漏洞的所有输入确定后,必须了解该输 入是否真的能导致程序的跳转并产生漏洞。因此需要通过调试器进行代码回溯检
査输入数据代码及执行跳转代码周边的代码情况,检査产生漏洞的输入是否在输 入数据的代码后面有格式及条件方面的检査,由于产生漏洞的输入在程序代码中 如果己被过滤条件屏蔽,则该造成问题的输入内容实际上并不会造成程序跳转到 异常的状态,而是在输入后由于格式或其他方面不符合被过滤掉了,因此由该输 入造成的问题就不存在。对于所有可能造成危害的输入都需要进行上述的检査, 最后可以确定能够造成漏洞的所有输入。从而最终确定漏洞可能造成的所有危
6害,检测完成。
本实施例具有较高的检测效率,并对于程序中的可能漏检的逻辑漏洞能够较 为成功地进行挖掘,涉及的一些具体的操作都是现有的成熟技术领域,简单方便。
权利要求
1、一种基于可执行代码逆向分析的漏洞挖掘方法,其特征在于包括如下步骤第一步,对可执行二进制代码进行软件漏洞的捕捉,软件漏洞捕捉用来提升对软件系统错误的可观测性;第二步,当漏洞捕捉完成后,确定受测软件存在可检测漏洞时,则将造成漏洞的输入数据作为主要输入,在输入后系统将脱离安全态,对于脱离安全态的程序点检测其完整的代码覆盖情况;第三步,通过对代码覆盖检测观察程序执行路径,再通过附加到软件的调试器追踪指令流,收集程序的内部状态信息,实时收集状态信息指导重构恶意输入,影响正在执行的程序的状态,并以此确定出现漏洞的具体位置前执行的指令流,来完成漏洞点的回溯;第四步,指令流回溯寻找到的漏洞点,通过追踪代码执行分支来确定软件漏洞和外部输入的联系,判断受测软件基于用户提交的数据所做出的决策,通过追踪交互数据在内存页中断点的情况有利于追踪外部输入的流向,确定漏洞和外部输入的关联关系,最终用来确定漏洞的危害性。
2、 根据权利要求1所述的基于可执行代码逆向分析的漏洞挖掘方法,其特征是,第一步中,使用受检测软件内置调试程序或附加到软件上的调试程序,将低观测性的软件变成高观测性软件,其结果用于指导是否将软件系统错误和导致错误的外部输入进行深入的漏洞探测。
3、 根据权利要求1所述的基于可执行代码逆向分析的漏洞挖掘方法,其特征是,第一步中,代码覆盖使用指令流追踪的技术,代码覆盖记录能够测试尽可能多的、己生成的代码树分支。
全文摘要
本发明涉及一种软件工程技术领域的基于可执行代码逆向分析的漏洞挖掘方法,具体为对于可执行文件,这里是指Windows系统下的PE格式文件,采用的是灰箱的检测方法,利用调试软件捕获程序的漏洞信息,通过分析漏洞造成程序脱离安全态时的具体代码,并逆向分析程序指令流及输入决策信息,动态分析交互数据和决策。挖掘出程序中的固有和逻辑漏洞,确定漏洞的危害,从而达到检测漏洞的目的。本发明具有较高的检测效率,并对于程序中的可能漏检的逻辑漏洞能够较为成功地进行挖掘。
文档编号G06F11/36GK101482846SQ200810207769
公开日2009年7月15日 申请日期2008年12月25日 优先权日2008年12月25日
发明者勇 施, 王轶骏, 质 薛 申请人:上海交通大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1