基于逆向工程的软件漏洞挖掘技术_徐良华 - 范文中心

基于逆向工程的软件漏洞挖掘技术_徐良华

12/30

您的论文得到两院院士关注

文章编号:1008-0570(2006)08-3-0259-03

软件时空

基于逆向工程的软件漏洞挖掘技术

ResearchonDiscoveringSoftwareVulnerabilitiesBasedonReverseEngineering

(1.信息工程大学;2.江南计算技术研究所)徐良华

1,2

孙玉龙

高丰

朱鲁华

Xu,LianghuaSun,YulongGao,FengZhu,Luhua

摘要:软件漏洞挖掘是网络攻防技术的重要组成部分。首先介绍了逆向工程技术的起源、作用和基于逆向工程的软件漏洞挖

特性、适用范围和优缺点;最后给出一个实掘技术的研究路线;然后描述了四种基于逆向工程的软件漏洞挖掘技术的原理、

例,示范如何基于逆向工程技术挖掘helpctr程序中存在的缓冲区溢出软件漏洞。关键词:软件漏洞;逆向工程;白箱分析;黑箱分析

文献标识码:A中图分类号:TP393.08

Abstract:Discoveringsoftwarevulnerabilityisanimportantpartofnetworkattackanddefensetechnology.First,theoriginandappli-

ciationofreverseengineeringandthemethodsofdiscoveringsoftwarevulnerabilitiesbasedonreverseengineeringareintroduced;then,therationale,characteristics,applicablefield,meritsandlimitsof4methodologiesofdiscoveringsoftwarevulnerabilitiybasedonreverseengineeringarediscribed;Finally,ainstanceofhowtodiscoverbufferoverflowsoftwarevulnerabilityinhelpctr.exebasedonreverseengineeringispresented.

Keywords:softwarevulnerability,reverseengineering,whiteboxanalysis,blackboxanalysis

1引言

随着计算机网络和通讯技术的快速发展,利用开放的网络环境进行全球通信已成为时代发展的趋势。但是网络在提供便利的共享资源的同时也带来了各种各样的安全风险。网络的安全风险主要来源于使用的软件中存在安全漏洞。

软件漏洞挖掘是信息安全技术的重要组成部分。依据分析对象的不同,漏洞挖掘技术可以分为基于源码的漏洞挖掘技术和基于目标代码的漏洞挖掘技术两大类。采用基于源码的漏洞挖掘的前提条件是必须能获取源代码,例如对于一些开源项目,通过分析其公布的源代码,找到其可能存在的漏洞,Linux系统的漏洞挖掘就可以采用这种方法。但是,大多数的商业软件,其源码很难获得,不可能从源码的角度进行漏洞挖掘,只能采用基于目标码的漏洞挖掘技术。对目标码进行分析涉及编译器、指令系统、可执行文件格式等多方面的知识,难度很大,如何充分利用逆向工程技术降低分析的难度,从而快速地定位可能存在的软件漏洞,已经成为软件漏洞挖掘领域的一个重要的研究方向。

本文第二部分介绍了逆向工程的概念,包括逆向工程中的常采用的白箱分析法和黑箱分析法;第三部分介绍了基于逆向工程的软件漏洞挖掘技术,包括软件版本差异的比较方法、输入追踪法和代码覆盖法等;第四部分描述了一个采用输入追踪法进行代码逆向分析,从而定位漏洞的实例;第五部分是对全文的小结。徐良华:高级工程师博士

PLC技术应用200例》

2逆向工程技术

2.1逆向工程的起源和作用

术语逆向工程最早来源于硬件领域通过检查样品

开发复杂硬件系统规约的过程,主要是指研究他人的系统,发现其工作原理,以达到复制和再利用的目的。现在逆向工程也同样适应于其他领域,例如,在软件工程中,逆向工程可用于发现目标系统的工作原理。

逆向工程也是信息安全技术的重要组成部分。通过逆向工程,攻击者可以分析软件的目标码,理解程序的结构和程序的逻辑,甚至可以改变一个程序的结构,从而可以直接影响程序的逻辑流。后一种行为常被称作修补(patching),修补允许在没有源码的情况下,添加命令或是改变特殊函数调用的方式,这使得软件分析者能够给目标程序添加秘密特性、删除函数或者禁用函数、在没有源码的情况下定位错误等。

2.2基于逆向工程的研究路线

基于逆向工程的软件漏洞挖掘技术的研究路线是将要分析的二进制代码首先反汇编,得到汇编代码;然后对汇编代码进行切片,即对某些上下文关联密切、有意义的代码进行汇聚,降低其复杂性;最后通过分析功能模块,来判断是否存在漏洞。按照是否采用反汇编和反编译得到其高级语言表述的代码,可以将逆向工程的方法分为白箱分析法和黑箱分析法。

