掌桥专利:专业的专利平台
掌桥专利
首页

技术领域

本发明涉及信息安全技术领域,尤其涉及一种基于二进制重写的模糊测试方法、装置、设备和存储介质。

背景技术

模糊测试是最为广泛采用的二进制程序漏洞挖掘工具,因其便捷部署和高效的漏洞挖掘能力,各类软件开发商均会在软件开发全生命周期中实施该测试以保障软件的安全性。测试过程中,测试程序向被测对象输入不规则数据并执行,以监控并记录系统运行状态,并借此发现系统中的缺陷。代码覆盖率是模糊测试的关键评估指标,其目标是确保程序执行路径的全面覆盖,从而发现程序内的未知漏洞。然而,程序行为具有不确定性,因此程序状态不能直观地度量。因此,研究者选择代码覆盖率作为程序状态的替代指标,即代码覆盖率的增加可以更充分的测试程序的各种状态。

在现实的模糊测试过程中,需要满足特定条件,才能使得程序运行覆盖到一些非常见的异常处理过程,从而导致模糊测试覆盖率较低。且现有的模糊测试工具较难覆盖到这些特殊情况。

因此,改进模糊测试的方法提高以支持异常处理程序的测试已成为本领域亟待解决的技术问题。

发明内容

针对现有技术中存在的技术问题,本发明提供一种基于二进制重写的模糊测试方法、装置、设备和存储介质。

第一方面,本发明提供一种基于二进制重写的模糊测试方法,包括:

获取由二进制指令序列构成的待测程序;

基于动态插桩,对所述待测程序进行模糊测试,确定当前模糊测试对应的覆盖率,以及当前模糊测试对应的覆盖率是否满足预设阈值;

若不满足,则对所述待测程序中的跳转指令进行反转,更新所述待测程序,再次基于动态插桩,对更新后的所述待测程序进行模糊测试,更新当前模糊测试对应的覆盖率,直至当前模糊测试对应的覆盖率满足所述预设阈值。

可选地,基于动态插桩,对所述待测程序进行模糊测试,确定当前模糊测试对应的覆盖率,包括:

基于模糊测试工具AFL,记录所述待测程序已执行的任一基本块和/或边;

基于反编译工具,生成所述待测程序对应的控制流图;所述控制流图由多个边连接的多个节点组成,每个节点表示一个基本块,每条边表示一个控制流;

基于已执行的所有基本块,和所述待测原程序对应的控制流图包括的所有基本块,确定当前模糊测试对应的基本块的覆盖率;所述已执行的所有基本块基于记录的所述待测程序已执行的所有基本块或记录的所述待测程序已执行的所有边关联的基本块确定。

可选地,所述基于模糊测试工具AFL,记录所述待测程序已执行的任一基本块和/或边,包括:

基于模糊测试工具AFL中改写的afl_request_tsl函数,记录所述待测程序已执行的任一基本块和/或边;所述改写的afl_request_tsl函数用于记录获取当前指令的地址;所述当前指令的地址和所述基本块一一对应。

可选地,所述基于反编译工具,生成所述待测程序对应的控制流图,包括:

基于编译所述待测程序时插入的特定函数,识别所述待测程序中各用户函数;

基于反编译工具,对识别的所述待测程序中各用户函数进行深度优先遍历,确定各所述用户函数包含的基本块以及各基本块之间的控制流;

基于各所述用户函数包含的基本块以及各基本块之间的控制流,确定所述待测程序对应的控制流图的节点和边。

可选地,所述基于已执行的所有基本块,和所述待测原程序对应的控制流图包括的所有基本块,确定当前模糊测试对应的基本块的覆盖率,包括:

统计所述模糊测试工具记录所述待测程序已执行的任一基本块,作为第一基本块;

统计所述模糊测试工具记录所述待测程序已执行的任一边,作为第一边;

基于所述第一边关联的所有基本块,或所述第一基本块,确定已执行的所有基本块。

