一种动态的二进制代码测试用例生成方法技术

技术编号:8022332 阅读:232 留言:0更新日期:2012-11-29 04:34
本发明专利技术公开了一种动态的二进制代码测试用例生成方法。实现动态的二进制插装工具,可收集二进制代码执行过程中,寄存器、内存、线程、系统调用、库加载等动态上下文信息,将此类信息传送到二进制代码翻译组件中,转化为一种中间语言,并在此中间语言上进行符号执行,传播符号输入,收集依赖于输入的路径约束。然后把此路径约束输入到路径生成组件中,提出一种新的同级分支路径变异算法及策略,在每次符号执行后尽可能多地生成新的路径约束,再使用定理证明器来求解新的路径约束,得到满足该路径约束的新输入,把新输入传送给二进制代码进行再一次具体执行,不断循环从新的执行中得到新的路径约束,生成新的输入,从而提高二进制代码覆盖率。

【技术实现步骤摘要】

本专利技术涉及到,可直接运行于Windows平台,且不需要被测试程序的源码,可在运行时生成新的输入以探测新的路径,适用于软件测试、漏洞挖掘、逆向工程等领域。
技术介绍
传统软件测试方法一般使用黑盒Fuzz测试,通过构造一组随机输入传递给程序,直到程序崩溃。这种方法较盲目,既无法获知哪些程序路径已经被执行,也无法有导向性地构造输入,使程序可执行到未被遍历过的路径。测试过程中的大部分时间都在重复执行着同样的路径,使测试时间成本过高。源码级的测试可以帮助程序员发现很多由于代码风格或错误的语法语义引起的BUG,但存在几个缺点1)无法发现程序运行时的BUG ;2)在很多情况下,源码并不是可及的;3)需对每一类程序设计语言分别考虑。 对于软件测试、漏洞挖掘等领域,往往需要考虑代码覆盖问题,尽可能多地覆盖二进制代码的执行路径,可以提高发现程序代码中BUG的可能性。然而,由于二进制代码中的分支数量非常多,使获取某一执行路径所对应的输入成为最难的研究问题之一。为解决这个问题,学术界提出了一种新的概念,符号执行,即把输入作为符号,然后通过静态解释源码的形式来收集约束,遇到分支时,同时展开两条路径,继续向下进行。符号执行的误报率极低,但是也存在一些弊端需要对未解释的函数进行建模,状态空间过大,效率较低。近年来,国外出现了一些基于动态执行路径,符号与具体执行混合的方法所实现的工具,如 DART、CUTE、Sage、Catchconv、Fuzzgrind 等。其中,DART 与 CUTE 同宗,它们使用同样的中间语言、插装方式及求解方法。Catchconv与Fuzzgrind为开源工具,都使用Valgrind作为其插装框架,只有微软的Sage是运行在Windows上,但未发布出来。在Linux下,大多数软件都为开源软件,可以使用很多源代码分析工具来检查源码中的错误,且在普通用户操作系统中,Windows系统占绝大比例,且大多程序都是源码无法获取,因此,Windows平台下的二进制代码路径探测的意义更为重大。本专利技术沿用这些工具的基本思想,即符号执行与具体执行结合的思路,采用了一种新的实现方案,实现动态的二进制代码插装工具收集二进制代码的运行时信息,使用VEX中间语言描述路径约束,使用STP定理证明器作为求解器,把这几种现有的工具有机结合起来,再辅助以提出的路径约束变异算法及同级分支路径变异策略,实现了 Windows下动态的二进制代码测试用例自动生成工具。
技术实现思路
有鉴于此,本专利技术的目的就是提供,它是在Windows平台构建一种可以自动化地探测二进制代码执行路径的方案,通过对二进制代码执行过程的观察,获得其执行的路径约束。再使用求解器计算执行其它路径的输入,从而达到提高路径覆盖率的目的。为达到上述目的,本专利技术的技术方案是这样实现的,该方法的步骤包括步骤A.实现二进制代码运行时的动态插装框架。可以观察二进制的执行过程;步骤B.根据动态插装框架收集到的动态运行时信息,如指令、寄存器、内存访问等信息,把二进制代码翻译成中间语言。步骤C.根据动态插装框架中记录的输入点信息,将输入点作为符号,传播与输入点相关的执行过程,在每个分支处收集路径约束。步骤D.将收集到的路径约束,通过变异路径算法得到新的路径约束,将该路径约束转化为求解器可识别的查询语句。 步骤E.使用求解器计算新路径约束中,输入需满足的条件,再借助动态插装框架把新产生的输入交给二进制代码再次执行。其中,步骤A中所述的二进制代码为Windows平台下的x86机器代码;所述的二进制代码的动态插装框架,包括Al 在每条指令执行完成后插装;A2.在每个线程开始时插装;A3.在每个动态链接库被加载时插装;A4.记录每条指令的执行上下文;A5.记录每次内存访问信息;A6.记录分支指令是否被执行;其中,步骤B所述的中间语言中,包括三种存储介质Bll.临时变量,在每个基本块中临时申请,用于实现静态单赋值,为寄存器与内存间的媒介;B12.寄存器,与机器指令中的寄存器相同,读写寄存器使用中间语言中的Get和Put操作完成;B13.内存,内存地址由常量或临时变量表示,读写内存使用中间语言中的LDle和STle操作完成;其中,步骤B中所述的中间语言由语句IRStmt组成,语句IRStmt包括B21. IMark语句,表示每个基本块的入口标志,其中包括该基本块对应机器指令的开始地址及该指令的字节数;B22. Put语句,表示把临时变量的值写入寄存器;B23. Store语句,表示把临时变量的值写入内存;B24. IRDirty语句,表示调用有副作用的函数;B25. Exit语句,表示基本块的出口;其中,步骤B中所述的中间语言由语句IRStmt组成,语句IRStmt由表达式IRExpr组成,表达式IRExpr包括B31. Get表达式,表示从寄存器中读取值;B32. Tmp表达式,表示临时变量;B33. Binop表达式,表示二元操作;B34. Unop表达式,表不一兀操作;B35. Load表达式,表示从内存中读取值;B36. Const表达式,表示常量;B37. MuxOX 表达式,表不 if-then-else 语句;其中,步骤C所述的输入点包括三种情况命令行参数。程序运行时传递的参数,如控制台程序启动时传递的参数。文件类输入。表示通过ReadFile读取文件内容,作为输入。网络输入。表示通过Recv、RecvFrom读取网络中的内容,作为输入。其中,步骤C所述的将输入点作为符号,即传播符号方法是在中间语言上进行,需要考虑以下几种情况 Cl. Put操作,检查赋值给寄存器的临时变量是否依赖于输入;C2.赋值给临时变量时,左值需要考虑以下几种情况C21.从临时变量中读,检查该临时变量是否依赖于输入;C22.从内存中读,检查该内存中的值是否依赖于输入;C23.从寄存器中读,检查该寄存器是否依赖于输入;C24. 一元操作与二元操作,检查操作数是否依赖于输入;C3. Store操作,检查写入内存的临时变量是否依赖于输入;其中,步骤D所述将收集到的路径约束,通过变异路径算法得到新的路径约束,包括二元操作,一元操作、位移操作,有符号扩展、无符号扩展,比较操作以及是否跳转标志。其中,步骤D所述求解器可识别的查询语句包括以下几种元素Dl.BITVECTOR(X)类型的变量声明,表示X个布尔变量的数组。声明需混合以ASSERT语句,每个ASSERT接收包括已声明的变量的表达式作为参数;D2.算术谓词和比较操作的变型。如BVLT是一个无符号的小于比较谓词,而BVSLT是有符号的小于比较;D3.比特向量索引的比特向量的数组。为使用这样的数组,需声明一个新的ARRAYBITVECTOR (X) OF BITVECTOR (Y)类型的变量,X表示数组地址的大小和每个项是Y位的比特向量。STP允许数组变量索引,如某长度的比特向量或长比特向量的子集。这样可简单地表示从一个符号内存地址读取值;优点及功效本专利技术,它是在Windows平台构建一种可以自动化地探测二进制代码执行路径的方案,通过对二进制代码执行过程的观察,获得其执行的路径约束。再使用求解器计算执行其它路径的输入,从而实现了Windows下动态的二进制代码测试本文档来自技高网
...

【技术保护点】
一种动态的二进制代码测试用例生成方法,其特征在于:该方法的具体步骤如下:步骤A.实现二进制代码运行时的动态插装框架,观察二进制的执行过程;步骤B.根据动态插装框架收集到的动态运行时信息,如指令、寄存器、内存访问信息,把二进制代码翻译成中间语言;步骤C.根据动态插装框架中记录的输入点信息,将输入点作为符号,传播与输入点相关的执行过程,在每个分支处收集路径约束;步骤D.将收集到的路径约束,通过变异路径算法得到新的路径约束,将该路径约束转化为求解器可识别的查询语句;步骤E.使用求解器计算新路径约束中,输入需满足的条件,再借助动态插装框架把新产生的输入交给二进制代码再次执行。

【技术特征摘要】

【专利技术属性】
技术研发人员:李舟军马金鑫忽朝俭章张锴
申请(专利权)人:北京航空航天大学
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1