白箱分析法主要指对源代码进行分析和理解。对于所需分析的二进制代码,采用反汇编、反编译的方法,得到其高级语言形式的源代码,并进一步分析此源代码,这种方法可以认为是白箱分析。如果有优秀的反

:360元/年

-259-

术创新

软件时空

中文核心期刊《微计算机信息》(管控一体化)2006年第22卷第8-3期

编译工具的支持,白箱测试对于发现软件中设计错误和执行错误是非常有效的。然而白箱测试也有不足之处,就是编译后产生的代码和其真正的源代码可能会存在差异,因此可能会误报实际上不存在的漏洞。

黑箱分析法就是利用各种输入对程序进行探测,并对程序运行的结果进行分析。这种分析方法仅需要有运行的程序而不需要分析任何形式的源代码。其测试条件是可运行的程序、能接受输入以及可以观察到结果。如果测试者能给运行的程序提供输入,并可以观察输出结果,就可以进行黑箱测试。在黑箱测试时,可以尽量给程序提供各种恶意输入向量,如果用某个特定的测试向量测试程序时程序出现异常,就预示着可能发现了该程序的一个漏洞。相对于白箱测试,黑箱测试在理解代码逻辑和程序行为等方面不是那么有效,而且黑箱测试需要软件分析者具有更多的经验。不过黑箱测试不需要反汇编、反编译等工具的支持,更容易实现。

输入点是指用户提供的数据提交给程序的地方。在软件与用户交界处是软件中最有可能产生漏洞的

地方,因此在逆向工程中,输入追踪的方法有着很广泛的应用。

有采用输入追踪法,首先,需要确定代码的输入点。

的静态分析工具,例如IDAPro,能帮助安全分析人员确定所有可能的输入点,并判断哪一个变量会受到外界的影响。例如WSARecvFrom()的调用将会接收网络报文,并把数据放入缓冲。其次,可以利用动态调试工具在输入点设置断点并单步追踪程序,调试时记录每个输入和代码路径。虽然手工判断所有的输入点需要花费很多的时间,但是这样做却有可能发现软件中处理用户提供的数据的代码位置,从而发现软件中的漏洞。

3.3代码覆盖测试

代码覆盖测试是软件测试和评估中的重要方法,它能评估软件测试完成程度,包括语句覆盖、判定覆盖、条件覆盖、条件组合覆盖等内容。同样利用代码覆盖工具,分析者可以观察程序执行情况,并判断代码执行的是哪条路径。不少工具都可以进行代码覆盖分析。代码覆盖分析可以在分析者分析软件情况时告诉他还有多少目标评估工作没有完成。代码覆盖测试不需要目标软件的源代码,一些代码覆盖工具能附加到进程之上,并实时收集评估信息。

覆盖测试技术可以和输入追踪技术结合使用。例如,对WSARecvFrom()的调用,使用外部输入追踪,可以估计访问的代码路径。当程序接受了用户的数据输入,根据具体的条件会执行不同的代码分支,这些逻辑是通过机器代码的条件分支指令来实现的,例如x86机器代码中的JNZ和JE等指令都是用来实现条件分支的。代码覆盖工具可以检测什么时候会执行分支,并可以画出连续执行的一段机器代码的执行图,有助于判断在分析中还有哪些路径没有走过。

技术创新

3基于逆向工程的软件漏洞挖掘技术

对软件进行逆向分析时,根据采取的角度和手段的不同,可以分为很多种方法。在本节中将介绍四种比较典型的漏洞挖掘技术,其中软件版本差异比较、输入追踪测试和利用静态分析工具自动分析属于白箱分析法,而代码覆盖测试属于黑箱分析法。每种方法都有其优缺点,为了准确挖掘软件漏洞,在实际测试时可以综合使用。

3.1软件版本差异比较

软件开发者会发布新版本,或是提供安全补丁包,以修改旧版本中的安全漏洞。版本之间的差异信息可能就是攻击者的向导图。新旧版本的差异比较能揭露在何处添加了新特性,或者是何处的漏洞被修补了,这些差异为寻找软件漏洞给出了重要的提示,是发现漏洞的重要线索。

软件版本差异比较的技术难点是源码很小的改动就可能引起可执行代码的显著变化,这是因为增加结构体成员将导致其他结构体成员的偏移量的变化;在源码中增加几行代码就有可能导致寄存器分配的变化,从而使得指令发生变化;编译选项的改变对可执行代码有显著的影响。

在目标代码的比较过程中可以采用字节比较的方法和模块化比较的方法。普通的字节比较不能准确反映源代码的变化情况,尤其是不能反映源代码变化的一些宏观信息,使得比较的结果没有很大的参考意义。模块化比较算法是基于函数逻辑关系的比较算法,能够避免非逻辑变化对二进制比较造成的干扰,在软件漏洞挖掘技术中发挥着重要的作用。通过函数匹配,定位补丁前后发生了逻辑变化的函数,从而发现补丁包所对应的漏洞。