可选地,所述基于反编译工具,对识别的所述待测程序中各用户函数进行深度优先遍历,确定各所述用户函数包含的基本块以及各基本块之间的控制流,包括:

基于反编译工具IDAPro提供的API接口,确定所述待测程序中各用户函数中包括的基本块;

按照深度优先,对每个用户函数的基本块和/或边进行遍历,得到每个用户函数对应的各基本块之间的控制流。

可选地,所述模糊测试工具AFL采用QEMU模式。

第二方面,本发明还提供一种基于二进制重写的模糊测试装置,包括:

获取模块,用于获取由二进制指令序列构成的待测程序;

确定模块,用于基于动态插桩,对所述待测程序进行模糊测试,确定当前模糊测试对应的覆盖率,以及当前模糊测试对应的覆盖率是否满足预设阈值;

迭代模块,用于若不满足,则对所述待测程序中的跳转指令进行反转,更新所述待测程序,再次基于动态插桩,对更新后的所述待测程序进行模糊测试,更新当前模糊测试对应的覆盖率,直至当前模糊测试对应的覆盖率满足所述预设阈值。

第三方面,本发明还提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现如上第一方面所述的基于二进制重写的模糊测试方法。

第四方面,本发明还提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现如上第一方面所述的基于二进制重写的模糊测试方法。

第五方面,本发明还提供一种计算机程序产品,包括计算机程序,所述计算机程序被处理器执行时实现如上第一方面所述的基于二进制重写的模糊测试方法。

本发明提供的基于二进制重写的模糊测试方法、装置、设备和存储介质,利用二进制重写能在不知道源代码的情况下,对二进制程序进行修改,直接将控制程序的跳转指令对应的机器代码进行反转,更新待测程序的二进制文件,并采用动态插桩对更新后的待测程序进行模糊测试,确定待测程序的覆盖率,在覆盖率满足预设阈值的情况下,完成对待测程序的测试,一方面提高对待测程序的覆盖率,一方面以更低的成本发现更多待测程序存在的问题,进而提高待测程序的可靠性。

附图说明

为了更清楚地说明本发明或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1是本发明实施例提供的基于二进制重写的模糊测试方法的流程示意图;

图2是本发明实施例提供的基于二进制重写的模糊测试方法的实施流程示意图;

图3是本发明实施例提供的基于二进制重写的模糊测试装置的结构示意图;

图4是本发明实施例提供的一种电子设备结构示意图。

具体实施方式

本发明实施例中术语“和/或”,描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。字符“/”一般表示前后关联对象是一种“或”的关系。

本发明实施例中术语“多个”是指两个或两个以上,其它量词与之类似。

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,并不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

图1是本发明实施例提供的基于二进制重写的模糊测试方法的流程示意图,如图1所示,该方法包括:

步骤101、获取由二进制指令序列构成的待测程序;

步骤102、基于动态插桩,对所述待测程序进行模糊测试,确定当前模糊测试对应的覆盖率,以及当前模糊测试对应的覆盖率是否满足预设阈值;

步骤103、若不满足,则对所述待测程序中的跳转指令进行反转,更新所述待测程序,再次基于动态插桩,对更新后的所述待测程序进行模糊测试,确定下一模糊测试对应的覆盖率,直至所述覆盖率满足所述预设阈值。

具体地,现有模糊测试虽然可以通过基于输入数据的语法结构或基于符号执行的方法指导有效测试样例的生成,尤其是覆盖导向的模糊测试使得测试样例的生成更加有效。然而待测程序中的某些路径的执行需要满足特定的条件,并不能通过合适的测试样例满足这些特定条件,也就测试不了待测程序中满足特定条件的某个或某些分支的执行情况。而且这些特定的条件,根据程序的判断分支越多的情况下,能满足的测试样例越少,因此,待测程序中对于异常处理的很多分支,可能存在较多的漏洞,这就使得模糊测试不能有效的挖掘程序中的漏洞。

