一种二进制代码缓冲区溢出漏洞的检测器及其检测方法

文档序号:6584665阅读:192来源:国知局

专利名称::一种二进制代码缓冲区溢出漏洞的检测器及其检测方法
技术领域
:本发明涉及一种在二进制代码中挖掘缓冲区溢出漏洞的技术,确切地说,涉及一种基于符号执行并结合实际执行的二进制代码缓冲区溢出漏洞的检测器及其检测方法,属于信息安全中的软件安全
技术领域

背景技术
:缓冲区的溢出漏洞检测技术,根据其分析的不同对象,通常分为两种针对源代码的源码安全漏洞审计和针对二进制代码的逆向安全漏洞分析。其中基于二进制代码的可执行程序缓冲区溢出漏洞的挖掘或检测技术,又分为静态分析法和动态测试法两种。静态分析法是利用诸如IDAPro等逆向工具将二进制代码反汇编成汇编代码,得到程序的控制流图和函数调用关系,再通过分别分析汇编代码、有向图和污点数据传播等手段来寻找漏洞。这种方法不需要运行程序,只是静态分析二进制程序,因此漏洞挖掘的开销小;但缺点是误报率高,难于准确定位漏洞。动态测试法是用一种以漏洞挖掘为目标的随机黑盒测试方法、即FUZZ方法进行测试,通过构造可能导致程序出现问题的输入数据进行自动测试。如果程序在某个特定的测试中产生了崩溃现象,则说明存在漏洞。这种通过实际运行发现缓冲区溢出漏洞的动态测试法的优点是非常准确。然而,该测试方法只是基于二进制代码,因此,效率不高,而且需要预先估计程序漏洞位置,以及相应的输入和输出,因而发现的漏洞种类有限,代价高。上述静态分析和动态测试的两种方法各有利弊,如何融合两种技术、取长补短,以提高漏洞挖掘的效率是当前一个重要课题,由此引入了符号执行技术。符号执行技术是通过符号表达式来模拟程序的执行。程序的输出被表示成包含这些符号的逻辑或数学表达式。由于不是真正执行程序,故应用该技术的成本小、效率高。国外的一些漏洞挖掘工具,如EXE(ExecutiongeneratedExecutions)和KLEE(EXE的改进版本)都是采用这种方式并取得了良好的效果。然而,上述应用都是针对源码进行分析的,当它用于对汇编代码(即对二进制代码进行反汇编得到的)进行分析时,会遇到下述一些难题(1)识别变量问题。比如在一段反汇编后的代码中,一条指令中出现了内存操作数DWORDPTR[ESP+4],另一条指令中出现了内存操作数DW0RDPTR[EBP-10],因不知道ESP和EBP的真实值,因此无法判断这两个内存操作数是否指向同一内存地址。所以针对汇编代码的符号执行无法保证其准确性。(2)指针问题。比如下述代码M0VEAX,variableMOVEBX,DWORDPTR[EAX]MOVEDX,DWORDPTR[EBX]经过上面两条指令,EBX中的值相当于内存地址[variable]中的值,EDX则相当于[[variable]]。这些指令在c语言中相当于指针的操作,对于符号执行求解是相当困难的。(3)循环问题。符号执行不是真实执行,所以确定循环的次数十分困难,有些技术方案对每个循环都假设只循环1次,这样做确实可以简化问题复杂度,但是可能影响准确度;另一方面,如果把每增加一次循环都当作一条新的路径,又会引起路径爆炸。(4)通过汇编代码对程序进行的解析并不全面,虽然汇编代码表示了指令的操作,但没有表示出操作的全部影响,有些指令在执行操作的同时,会设置相应标志位,这些标志位又可能影响到紧随其后的条件跳转指令。这些信息对理解二进制代码输入对控制流的影响非常重要,但是,单纯的汇编语言没有提供这些信息。由于存在上述问题,在二进制代码安全检测和漏洞挖掘中符号执行的应用比较少。北京大学开发的一款针对二进制代码进行整数溢出漏洞的挖掘工具IntScope,是目前比较成功的一种应用。IntScope开发了一种名为PANDA的中间语言,首先将汇编代码转化为PANDA,然后在此基础上进行静态的符号执行和污点分析,从而回避了直接对汇编代码进行符号执行的难题。然而IntScope仅能用于检测整数溢出漏洞,过于局限。因此,如何融合动态测试和静态分析的优点,尽快开发实现一种通用的二进制代码缓冲区溢出漏洞的检测器,实现高效、自动化地挖掘缓冲区溢出漏洞的课题,就成为业内科技人员关注的新焦点。
发明内容有鉴于此,本发明的目的是提供一种基于符号执行并结合实际执行的二进制代码缓冲区溢出漏洞的检测器及其检测方法,本发明不同于静态的符号执行,它是通过自己开发的调试器模块动态加载程序,使得符号执行与单步实际执行同步进行,应用这个模型来解决二进制代码分析中的上述难点。这种返回对于二进制程序的路径覆盖测试和溢出漏洞检测工作都能起到极大的促进作用。为了达到上述目的,本发明提供了一种基于符号执行并结合实际执行的二进制代码缓冲区溢出漏洞的检测器,其特征在于所述检测器用于监测Windows平台上运行的所有可移植、可执行PE(PortableExecutable)格式的可执行EXE(Executable)程序和相关动态链接库DLL(DynamicLinkLibrary)文件中的代码,即该检测器能够在不需要源代码的条件下,检测Windows平台下各种可执行程序的缓冲区的溢出漏洞,并在发现溢出漏洞的同时,给出漏洞成因的相关信息;该检测器设有下述六个软件功能模块调试器模块,负责加载所述可执行程序并使其处于调试运行状态,再解析PE文件结构,获取所述可执行程序的二进制代码和相关信息,并提供包括断点、单步执行、远程内存和寄存器访问的多种功能;输入点定位模块,负责定位所述可执行程序的输入点给指定的输入应用编程接口API(ApplicationProgrammingInterface)函数下断点,以便当所述可执行程序触发到断点时,根据具体函数选择相应的参数处理子程序,获取外部输入的信息,建立原始符号变量链表,供符号执行模块调用;反汇编模块,负责将机器指令反汇编成汇编指令,再将该汇编指令按其格式分解为操作类型、操作数和操作数位数,填充到指令信息结构体中,供符号执行模块使用;符号执行模块,负责将所述可执行程序的执行流程表示为符号变量的表达式,该模块的输出是符号变量控制的路径约束条件集合和条件跳转地址记录,其中约束条件集合和跳转地址记录供循环操作分析模块分析复杂循环,约束条件集合还供智能FUZZ模块调用生成测试用例;设有顺序连接的不同功能的四个单元符号识别单元、中间语言表示单元、变量维护单元和路径条件输出单元;循环操作分析模块,设有两个单元循环识别单元和循环分析单元;该循环操作分析模块利用符号执行模块提供的路径约束条件集合和条件跳转地址记录识别二进制代码中的循环操作,并判断该循环操作是否存在溢出漏洞;智能随机黑盒测试方法FUZZ模块,设有两个单元用例生成单元和FUZZ测试单元;该智能FUZZ模块利用符号执行模块提供的路径约束条件集合,生成针对不同路径的测试用例并进行FUZZ测试;同时选择其中少数测试用例进行新一轮的调试器加载后的符号执行,以探索更多的路径和通过如此循环操作,不断探索所述可执行程序路径新的分支。所述符号执行模块中顺序连接的四个单元的功能是符号识别单元,用于识别汇编指令中的各操作数是否为符号变量即通过解析反汇编模块输出的汇编结构体获取待识别操作数,再分别查询原始符号变量链表和中间符号变量链表来确定该操作数是变量还是常量,所述中间符号变量是执行过程中由原始符号变量产生的临时变量;当一条指令中包含符号变量操作数时,该符号识别单元将发出消息,表明该指令需要进行符号执行操作;中间语言表示单元,用于将反汇编模块输出的汇编结构体信息作为输入,再以符合简单定理证明器STP(SimpleTheoremProver)约束求解器语法规范的表达式输出;因汇编指令没有明确表示出部分机器指令对标志寄存器的影响,由该中间语句表示单元给出汇编指令的相应影响的表达式;标志寄存器的各标志位表达式会影响条件跳转指令对路径的选择,即输入变量会对路径产生影响;该中间语言表示单元是根据符号识别单元发出的消息决定是否进行中间语言表示,为提高效率,对于不含符号变量的指令都不进行中间语言表示;变量维护单元,负责维护原始符号变量链表和中间符号变量链表;因不同指令会对变量产生包括增加、更新或删除变量的不同影响,该变量维护单元根据符号识别单元产生的消息和操作指令的类型实时更新原始符号变量链表和中间符号变量链表,以保证下一次进行符号识别时,能有正确的变量链表供参考;路径条件输出单元,负责提取条件跳转指令地址和抽取路径条件表达式,并根据实际执行结果确定表达式的值为真或假;在符号执行过程结束后,分别以文本形式保存条件跳转地址记录和路径约束条件集合。所述循环操作分析模块中两个单元的功能是循环识别单元,负责识别二进制代码中受输入影响的危险循环;所述循环有两种由汇编指令中的REP指令或LOOP指令实现的简单循环,以及由条件转移指令Jcc实现的复杂循环;前者能直接分析,后者要从二进制代码中加以识别;识别方法是先在所述可执行程序的动态符号执行过程中,记录该可执行程序中以基本块的块首地址表示的基本块执行轨迹,然后搜索每个出现过的块首地址的出现次数和出现位置,位于同一个循环的基本块的出现次数相同或相差一次,且出现的位置临近,以该特征来识别循环;循环分析单元,对汇编指令中的REP指令或LOOP指令实现的循环,在所述可执行程序的符号执行期间进行实时检查,通过调用符号识别功能检查计算机中央处理器中的ECX寄存器是否为符号变量来进行分析若ECX为变量,证明循环次数受外部输入控制,则向用户发出该循环存在潜在威胁漏洞的报告;条件转移指令Jcc实现的循环要在符号执行后,再进行循环识别,然后提取整合的循环条件,生成分析报告,最终由安全人员进行分析判断。所述智能FUZZ模块中两个单元的功能是用例生成单元,通过设定规则对符号执行生成的条件集合进行有规律的更改,然后用STP约束求解器求解修改后的条件集合,如有解,证明存在更改后的路径,且STP算出的约束解是该单元生成的符合该路径的测试用例;通过不断更改条件集合,求解生成的多个测试用例都交给FUZZ单元进行测试;同时,通过设定规则,将少数有代表性的测试用例送交调试器模块重新测试,从而生成新的路径约束,以供不断检测更多路径;FUZZ测试单元,负责对用例生成模块的测试用例进行测试,并记录所发生的异常情况,以供分析人员进行分析。为了达到上述目的,本发明还提供了一种基于二进制代码缓冲区溢出漏洞的检测器的检测方法,其特征在于包括下列操作步骤(1)先选择进行测试的可执行程序,如果需要测试可执行程序打开文件的操作,则事先准备一份标准的测试文件,再选择测试信息输出的路径,然后用调试器模块加载可执行程序,获得二进制代码;(2)输入点定位模块通过匹配搜索输入表,为搜索到的输入API函数下断点,并在调试状态下运行该可执行程序;当该可执行程序执行到输入函数的断点时,根据具体的函数进行相应处理,获取有用的参数和返回值;再将外部数据输入到内存,建立原始符号变量链表,以供后续模块开始进行分析处理;(3)反汇编模块按其格式将机器码解析成操作类型、操作数和操作数位数,并填入到指令信息结构体,为符号执行模块提供该结构体;(4)符号执行模块根据指令信息结构体的内容进行符号执行处理,同时循环分析操作模块实时检测汇编指令中REP指令和LOOP指令,以及记录汇编指令中的条件转移Jcc指令的跳转地址;在符号执行后,再对该条指令进行实际执行,然后返回步骤(3),处理下一条指令;直到符号执行结束的条件被满足时,执行后续步骤(5);(5)符号执行结束,以文件形式保存所生成的路径条件表达式集合,即路径约束条件集合;并输出条件跳转地址记录;(6)循环操作分析模块对代码条件转移Jcc循环进行识别分析,通过搜索符号执行中的条件跳转地址记录,找到循环模式和判断是否属于同一循环的地址,并在符号执行中生成的路径约束条件集合中提取属于同一循环中的条件,生成分析报告,供分析人员参考;(7)智能FUZZ模块接收到符号执行模块生成的路径约束条件集合后,先按设定规则对该路径约束条件集合进行处理改变部分条件产生新的条件集合,再对每个路径约束条件集合分别用STP约束求解器进行约束求解;并根据求解结果执行后续操作如有解,则该结果为待测试的测试用例,执行后续步骤(8);如无解,说明产生的条件集合不成立,继续求解其他路径约束条件;(8)使用传统的FUZZ工具执行步骤(7)所生成的测试用例;从这些测试用例中选取部分测试用例,重新调用调试器模块,进行新一轮的检测,生成新的路径约束条件集合,以探索更多路径。所述步骤(4)进一步包括下列操作内容(41)符号识别单元处理指令信息结构体,识别其中的各个操作数类型,再在原始符号变量链表和中间符号变量链表中分别搜索每个操作数,如果某个操作数存在于所述两个变量链表中,则该操作数为符号变量,执行后续步骤(42),对该语句作后续处理;如果该指令中的各个操作数都不是符号变量,则该语句与符号执行无关,直接返回步骤(3)处理下一条指令;(42)中间语言表示单元将需要符号执行的指令由汇编指令转换为符号执行的中间语言,该中间语言不仅表示汇编指令的操作,同时还给出了汇编指令中隐含的表示标志寄存器状态的标志位表达式;(43)为避免部分汇编指令对原始符号变量链表和中间符号变量链表的影响,准确运行后面指令的符号执行,变量维护单元实时更新该两个变量链表;(44)路径输出单元结合实际执行判断产生的路径条件的真假,并相应产生路径条件表达式,同时记录该条件跳转指令地址;再判断符号执行是否终止,如终止,顺序执行步骤(5);否则,返回执行步骤(3)处理下一条指令。所述步骤(42)中,所述表示标志寄存器状态的标志位包括零标志ZF(ZeroFlag)位、奇偶标志PF(ParityFlag)位、进位标志CF(CarryFlag)位、符号标志SF(SignedFlag)位和溢出标志OF(OverflowFlag)位。所述步骤(7)中,所述处理路径条件集合的设定规则有两个从最后一个条件向前依次求反;以及如果某一条件被取反后,则其后条件作废。本发明是一种基于符号执行并结合实际执行的二进制代码缓冲区的溢出漏洞检测器及其检测方法,本发明检测器是以可执行程序为检测对象,对二进制代码进行符号执行和实际执行获得路径条件集合,并在执行过程中对危险循环操作进行动态检测;还在符号执行对程序的理解基础上,进行智能FUZZ测试,通过动态分析和测试两种手段自动化地挖掘或检测缓冲区溢出漏洞。相对于目前现有的其他相关技术,本发明的技术创新点是1、对二进制代码进行符号执行并结合实际执行来分析,在可执行程序运行的真实环境中获取非符号变量值,保证了符号执行在二进制代码分析中的可行性和精确性。2、提供包括汇编指令中隐含的标志寄存器状态的标志位表达式的中间语言,使得中间语言的表达能够更符合机器码执行的真实情况,有利于二进制代码路径的分析。3、符号执行前期加入了符号识别,使符号执行只对包含符号变量的语句进行分析,提高了符号执行的效率。4、本发明检测缓冲区溢出漏洞的检测模型的建模思路,抓住了漏洞出现的本质因素未约束或未正确约束的循环,并实现了对循环的动态检测和分析。5、只分析接受外部输入影响的循环操作,提高了循环检测的分析效率。6、检测溢出漏洞的操作全部自动运行,操作人员只需选择准备检测的可执行程序,并设置相关的保存目录,剩下的漏洞检测工作完全交给本发明漏洞检测器自动执行。因此,本发明的优点和效果是相对于静态分析技术,本发明是采用动态执行可执行程序的方法,能够获得该程序实际运行环境中的相应数据,因此,误报率极低。相对于通用FUZZ技术,因本发明采用符号执行方法,能够理解程序的逻辑,因此本发明生成的测试用例用于FUZZ测试时,产生的路径针对性更强,能有效縮小测试范围,极大地提高了溢出漏洞的检测效率。再者,本发明对缓冲区溢出漏洞的建模思路抓住了漏洞出现的本质未约束或未正确约束的循环操作。因此无论是堆溢出、栈溢出、还是整数溢出,本发明都能将其全部检测出来。此外,本发明缓冲区溢出漏洞检测器只对可执行程序本身进行分析,不要提供源代码,而且与源代码种类和开发工具无关,适用场合非常广泛。通常的FUZZ技术在触发漏洞时,仅能提供漏洞触发点的寄存器环境等现场信息,分析人员想要分析漏洞的成因,除了要求分析人员具备相应经验,还要投入大量时间。而本发明采用的符号执行技术,在定位漏洞的同时,还能提供输入数据的传播路径以及其它有关漏洞形成原因的重要信息,为分析人员分析漏洞起到极大的帮助作用。最后,虽然本发明缓冲区溢出漏洞检测器及其检测方法都是针对windows平台,但是,所采用的漏洞检测方法与相应技术具有通用性,因此本发明可以方便地移植到Li皿x平台。总之,本发明具有很好的推广应用前景。图1是本发明二进制代码缓冲区溢出漏洞的检测器的组成结构示意图。图2是本发明二进制代码缓冲区溢出漏洞的检测器的检测方法流程图。图3是本发明检测方法中符号执行模块的操作过程流程图。图4是本发明检测方法中的多指令循环识别过程的分析流程图。具体实施例方式为使本发明的目的、技术方案和优点更加清楚,下面结合附图对本发明作进一步的详细描述。本发明是一种基于符号执行并结合实际执行的二进制代码缓冲区的溢出漏洞检测器,它能够在不需要源代码的条件下,监测Windows平台上运行的所有PE格式的可执行EXE程序和相关动态链接库DLL文件中的代码,对所有PE格式的可执行程序进行路径覆盖测试和溢出漏洞检测;以便检测Windows平台下各种可执行程序的缓冲区的溢出漏洞,并在发现溢出漏洞的同时,给出漏洞成因的相关信息。参见图l,介绍本发明溢出漏洞检测器的结构组成,其设有六个软件功能模块,其中调试器为整个溢出漏洞检测器提供了二进制程序动态加载调试的系列功能,具体包括Windows平台下可移植、可执行PE(PortableExecutable)程序格式的解析,断点设置与清除,单步执行,内存与寄存器值查看等功能。反汇编模块负责反汇编机器码,生成解码指令信息的指令信息结构体。符号执行模块负责记录以程序外部输入为变量的、与程序路径对应的条件集合。循环操作分析模块在符号执行中检测单指令循环安全性,在符号执行结束后分析多指令循环安全性,以定位符合本发明检测器所建缓冲区溢出模型的漏洞。智能FUZZ模块以符号执行记录的路径条件为依据测试可执行程序的不同路径。下面具体说明各个软件功能模块的具体作用1、调试器模块,负责加载可执行程序并使其处于调试运行状态,再解析PE文件结构,获取可执行程序的二进制代码和相关信息,并提供断点功能、单步执行功能、远程内存功能和寄存器访问功能,供其他模块调用,以支持动态分析可执行程序。2、输入点定位模块,负责定位可执行程序的输入点通过调试器模块的PE文件解析功能获得导入表信息后,搜索导入表中的输入API函数,在找到的API函数的入口地址处下Int3断点,以此定位输入点;以便当可执行程序触发到断点时,根据具体函数选择相应的参数处理子程序,获得外部输入的信息,建立原始符号变量链表,供符号执行模块调用。3、反汇编模块,负责将机器指令反汇编成汇编指令后,一方面将汇编指令输出到调试器的输出界面,另一方面将该汇编指令按其格式分解为操作类型、操作数和操作数位数,填充到一个指令信息结构体中,供符号执行模块使用。4、符号执行模块,负责将可执行程序的执行流程表示为符号变量的表达式,该模块的输出是符号变量控制的路径约束条件集合和条件跳转地址记录,其中约束条件集合和跳转地址记录供循环操作分析模块分析复杂循环,约束条件集合还供智能FUZZ模块调用生成测试用例;设有顺序连接的不同功能的符号识别、中间语言表示、变量维护和路径条件输出四个单元,其功能分别介绍如下符号识别单元,用于识别汇编指令中的各操作数是否为符号变量即通过解析反汇编模块输出的汇编结构体获取待识别操作数,再分别查询原始符号变量链表和中间符号变量(中间符号变量是执行过程中由原始符号变量产生的临时变量)链表来确定该操作数是变量还是常量;当一条指令中包含符号变量操作数时,符号识别单元将发出消息,表明该指令需要进行符号执行操作。中间语言表示单元,负责将反汇编模块输出的汇编结构体信息作为输入,再以符合STP约束求解器语法规范的表达式输出,同时给出汇编指令中隐含的对标志寄存器的影响的表达式,因汇编指令没有明确表示出部分机器指令对标志寄存器的影响;标志寄存器的各标志位表达式会影响条件跳转指令对路径的选择,即输入变量会对路径产生影响;该中间语言表示单元是根据符号识别单元发出的消息决定是否进行中间语言表示,为提高效率,对于不含符号变量的指令都不进行中间语言表示。变量维护单元,负责维护原始变量和中间变量链表;因不同的指令会对变量产生不同的影响(如变量的增加、更新、删除等),变量维护单元根据符号识别模块产生的消息和操作指令的类型实时更新原始符号变量链表和中间符号变量链表,以保证下一次进行符号识别时,能有正确的变量链表供参考。路径条件输出单元,负责提取条件跳转指令地址和抽取路径条件表达式,并根据实际执行结果确定表达式的值为真或假;在符号执行过程结束后,分别以文本形式保存条件跳转地址记录和路径约束条件集合,供智能FUZZ模块使用生成测试用例。5、循环操作分析模块,缓冲区溢出通常是由不正确的循环操作引起的,该循环操作分析模块利用符号执行模块提供的路径约束条件集合和条件跳转地址记录识别二进制代码中的循环操作,并判断该循环操作是否存在溢出漏洞;设有两个单元循环识别单元和循环分析单元,其功能分别介绍如下;循环识别单元,负责识别二进制代码中的受输入影响的危险循环;循环有两种一种是由汇编指令中的REP指令或LOOP指令实现的简单循环,这种循环能直接分析;另一种是通过条件转移指令Jcc实现的复杂循环,它要先从二进制代码中识别出来。识别方法是先伴随可执行程序的动态符号执行过程中,记录该程序的基本块执行轨迹(以基本块的块首地址表示),然后搜索每个出现过的块首地址出现的次数和出现的位置,位于同一个循环的基本块出现的次数相同或相差一次,且出现的位置临近,以该特征来识别循环。循环分析单元,对汇编指令中的REP指令或LOOP指令实现的循环,在可执行程序的符号执行期间进行实时检查,通过调用符号识别功能检查计算机中CPU的ECX寄存器是否为符号变量来进行分析若ECX为变量,证明循环次数受外部输入控制,则向用户发出该循环存在漏洞潜在威胁的报告;条件转移指令Jcc实现的循环则要在符号执行后,再进行循环识别,然后提取整合的循环条件,生成分析报告,最终由安全人员进行分析判断。6、智能FUZZ模块,负责利用符号执行模块提供的路径约束条件集合,生成针对不同路径的测试用例并进行FUZZ测试;同时选择其中少数测试用例进行新一轮的调试器加载后的符号执行,以探索更多的路径和通过如此循环操作,不断探索可执行程序路径新的分支;设有两个单元用例生成单元和FUZZ测试单元,这两个单元的功能分别介绍如下用例生成单元,通过设定规则对符号执行生成的条件集合进行有规律的更改,然后用STP约束求解器求解修改后的条件集合,如有解,证明存在更改后的路径,且STP算出的约束解是该单元生成的符合该路径的测试用例;通过不断更改条件集合,求解生成的多个测试用例都交给FUZZ单元进行测试;同时,通过设定规则,将少数有代表性的测试用例送交调试器模块重新测试,从而生成新的路径约束,以供不断检测更多路径。FUZZ测试单元,负责对用例生成模块的测试用例进行测试,并记录所发生的异常情况,以供分析人员进行分析。本发明还提出一种采用该溢出漏洞检测器基于符号执行并结合实际执行的检测方法,用于针对Windows平台下所有PE格式的可执行程序进行缓冲区溢出漏洞的挖掘和检参见图2,具体介绍本发明溢出漏洞检测器的检测方法的主要操作步骤(1)先选择进行测试的可执行程序,如果需要测试可执行程序打开文件的操作,则事先准备一份标准的测试文件,再选择测试信息输出的路径,后用调试器模块加载可执行程序,获得二进制代码。(2)输入点定位模块通过匹配搜索输入表,为搜索到的输入API函数下断点,并在调试状态下运行该可执行程序;当可执行程序执行到输入函数的断点时,根据具体的函数进行相应处理,获取有用的参数和返回值;再将外部数据输入到内存,建立原始符号变量链表,以供后续的符号执行模块开始分析处理;(3)反汇编模块按其格式将机器码解析成操作类型、操作数和操作数位数等信息,并填入到指令信息结构体,为符号执行模块提供该结构体。(4)符号执行模块根据指令信息结构体的内容进行符号执行处理,同时循环分析操作模块实时检测汇编指令中REP指令和LOOP指令,以及记录汇编指令中的条件转移Jcc指令的跳转地址;在符号执行后,再对该条指令进行实际执行,然后返回步骤(3),处理下一条指令;直到符号执行结束的条件被满足时,执行后续步骤(5);该步骤又细分为下述各具体操作内容(参见图3所示)。(41)符号识别单元处理指令信息结构体,识别其中的各个操作数类型(内存操作数、寄存器操作数、常数),再在原始符号变量链表和中间符号变量链表中分别搜索每个操作数,如果某个操作数存在于该两个变量链表中,则该操作数为符号变量,则执行后续步骤(42),对该语句作后续处理;如果该指令中的各个操作数都不是符号变量,则该语句与符号执行无关,直接返回步骤(3)处理下一条指令;(42)中间语言表示单元将需要符号执行的指令由汇编指令转换为符号执行的中间语言,该中间语言不仅表示汇编指令的操作,同时还给出了汇编指令中隐含的表示标志寄存器状态的标志位表达式;具体地说,就是汇编指令中涉及计算机中的零标志ZF(ZeroFlag)位、奇偶标志PF(ParityFlag)位、进位标志CF(CarryFlag)位、符号标志SF(SignedFlag)位和溢出标志0F(0verflowFlag)位的各个寄存器的标志位表达式。这些标志位能决定条件跳转指令是否产生跳转,因此记录各标志位表达式就可得到以前操作变量对程序路径的影响。(43)部分汇编指令会影响到符号变量链表,如产生新的中间符号变量、某一中间符号变量因写入常数而要从符号变量链表中删除、某一中间符号变量表达式要更新等,为避免部分汇编指令对原始符号变量链表和中间符号变量链表的影响,准确运行后面指令的符号执行,变量维护单元实时更新该两个变量链表。(44)路径输出单元结合实际执行判断产生的路径条件的真假,并相应产生路径条件表达式,同时记录该条件跳转指令地址;再判断符号执行是否终止,如终止,顺序执行步骤(5);否则,返回执行步骤(3)处理下一条指令。(5)符号执行结束,以文件形式保存所生成的路径条件表达式集合,即路径约束条件集合;并输出条件跳转地址记录。(6)循环操作分析模块对代码条件转移Jcc循环进行识别分析,通过搜索符号执行中的条件跳转地址记录,找到循环模式和判断是否属于同一循环的地址,并在符号执行中生成的路径约束条件集合中提取属于同一循环中的条件,生成分析报告,供分析人员参考(参见图4所示)。(7)智能FUZZ模块接收到符号执行模块生成的路径约束条件集合后,先按设定规则处理该路径约束条件集合改变部分条件产生新的条件集合,再对每个路径约束条件集合分别用STP约束求解器进行约束求解;并根据求解结果执行后续操作如有解,则该结果为待测试的测试用例,执行后续步骤(8);如无解,说明产生的条件集合不成立,继续求解其他路径约束条件。(8)使用传统的FUZZ工具执行步骤(7)成功生成的测试用例;从这些测试用例中选取部分测试用例,重新调用调试器模块,进行新一轮的检测,生成新的路径约束条件集合,以探索更多路径。本发明已经进行了实施试验,所有的结果是成功的,实现了发明目的。权利要求一种基于符号执行并结合实际执行的二进制代码缓冲区溢出漏洞的检测器,其特征在于所述检测器用于监测Windows平台上运行的所有PE格式的可执行EXE程序和相关动态链接库DLL文件中的代码,即该检测器能够在不需要源代码的条件下,检测Windows平台下各种可执行程序的缓冲区的溢出漏洞,并在发现溢出漏洞的同时,给出漏洞成因的相关信息;该检测器设有下述六个软件功能模块调试器模块,负责加载所述可执行程序并使其处于调试运行状态,再解析PE文件结构,获取所述可执行程序的二进制代码和相关信息,并提供包括断点、单步执行、远程内存和寄存器访问的多种功能;输入点定位模块,负责定位所述可执行程序的输入点给指定的输入应用编程接口API函数下断点,以便当所述可执行程序触发到断点时,根据具体函数选择相应的参数处理子程序,获取外部输入的信息,建立原始符号变量链表,供符号执行模块调用;反汇编模块,负责将机器指令反汇编成汇编指令,再将该汇编指令按其格式分解为操作类型、操作数和操作数位数,填充到指令信息结构体中,供符号执行模块使用;符号执行模块,负责将所述可执行程序的执行流程表示为符号变量的表达式,该模块的输出是符号变量控制的路径约束条件集合和条件跳转地址记录,其中约束条件集合和跳转地址记录供循环操作分析模块分析复杂循环,约束条件集合还供智能FUZZ模块调用生成测试用例;设有顺序连接的不同功能的四个单元符号识别单元、中间语言表示单元、变量维护单元和路径条件输出单元;循环操作分析模块,设有两个单元循环识别单元和循环分析单元;该循环操作分析模块利用符号执行模块提供的路径约束条件集合和条件跳转地址记录识别二进制代码中的循环操作,并判断该循环操作是否存在溢出漏洞;智能随机黑盒测试方法FUZZ模块,设有两个单元用例生成单元和FUZZ测试单元;该智能FUZZ模块利用符号执行模块提供的路径约束条件集合,生成针对不同路径的测试用例并进行FUZZ测试;同时选择其中少数测试用例进行新一轮的调试器加载后的符号执行,以探索更多的路径和通过如此循环操作,不断探索所述可执行程序路径新的分支。2.根据权利要求1所述的检测器,其特征在于所述符号执行模块中顺序连接的四个单元的功能是符号识别单元,用于识别汇编指令中的各操作数是否为符号变量即通过解析反汇编模块输出的汇编结构体获取待识别操作数,再分别查询原始符号变量链表和中间符号变量链表来确定该操作数是变量还是常量,所述中间符号变量是执行过程中由原始符号变量产生的临时变量;当一条指令中包含符号变量操作数时,该符号识别单元将发出消息,表明该指令需要进行符号执行操作;中间语言表示单元,用于将反汇编模块输出的汇编结构体信息作为输入,再以符合简单定理证明器STP约束求解器语法规范的表达式输出;因汇编指令没有明确表示出部分机器指令对标志寄存器的影响,由该中间语句表示单元给出汇编指令的相应影响的表达式;标志寄存器的各标志位表达式会影响条件跳转指令对路径的选择,即输入变量会对路径产生影响;该中间语言表示单元是根据符号识别单元发出的消息决定是否进行中间语言表示,为提高效率,对于不含符号变量的指令都不进行中间语言表示;变量维护单元,负责维护原始符号变量链表和中间符号变量链表;因不同指令会对变量产生包括增加、更新或删除变量的不同影响,该变量维护单元根据符号识别单元产生的消息和操作指令的类型实时更新原始符号变量链表和中间符号变量链表,以保证下一次进行符号识别时,能有正确的变量链表供参考;路径条件输出单元,负责提取条件跳转指令地址和抽取路径条件表达式,并根据实际执行结果确定表达式的值为真或假;在符号执行过程结束后,分别以文本形式保存条件跳转地址记录和路径约束条件集合。3.根据权利要求1所述的检测器,其特征在于所述循环操作分析模块中两个单元的功能是循环识别单元,负责识别二进制代码中受输入影响的危险循环;所述循环有两种由汇编指令中的REP指令或LOOP指令实现的简单循环,以及由条件转移指令Jcc实现的复杂循环;前者能直接分析,后者要从二进制代码中加以识别;识别方法是先在所述可执行程序的动态符号执行过程中,记录该可执行程序中以基本块的块首地址表示的基本块执行轨迹,然后搜索每个出现过的块首地址的出现次数和出现位置,位于同一个循环的基本块的出现次数相同或相差一次,且出现的位置临近,以该特征来识别循环;循环分析单元,对汇编指令中的REP指令或LOOP指令实现的循环,在所述可执行程序的符号执行期间进行实时检查,通过调用符号识别功能检查计算机中央处理器中的ECX寄存器是否为符号变量来进行分析若ECX为变量,证明循环次数受外部输入控制,则向用户发出该循环存在潜在威胁漏洞的报告;条件转移指令Jcc实现的循环要在符号执行后,再进行循环识别,然后提取整合的循环条件,生成分析报告,最终由安全人员进行分析判断。4.根据权利要求1所述的检测器,其特征在于所述智能FUZZ模块中两个单元的功能是用例生成单元,通过设定规则对符号执行生成的条件集合进行有规律的更改,然后用STP约束求解器求解修改后的条件集合,如有解,证明存在更改后的路径,且STP算出的约束解是该单元生成的符合该路径的测试用例;通过不断更改条件集合,求解生成的多个测试用例都交给FUZZ单元进行测试;同时,通过设定规则,将少数有代表性的测试用例送交调试器模块重新测试,从而生成新的路径约束,以供不断检测更多路径;FUZZ测试单元,负责对用例生成模块的测试用例进行测试,并记录所发生的异常情况,以供分析人员进行分析。5.—种采用权利要求1所述的二进制代码缓冲区溢出漏洞的检测器的检测方法,其特征在于包括下列操作步骤(1)先选择进行测试的可执行程序,如果需要测试可执行程序打开文件的操作,则事先准备一份标准的测试文件,再选择测试信息输出的路径,然后用调试器模块加载可执行程序,获得二进制代码;(2)输入点定位模块通过匹配搜索输入表,为搜索到的输入API函数下断点,并在调试状态下运行该可执行程序;当该可执行程序执行到输入函数的断点时,根据具体的函数进行相应处理,获取有用的参数和返回值;再将外部数据输入到内存,建立原始符号变量链表,以供后续模块开始进行分析处理;(3)反汇编模块按其格式将机器码解析成操作类型、操作数和操作数位数,并填入到指令信息结构体,为符号执行模块提供该结构体;(4)符号执行模块根据指令信息结构体的内容进行符号执行处理,同时循环分析操作模块实时检测汇编指令中REP指令和LOOP指令,以及记录汇编指令中的条件转移Jcc指令的跳转地址;在符号执行后,再对该条指令进行实际执行,然后返回步骤(3),处理下一条指令;直到符号执行结束的条件被满足时,执行后续步骤(5);(5)符号执行结束,以文件形式保存所生成的路径条件表达式集合,即路径约束条件集合;并输出条件跳转地址记录;(6)循环操作分析模块对代码条件转移Jcc循环进行识别分析,通过搜索符号执行中的条件跳转地址记录,找到循环模式和判断是否属于同一循环的地址,并在符号执行中生成的路径约束条件集合中提取属于同一循环中的条件,生成分析报告,供分析人员参考;(7)智能FUZZ模块接收到符号执行模块生成的路径约束条件集合后,先按设定规则对该路径约束条件集合进行处理改变部分条件产生新的条件集合,再对每个路径约束条件集合分别用STP约束求解器进行约束求解;并根据求解结果执行后续操作如有解,则该结果为待测试的测试用例,执行后续步骤(8);如无解,说明产生的条件集合不成立,继续求解其他路径约束条件;(8)使用传统的FUZZ工具执行步骤(7)所生成的测试用例;从这些测试用例中选取部分测试用例,重新调用调试器模块,进行新一轮的检测,生成新的路径约束条件集合,以探索更多路径。6.根据权利要求5所述的方法,其特征在于所述步骤(4)进一步包括下列操作内容(41)符号识别单元处理指令信息结构体,识别其中的各个操作数类型,再在原始符号变量链表和中间符号变量链表中分别搜索每个操作数,如果某个操作数存在于所述两个变量链表中,则该操作数为符号变量,执行后续步骤(42),对该语句作后续处理;如果该指令中的各个操作数都不是符号变量,则该语句与符号执行无关,直接返回步骤(3)处理下一条指令;(42)中间语言表示单元将需要符号执行的指令由汇编指令转换为符号执行的中间语言,该中间语言不仅表示汇编指令的操作,同时还给出了汇编指令中隐含的表示标志寄存器状态的标志位表达式;(43)为避免部分汇编指令对原始符号变量链表和中间符号变量链表的影响,准确运行后面指令的符号执行,变量维护单元实时更新该两个变量链表;(44)路径输出单元结合实际执行判断产生的路径条件的真假,并相应产生路径条件表达式,同时记录该条件跳转指令地址;再判断符号执行是否终止,如终止,顺序执行步骤(5);否则,返回执行步骤(3)处理下一条指令。7.根据权利要求6所述的方法,其特征在于所述步骤(42)中,所述表示标志寄存器状态的标志位包括零标志ZF(ZeroFlag)位、奇偶标志PF(ParityFlag)位、进位标志CF(CarryFlag)位、符号标志SF(SignedFlag)位和溢出标志OF(OverflowFlag)位。8.根据权利要求5所述的方法,其特征在于所述步骤(7)中,所述处理路径条件集合的设定规则有两个从最后一个条件向前依次求反;以及如果某一条件被取反后,则其后条件作废。全文摘要一种二进制代码缓冲区溢出漏洞的检测器及其检测方法,检测器包括六个功能模块调试器模块、输入点定位模块、反汇编模块、符号执行模块、循环操作分析模块和智能FUZZ测试模块。本发明检测方法不同于静态的符号执行,它是通过自己开发的调试器模块动态加载程序,使得符号执行与单步实际执行同步进行,再应用这个模型来解决二进制代码分析中的各个难点,从而能够针对Windows平台下所有PE格式的可执行程序进行路径覆盖测试和溢出漏洞检测;在定位漏洞的同时,还能提供输入数据的传播路径及其它有关漏洞成因的重要信息,而且只对可执行程序本身进行分析,不需要源代码,与源代码种类和开发工具无关,适用场合广泛,故本发明推广应用前景看好。文档编号G06F21/22GK101714118SQ20091023768公开日2010年5月26日申请日期2009年11月20日优先权日2009年11月20日发明者国鹏飞,崔宝江,曾虎城申请人:北京邮电大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1