3.4利用静态分析工具自动分析

采用反汇编工具所提供的脚本语言,对漏洞进行自动挖掘也是一种有效的漏洞挖掘技术。可采用的工具包括IDAPro、REC反编译工具、WDASM等。其中IDAPro提供了一个开放式的架构,包括API接口及

SDK,用户可以通过编写特定目的的自动化的脚本对反汇编数据库内的内容进行处理。

以缓冲区溢出为例来说明如何编写脚本进行自动分析。很多软件程序会在环境变量处理中出现缓冲区溢出,最常见的是getenv()调用后很快就对返回结果进行strcpy()/sprintf()操作,而在此之前没有调用strlen()判断返回值的长度是否小于缓冲区大小,从而导致安全问题。可以根据这个特性编写IDC脚本对目标实施几步搜索:

3.2输入追踪测试

--

a)如果找到getenv()调用就记录调用处的位置;

b)在getenv()调用的后面一段范围内搜索strcpy()/sprintf()调用,如果找到则记录调用处位置;

现场总线技术应用200例》

/:

您的论文得到两院院士关注

软件时空

c)在getenv()调用和strcpy()/sprintf()调用之间查找是否出现过strlen()调用,如果没有出现过则报警,在IDA的信息栏中显示getenv()调用的地址。

根据以上算法编写相应的IDC脚本,然后在对可执行码反汇编结束后执行该脚本。如果被测试的可执行码中有函数与以上算法所描述的规则相匹配,就能够很快地定位漏洞。

wcsncat()这个函数,在根据函数的交叉索引,定位到调用此导入函数的代码位置,其地址如图2所示为sub_100B425。

通过对这段子程序的分析,可以发现子程序首先检查其第一个参数指针所指向的字符串是不是空串,如果是空串,就根据JZ指令转到loc_100B4D1;否则,执行下一条指令。如果不是空串,那么可以看到寄存器被设置的值为103h即259字节,所以分配的缓冲区的大小为259字节。从图2中可以看出在连续6次对wcsncat()调用时,这个值没有被更新,字符串会多次添加到目标缓冲区,但是允许的最大字符长度却没有改变,因此该程序存在缓冲区溢出安全漏洞。前面的测试结果验证了该漏洞的存在。

4基于逆向工程的软件漏洞挖掘实例

如果在IE浏览器URL栏中执行hcp://命令,

帮助和支持中心”应用WindowsXP操作系统会启动“

程序。观察进程列表可以知道这个程序所对应的可执行文件是Helpctr.exe。把hcp://w.w.w.w.w.w.w.w.w.w.w.

w.w.w.w.w.w.w.w.w.w.w.w格式的URL提交给IE浏览器就会引起helpctr.exe的执行。按照上面的格式逐渐增加URL输入的长度,经过多次测试可知,在URL字符串长度大于259字节时会引起应用的异常,此时

5结语

通常情况下,软件厂商不愿提供源码,有的时候软件是连接库的形式,或者是用汇编码编写。在这种情况下,需要源码的漏洞挖掘静态分析技术就无法应用,而基于逆向工程的软件漏洞挖掘技术具有不依赖源码的优点。

本文作者创新点:总结了四种基于逆向工程的软件漏洞挖掘技术的原理、特性、适用范围和优缺点,通过挖掘helpctr程序中存在的缓冲区溢出安全漏洞的实例证明了逆向工程技术在漏洞挖掘领域的有效性。

参考文献:

[1]王前,余静,陈性元,谢寿生.安全隐患检测系统的设计与实现[J].微计算机信息,2005,10-3:3-4

helpctr.exe程序不能正常启动。这预示着可能是由输入点所引起的一个安全漏洞。采用输入追踪测试技术,并结合调试记录,可以帮助定位缺陷代码。测试环境是未安装ServicePacket补丁的Win-

当程序崩溃时,使用dowsXPProfessional简体中文版。

系统的实时调试工具记录下程序异常时堆栈调用的情况,所产生的栈记录如图1所示。

术创新

图1程序崩溃时堆栈调用记录

[2]M.Rekoff.Onreverseengineering[J].IEEETransactionsonSystems,ManandCybernetics,1985;15(2):244-252

[3]GregHoglund.软件剖析—代码攻防之道[M].北京:清华大学出版社,2005

[4]HalvarFlake.StructuralComparisonofExecutableObjects[J].DIMVA2004:161-173