本发明通过对待测程序对应的二进制指令序列,进一步处理,从而提高对待测程序的测试覆盖率,具体包括:

获取二进制指令序列构成的待测程序,这种状态下的二进制文件,需要获知原始的程序代码,可直接对二进制程序进行修改,执行过程更为方便和简单。

采用动态插桩,对上述待测程序进行模糊测试的过程进行追踪,可理解为统计哪些程序分支已执行,以及待测程序包括的所有分支的情况等,进而根据已执行的程序分支,和待测程序包括的所有分支,确定当前模糊测试对应的覆盖率,并和预设阈值进行比较。确定是否满足预设阈值,这里的预设阈值可以根据测试需求进行动态设定,或设置一个初始值后,根据测试结果进行动态的调整,直至测试效率达到最高,也就是在有限的测试次数中,使得覆盖率尽量提得更高。

在当前模糊测试对应的覆盖率满足预设阈值的情况下,即当前模糊测试对应的覆盖率大于预设阈值的情况下,完成对待测测序的测试,发现待测程序中相关的问题和漏洞,并进行修正。

在当前模糊测试对应的覆盖率不满足预设阈值的情况下,即当前模糊测试对应的覆盖率小于或等于预设阈值的情况下,对所述待测程序对应的跳转指令进行反转,使得对应的测试用例可以覆盖到反转后的跳转指令对应的程序分支,进而得到更新后的待测程序,再次进行模糊测试,重新确定当前模糊测试对应的覆盖率,直至当前模糊测试对应的覆盖率满足所述预设阈值。

本发明提供的基于二进制重写的模糊测试方法,利用二进制重写能在不知道源代码的情况下,对二进制程序进行修改,直接将控制程序的跳转指令对应的机器代码进行反转,更新待测程序的二进制文件,并采用动态插桩对更新后的待测程序进行模糊测试,确定待测程序的覆盖率,在覆盖率满足预设阈值的情况下,完成对待测程序的测试,一方面提高对待测程序的覆盖率,一方面以更低的成本发现更多待测程序存在的问题,进而提高待测程序的可靠性。

可选地,所述基于动态插桩,对所述待测程序进行模糊测试,确定当前模糊测试对应的覆盖率,包括:

基于模糊测试工具AFL,记录所述待测程序已执行的任一基本块和/或边;

基于反编译工具,生成所述待测程序对应的控制流图;所述控制流图由多个边连接的多个节点组成,每个节点表示一个基本块,每条边表示一个控制流;

基于已执行的所有基本块,和所述待测原程序对应的控制流图包括的所有基本块,确定当前模糊测试对应的基本块的覆盖率;所述已执行的所有基本块基于记录的所述待测程序已执行的所有基本块或记录的所述待测程序已执行的所有边关联的基本块确定。

具体地,为了统计待测程序进行模糊测试时的覆盖率,需要对待测程序所执行到的基本块进行追踪,具体通过主流模糊测试工具(American Fuzzy Loop,AFL)对待测程序对应的二进制文件已执行的任一基本块和/或边进行记录。采用AFL中QEMU模式,模拟运行待测程序,即对待测程序进行模糊测试,可以获取待测程序中每个基本块、每个边、或每个基本块以及每个边的执行情况。

还需要对待测程序的包括的所有基本块和边进行统计,主要通过反编译工具,对待测程序的所有分支进行遍历,得到待测程序包括的每个基本块以及基本块之间的控制流,并通过控制流图中的节点表示每个基本块,控制流图的边表示基本块之间的控制流,从而可以将待测程序抽象表示为控制流图的形式,更直观。控制流图(Control Flow Graph,简称CFG)是一种用于描述程序控制流的有向图。在CFG中,每个节点代表一个基本块(BasicBlock),每条边代表一个控制流(Control Flow)。基本块是程序执行过程中的一个逻辑单元,它包含一组顺序执行的指令。

再基于AFL模拟运行待测程序,得到的基本块、边或基本块以及边的运行情况,确定哪些基本块已执行,即确定已执行的所有基本块。进一步结合待测程序对应的控制流图中包括的所有基本块,确定当前模糊测试对应的基本块的覆盖率,也就是当前模糊测试中已执行的基本块占所有基本块的比例,覆盖率越高,表示当前模糊测试对待测程序的检测完整度越高,能更全面的发现待测程序存在的漏洞的可能性越高;覆盖率越低,表示当前模糊测试对待测程序的减振完整度越低,能更全面发现待测程序存在的漏洞的可能性越低。

可选地,所述基于模糊测试工具AFL,记录所述待测程序已执行的任一基本块和/或边,包括:

基于模糊测试工具AFL中改写的afl_request_tsl函数,记录所述待测程序已执行的任一基本块和/或边;所述改写的afl_request_tsl函数用于记录获取当前指令的地址;所述当前指令的地址和所述基本块一一对应。

具体地,本发明中通过对模糊测试工具AFL中的afl_request_tsl函数进行改写,使得该afl_request_tsl函数可以通过名为afl_tsl的结构体来记录需要进行翻译的基本块信息,对基本块进行翻译就是将在一个平台上可执行的代码,翻译成在其他平台上可执行的代码,比如对需要执行的基本块对应的在ARM架构平台上执行的代码,翻译成可以在X86平台可执行的代码。其中afl_tsl的结构体中定义了当前指令的地址(pc)、代码段在内存中的起始地址(cs_base),以及标志位(flags)等信息,可以方便地进行基本块的追踪和记录。每当AFL在QEMU模拟环境中执行到一个新的基本块时,就会生成一个对应的afl_tsl结构体,用于记录该基本块的执行情况。

afl_tsl的结构体可表示为:

通过AFL对待测程序进行模糊测试,并记录待测程序执行时afl_tsl结构体中PC变量(当前指令的地址)的值,可以得到待测程序的基本块执行序列(pc1,pc2,pc3...),以此来获得当前模糊测试中待测程序的已执行基本块的信息。

可选地,所述基于反编译工具,生成所述待测程序对应的控制流图,包括:

基于编译所述待测程序时插入的特定函数,识别所述待测程序中各用户函数;

基于反编译工具,对识别的所述待测程序中各用户函数进行深度优先遍历,确定各所述用户函数包含的基本块以及各基本块之间的控制流;

基于各所述用户函数包含的基本块以及各基本块之间的控制流,确定所述待测程序对应的控制流图的节点和边。

具体地,针对用户定义的函数,即用户函数,其机器代码的存储方式采取线性连续的方式,且其存储顺序严格遵守函数在源程序中的定义顺序。同时,用户自定义的函数的代码段占据较低的地址,而系统库函数的代码段则占据较高的地址。并且用户函数的汇编级别的表示上,通常包含函数序言和函数尾声。用户函数在源码中的存储顺序间接反应了其编译后在二进制程序中的顺序。也就是说明用户函数在源码中的顺序与编译后生成的二进制程序的顺序相同。

在编译过程中,编译器会插入一些函数来执行编译的任务。这些插入的函数通常被称为编译器函数或编译器特定函数。其中函数frame_dummy通常位于用户函数地址区域的边界的上方,函数_GLOBAL__sub_I_main通常位于用户函数地址区域的边界的下方。因此可以通过对上述的两个函数frame_dummy和GLOBAL__sub_I_main进行匹配,然后再结合函数序言的信息,就可以初步识别出待测程序的二进制文件中的用户函数。对这两个函数匹配只是为了确定用户函数的大致区间,在这个区间内还可能有其它的系统函数。然后根据函数序言信息(用户函数都会包含函数序言,而系统函数不会),就能准确的识别用户函数了。