作者简介:徐良华,(1963-),男,安徽无为人,高工,博士生,研究方向:网络攻防,E-mail:xulh56@yahoo.com.cn;孙玉龙(1980-),男,河南安阳人,硕士,研究方向:网络攻防;高丰(1972-),男,浙江丽水人,高工,博士,研究方向:网络攻防;朱鲁华(1964-),男,江苏盐城人,高工,教授,博导,博士,主要研究方向:操作系统、网络攻防。

Biography:XuLianghua,male,bornin1963,nowworkingintheJiangnanInstituteofComputingTechnology,presentresearchdirection:networkattackanddefense.

图2调用wcsncat()的子程序的控制流程图

(450002河南郑州信息工程大学信息工程学院)徐良华(214083江苏无锡江南计算技术研究所)徐良华孙玉龙高丰朱鲁华

(InformationEngineeringUniversity,ZhengzhouHenan450002,China)Xu,Lianghua

(JiangnanInstituteofComputingTechnology,WuxiJiangsu214083,China)Xu,LianghuaSun,YulongGao,FengZhu,Luhua

分析栈记录,可以发现程序崩溃时最后调用的函数为wcsncat()。查wcsncat()可能就是引起错误的所在。阅相关资料,可以知道wcsncat()的语义是将用户所提供的源字符串添加到目标字符串的末尾,其中的第三个参数为可添加的最大字符数。通过IDA对helpctr.exe进行反汇编。利用IDA的导入函数窗口栏查找

PLC技术应用200例》

通讯地址:(214083江苏省无锡市35信箱381号)徐良华

(投稿日期:2005.12.16)(修稿日期:2006.1.18)

:360元/年

-261-


相关内容

  • 网络安全知识题库中学组C
    江苏省青少年网络信息安全知识竞赛试题 (中学组C) 参赛须知: 一.答题方法:本卷共100题,每题有ABCD四个答案,其中只有一个正确答案,请在答题卡上将你认为正确的选项涂黑.答题卡不得涂改,复印无效.试卷满分100分,每题1分. 二.参赛 ...
  • XX数据中心安全规划方案
    XX 数据中心信息系统安全建设项目 技术方案 目录 1. 项目概述 ...................................................................................... ...
  • 商业银行会计电算化中的风险隐患和对应措施
    [摘 要] 伴随着中国计算机和互联网的迅速发展,目前商业银行的竞争愈发激烈.衡量商业银行的发展情况,重要的考量这个银行的客户数量.AUM资金量.中间业务的拓展.公司工资代发数等.经实际工作调查,商业银行的这些业绩与客户的体验感息息相关.为了 ...
  • 计算机网络工程师笔试面试题汇总
    网路学员面试常见问题: 1.请你修改一下LINUX的视频驱动和声音驱动 答: redhatlinux中用sndconfig来设置声卡,如果没有某个模块,就需要重新编译内核(编译最新发布的linux 内核),如果还不行,只好用ALSA 音效驱 ...
  • 郑州大学计算机研究生导师信息
    1. 导师姓名:范 明 科研方向:数据库 197k年郑州大学毕业,后在美国.加拿大进修及合作研究,教授,硕士生导师.省重点学科计算机软件与理论的学术带头人,兼任中国计算机学会数据库专业委员会委员.中国计算机学会CAD与计算机图形学专业委员会 ...
  • 等保二级管理要求
    1.1 管理要求 1.1.1 安全管理制度 1.1.1.1 管理制度(G2) 本项要求包括: a) 应制定信息安全工作的总体方针和安全策略,说明机构安全工作的总体目标.范围.原则和安全框架等: b) 应对安全管理活动中重要的管理内容建立安全 ...
  • 电力局网络安全系统方案
    淮北师范大学 网络安全方案课程设计 电力局网络安全系统 学院: 计算机科学与技术学院 2012年11月 8日 目 录 目 录 ......................................................... ...
  • 住建部20**年-20**年建筑业信息化发展纲要
    住建部2011-2015建筑业信息化发展纲要 深入贯彻落实科学发展观,坚持自主创新.重点跨越.支撑发展.引领未来的方针,高度重视信息化对建筑业发展的推动作用,通过统筹规划.政策导向,进一步加强建筑企业信息化建设. 1 各省.自治区住房和城乡 ...
  • 信息技术与信息安全20**年0712最全
    2014年度信息技术与信息安全公需科目(20140712更新) 第一部分单选题: 1.特别适用于实时和多任务的应用领域的计算机是(D). A.巨型机 B.大型机 C.微型机 D.嵌入式计算机 2.负责对计算机系统的资源进行管理的核心是(C) ...
  • 程序员的12个目标
    程序员的12个目标 对程序员们来说挑战自我非常重要,要么不断创新,要么技术停滞不前.新年伊始,我整理了12个月的目标,每个目标都是对技术或个人能力的挑战,而且可以年复一年循环使用. 01. 变得有耐心 02. 保持健康 03. 拥抱变化带来 ...