进一步利用反编译工具,如IDAPro对待测程序中已识别的用户函数进行深度优先遍历,获取待测程序中每个用户函数包含的基本块以及各基本块之间的控制流。

可选地,所述基于反编译工具,对识别的所述待测程序中各用户函数进行深度优先遍历,确定各所述用户函数包含的基本块以及各基本块之间的控制流,包括:

基于反编译工具IDAPro提供的API接口,确定所述待测程序中各用户函数中包括的基本块;

按照深度优先,对每个用户函数的基本块和/或边进行遍历,得到每个用户函数对应的各基本块之间的控制流。

具体地,本发明中通过反编译工具对待测程序中各用户函数进行深度优先遍历,具体方法包括:

使用反编译工具IDA Pro所提供的API接口,可以对用户函数的基本块数量进行精确统计。对每一个用户函数的入口点,通过反汇编工具对待测程序中用户函数进行深度优先遍历,从而确定待测程序中包括的所有基本块和基本块之间的控制流,并通过控制流图中节点表示基本块,控制流图中的边表示基本块之间的控制流的形式,得到待测程序对应的控制流图。

基于该待测程序对应的控制流图,就可以直观的确定待测程序包括的所有基本块数量以及所有边的数量,并可以获知每个边和基本块的链接关系,也就是确定边对应的哪些基本块或关联的哪些基本块。

以上仅以反编译工具IDA Pro为例进行说明,其他可完成对待测程序中用户函数各基本块进行遍历的类似的反编译工具也属于本发明要求的保护范围。

可选地,所述基于已执行的所有基本块,和所述待测原程序对应的控制流图包括的所有基本块,确定当前模糊测试对应的基本块的覆盖率之前,包括:

统计所述模糊测试工具记录所述待测程序已执行的任一基本块,作为第一基本块;

统计所述模糊测试工具记录所述待测程序已执行的任一边,作为第一边;

基于所述第一边关联的所有基本块,或所述第一基本块,确定已执行的所有基本块。

具体地,通过AFL对待测程序进行模拟测试时,可以记录当前模糊测试已执行的任一基本块和/或边。

进一步根据AFL记录的当前模糊测试已执行的任一基本块的记录信息,统计当前模糊测试已执行的所有基本块,作为第一基本块;

或,根据AFL记录的当前模糊测试已执行的任一边的记录信息,统计当前模糊测试已执行的所有边,作为第一边,并结合边与基本块的对应关系或关联关系,确定第一边关联的所有基本块。

根据上述第一基本块或第一边关联的所有基本块,确定当前模糊测试已执行的所有基本块。

再利用上述已执行的所有基本块和待测程序包括的所有基本块,确定当前模糊测试对应的基本块的覆盖率。

可选地,若不满足,则对所述待测程序中的跳转指令进行反转,更新所述待测程序,再次基于动态插桩,对更新后的所述待测程序进行模糊测试,更新当前模糊测试对应的覆盖率,直至当前模糊测试对应的覆盖率满足所述预设阈值。

具体地,当前模糊测试工具可能不能覆盖因偶发错误触发的错误处理代码对应的处理逻辑,其中偶发错误触发的程序中还可能存在多种错误的判断处理过程。通常,错误处理由条件语句实现,在汇编级别,主要通过条件判断和跳转指令操作。例如,X86汇编的jz指令或ARM的be指令。然而,对于特定的偶发性错误的处理,现有的测试样例也可能无法满足这种偶发性错误的处理代码执行的条件。因此,本发明通过对跳转指令的机器码执行patch操作来实现强制性错误执行。静态字节重写是指对二进制文件(源程序编译后的结果)的用于表示跳转指令或者具有跳转功能的特定字节进行修改,从而改变源程序的执行流程。比如在X86架构中,jz指令的机器码是0F 84,而jnz指令的机器码是0F 85。因此,可以通过将待测程序对应的二进制文件中用于表示跳转指令或者具有跳转功能的特定字节的源机器码进行反转,即将原来的机器码0F 84重写为0F 85,或将原来的机器码0F 85重写为0F 84,来实现对跳转指令的反转,进而实现对未执行的处理流程进行覆盖,也就是使得之前未执行的基本块能够执行。

本发明提供的基于二进制重写的模糊测试方法,利用二进制重写能在不知道源代码的情况下,对二进制程序进行修改,直接将控制程序的跳转指令对应的机器代码进行反转,更新待测程序的二进制文件,并采用动态插桩对更新后的待测程序进行模糊测试,确定待测程序的覆盖率,在覆盖率满足预设阈值的情况下,完成对待测程序的测试,一方面提高对待测程序的覆盖率,一方面以更低的成本发现更多待测程序存在的问题,进而提高待测程序的可靠性。

针对现有覆盖率导向的模糊测试工具覆盖率较低的局限性,以及当前模糊测试工具的不足,本发明提出的一种基于二进制重写的模糊测试方法具备以下四个关键能力C1,C2,C3,C4,以有效验证该方法对模糊代码覆盖率的提高作用:

C1.对待测程序的模糊测试的执行过程进行追踪。

C2.准确识别出缺失符号表的二进制程序的用户函数。

C3.对二进制程序的用户函数包含基本块进行统计分析。

C4.通过对跳转指令进行二进制重写,有效的提高模糊测试的覆盖率。

C1的必要性在于,通过对待测程序的执行过程进行追踪,可以有效的获取程序执行的基本块信息,统计程序执行所覆盖到的基本块信息。C2对二进制程序包含的用户函数进行精确识别,进一步明确模糊测试时需要覆盖到的目标函数。C3对模糊测试过程中的需要执行的用户函数所包含的基本块进行统计,使得模糊测试的覆盖率能够被准确的计算。C4是提高模糊测试覆盖率的核心,结合被测程序反馈的覆盖率信息,对被测程序的跳转指令进行二进制重写,以此来达到强制模糊测试的目的,提高模糊测试的覆盖率。

为了更清楚的说明本发明提供的基于二进制重写的模糊测试方法,下面以具体的例子进行说明。

图2是本发明实施例提供的基于二进制重写的模糊测试方法的实施流程示意图。如图2所示,具体包括:

字符串提取,将待测程序对应的二进制文件进行提取字符串;

静态分析,对待测程序采用反编译工具IDA Pro进行静态分析,得到待测程序对应的控制流图;

模糊测试,基于上述字符串提取结果和控制流图,使用模糊测试工具AFL的QEMU模式,对待测程序进行模糊测试,并生成日志文件,也可以确定当前模糊测试的覆盖率;当前模糊测试的覆盖率可以根据日志文件确定;

迭代循环,若当前模糊测试的覆盖率不满足预设阈值,则对待测程序采用反编译工具IDA Pro进行静态分析时,对待测程序的分支指令进行patch,再次执行模糊测试,直至满足覆盖率要求或达到最大迭代次数。

图3是本发明实施例提供的基于二进制重写的模糊测试装置的结构示意图,如图3所示,该装置包括:

获取模块301,用于获取由二进制指令序列构成的待测程序;

确定模块302,用于基于动态插桩,对所述待测程序进行模糊测试,确定当前模糊测试对应的覆盖率,以及当前模糊测试对应的覆盖率是否满足预设阈值;

迭代模块303,用于若不满足,则对所述待测程序中的跳转指令进行反转,更新所述待测程序,再次基于动态插桩,对更新后的所述待测程序进行模糊测试,更新当前模糊测试对应的覆盖率,直至当前模糊测试对应的覆盖率满足所述预设阈值。

可选地,所述确定模块302在基于动态插桩,对所述待测程序进行模糊测试,确定当前模糊测试对应的覆盖率的过程中,具体用于:

基于模糊测试工具AFL,记录所述待测程序已执行的任一基本块和/或边;

基于反编译工具,生成所述待测程序对应的控制流图;所述控制流图由多个边连接的多个节点组成,每个节点表示一个基本块,每条边表示一个控制流;

基于已执行的所有基本块,和所述待测原程序对应的控制流图包括的所有基本块,确定当前模糊测试对应的基本块的覆盖率;所述已执行的所有基本块基于记录的所述待测程序已执行的所有基本块或记录的所述待测程序已执行的所有边关联的基本块确定。

可选地,所述确定模块302在基于模糊测试工具AFL,记录所述待测程序已执行的任一基本块和/或边的过程中,具体用于:

基于模糊测试工具AFL中改写的afl_request_tsl函数,记录所述待测程序已执行的任一基本块和/或边;所述改写的afl_request_tsl函数用于记录获取当前指令的地址;所述当前指令的地址和所述基本块一一对应。

可选地,所述确定模块302在基于反编译工具,生成所述待测程序对应的控制流图的过程中,具体用于:

基于编译所述待测程序时插入的特定函数,识别所述待测程序中各用户函数;

基于反编译工具,对识别的所述待测程序中各用户函数进行深度优先遍历,确定各所述用户函数包含的基本块以及各基本块之间的控制流;

基于各所述用户函数包含的基本块以及各基本块之间的控制流,确定所述待测程序对应的控制流图的节点和边。

可选地,所述确定模块302还用于:

统计所述模糊测试工具记录所述待测程序已执行的任一基本块,作为第一基本块;

统计所述模糊测试工具记录所述待测程序已执行的任一边,作为第一边;

基于所述第一边关联的所有基本块,或所述第一基本块,确定已执行的所有基本块。

可选地,所述确定模块302在基于反编译工具,对识别的所述待测程序中各用户函数进行深度优先遍历,确定各所述用户函数包含的基本块以及各基本块之间的控制流的过程中,具体用于:

基于反编译工具IDA Pro提供的API接口,确定所述待测程序中各用户函数中包括的基本块;

按照深度优先,对每个用户函数的基本块和/或边进行遍历,得到每个用户函数对应的各基本块之间的控制流。

可选地,所述模糊测试工具AFL采用QEMU模式。

本发明实施例提供的基于二进制重写的模糊测试装置,可以执行上述任一实施例的基于二进制重写的模糊测试方法,其实现原理以及有益效果与基于二进制重写的模糊测试方法的实现原理及有益效果类似,可参见基于二进制重写的模糊测试方法的实现原理及有益效果,此处不再进行赘述。

图4是本发明实施例提供的一种电子设备结构示意图,如图4所示,该电子设备可以包括:处理器(processor)410、通信接口(Communications Interface)420、存储器(memory)430和通信总线440,其中,处理器410,通信接口420,存储器430通过通信总线440完成相互间的通信。处理器410可以调用存储器430中的逻辑指令,以执行基于二进制重写的模糊测试方法,该方法包括:

获取由二进制指令序列构成的待测程序;

基于动态插桩,对所述待测程序进行模糊测试,确定当前模糊测试对应的覆盖率,以及当前模糊测试对应的覆盖率是否满足预设阈值;

若不满足,则对所述待测程序中的跳转指令进行反转,更新所述待测程序,再次基于动态插桩,对更新后的所述待测程序进行模糊测试,更新当前模糊测试对应的覆盖率,直至当前模糊测试对应的覆盖率满足所述预设阈值。

可选地,所述基于动态插桩,对所述待测程序进行模糊测试,确定当前模糊测试对应的覆盖率,包括:

基于模糊测试工具AFL,记录所述待测程序已执行的任一基本块和/或边;

基于反编译工具,生成所述待测程序对应的控制流图;所述控制流图由多个边连接的多个节点组成,每个节点表示一个基本块,每条边表示一个控制流;

基于已执行的所有基本块,和所述待测原程序对应的控制流图包括的所有基本块,确定当前模糊测试对应的基本块的覆盖率;所述已执行的所有基本块基于记录的所述待测程序已执行的所有基本块或记录的所述待测程序已执行的所有边关联的基本块确定。

可选地,所述基于模糊测试工具AFL,记录所述待测程序已执行的任一基本块和/或边,包括:

基于模糊测试工具AFL中改写的afl_request_tsl函数,记录所述待测程序已执行的任一基本块和/或边;所述改写的afl_request_tsl函数用于记录获取当前指令的地址;所述当前指令的地址和所述基本块一一对应。

可选地,所述基于反编译工具,生成所述待测程序对应的控制流图,包括:

基于编译所述待测程序时插入的特定函数,识别所述待测程序中各用户函数;

基于反编译工具,对识别的所述待测程序中各用户函数进行深度优先遍历,确定各所述用户函数包含的基本块以及各基本块之间的控制流;

基于各所述用户函数包含的基本块以及各基本块之间的控制流,确定所述待测程序对应的控制流图的节点和边。

可选地,所述基于已执行的所有基本块,和所述待测原程序对应的控制流图包括的所有基本块,确定当前模糊测试对应的基本块的覆盖率之前,包括:

统计所述模糊测试工具记录所述待测程序已执行的任一基本块,作为第一基本块;

统计所述模糊测试工具记录所述待测程序已执行的任一边,作为第一边;

基于所述第一边关联的所有基本块,或所述第一基本块,确定已执行的所有基本块。

可选地,所述基于反编译工具,对识别的所述待测程序中各用户函数进行深度优先遍历,确定各所述用户函数包含的基本块以及各基本块之间的控制流,包括:

基于反编译工具IDAPro提供的API接口,确定所述待测程序中各用户函数中包括的基本块;

按照深度优先,对每个用户函数的基本块和/或边进行遍历,得到每个用户函数对应的各基本块之间的控制流。

可选地,所述模糊测试工具AFL采用QEMU模式。

此外,上述的存储器430中的逻辑指令可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。

另一方面,本发明还提供一种计算机程序产品,所述计算机程序产品包括计算机程序,计算机程序可存储在非暂态计算机可读存储介质上,所述计算机程序被处理器执行时,计算机能够执行上述各方法所提供的基于二进制重写的模糊测试方法,该方法包括:

获取由二进制指令序列构成的待测程序;

基于动态插桩,对所述待测程序进行模糊测试,确定当前模糊测试对应的覆盖率,以及当前模糊测试对应的覆盖率是否满足预设阈值;

若不满足,则对所述待测程序中的跳转指令进行反转,更新所述待测程序,再次基于动态插桩,对更新后的所述待测程序进行模糊测试,更新当前模糊测试对应的覆盖率,直至当前模糊测试对应的覆盖率满足所述预设阈值。

又一方面,本发明还提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现以执行上述各方法所提供的基于二进制重写的模糊测试方法,该方法包括:

获取由二进制指令序列构成的待测程序;

基于动态插桩,对所述待测程序进行模糊测试,确定当前模糊测试对应的覆盖率,以及当前模糊测试对应的覆盖率是否满足预设阈值;

若不满足,则对所述待测程序中的跳转指令进行反转,更新所述待测程序,再次基于动态插桩,对更新后的所述待测程序进行模糊测试,更新当前模糊测试对应的覆盖率,直至当前模糊测试对应的覆盖率满足所述预设阈值。

以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。

最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

相关技术
  • 一种在树脂镜片表面均匀涂层和固化的装置及工作方法
  • 一种基于速度偏差的机器人碰撞检测方法及装置
  • 一种树脂镜片烟雾缺陷检测装置
  • 一种变色光学树脂镜片的制备方法
  • 一种高折射率的高分子树脂镜片及其制备方法
  • 一种基于树脂镜片碰撞检测的材料优化方法及装置
  • 一种基于深度神经网络优化的连续碰撞检测方法
技术分类

06120116563415