CN107045474A - 一种Fuzz测试中的程序流跟踪方法及装置 - Google Patents
一种Fuzz测试中的程序流跟踪方法及装置 Download PDFInfo
- Publication number
- CN107045474A CN107045474A CN201610082897.6A CN201610082897A CN107045474A CN 107045474 A CN107045474 A CN 107045474A CN 201610082897 A CN201610082897 A CN 201610082897A CN 107045474 A CN107045474 A CN 107045474A
- Authority
- CN
- China
- Prior art keywords
- test sample
- program
- test
- program flow
- new
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3688—Test management for test execution, e.g. scheduling of test suites
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/30—Monitoring
- G06F11/34—Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment
- G06F11/3466—Performance evaluation by tracing or monitoring
- G06F11/3476—Data logging
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3676—Test management for coverage analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3684—Test management for test design, e.g. generating new test cases
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本申请涉及计算机技术,特别涉及一种Fuzz测试中的程序流跟踪方法及装置。用以解决Fuzz测试中现有程序流跟踪方法执行效率低,应用范围有限的问题。该方法为:确定待测试程序后,每生成一个测试样本,通过预先配置的API调用CPU,基于当前启动的一个监视进程,采用相应的一个测试样本对待测试程序进行测试,以及记录测试过程中产生的程序流;这样,便将CPU的硬件特性与Fuzz测试相结合,实现了程序流的跟踪,不但提高了测试效率,同时,也提升了测试过程中的代码覆盖率,另一方面,可以支持windows和linux两种系统,也可以跟踪没有源代码的待测试程序,进一步提升了方案的应用广泛性。
Description
技术领域
本申请涉及计算机技术,特别涉及一种Fuzz测试中的程序流跟踪方法及装置。
背景技术
Fuzz测试:即模糊测试,是一种软件测试技术。其核心思想是自动或半自动的随机生成测试样本输入到一个待测试程序中,并监视待测试程序的执行异常,如,崩溃,断言(assertion)失败等等,以发现可能的程序错误,例如,内存泄漏。模糊测试常常用于检测软件或计算机系统的安全漏洞。
Fuzz测试方法在漏洞挖掘中非常流行,当前Fuzz测试工具的趋势是根据测试样本的程序流跟踪结果来控制新的测试样本的生成,由于每次Fuzz测试需要运行大量的样本,需要有较轻便的程序流跟踪方法。目前较普遍的执行方法是:记录每次输入测试样本后,待测试程序运行产生的程序流(即程序执行过程中的指令序列),如果对程序流进行分析后确定进入了新的代码分支,则保留当前使用的测试样本,并作为后续测试样本的变异基础,如果对程序流进行分析后确定未进入新的代码分支,则丢弃当前使用的测试样本,重新基于预设规则生成新的测试样本。afl-fuzz便是根据这个思想编写的一个开源Fuzz测试工具。
afl-fuzz最初使用的程序流跟踪方法是在编译过程中对代码进行代码插桩,后面针对闭源软件又开发了利用Qemu模拟器实现程序流跟踪,其中,Qemu模拟器是一个x86模拟器,可以模拟计算机的各种硬件设备。
下面分别介绍这两种主流的方案。
第一种方案为:针对有源代码的待测试程序,afl-fuzz可以使用修改的编译器,在编译程序生成源代码后对源代码进行插桩并进行程序流跟踪。
然而,动态插桩工具存在兼容性不好的问题,许多待测试程序在插桩工具下,无法正常运行,且采用动态插桩工具时,系统的执行效率较低。
并且第一种方案只支持Linux系统,不支持Windows系统,应用范围有限。
第二种方案为:针对闭源的待测试程序,可以使用Qemu模拟器进行程序流跟踪。
然而,使用Qemu模拟器时,系统的执行效率较低,并且第二种方案也只支持Linux系统,不支持Windows系统,应用范围有限。
发明内容
本申请实施例提供一种Fuzz测试中的程序流跟踪方法及装置,用以解决Fuzz测试中现有程序流跟踪方法执行效率低,应用范围有限的问题。
本申请实施例提供的具体技术方案如下:
一种Fuzz测试中的程序流跟踪方法,包括:
生成一个测试样本,并启动一个监视进程;
通过预先配置的应用程序编程接口API调用中央处理器CPU,基于当前启动的一个监视进程,采用相应的一个测试样本对待测试程序进行测试;
记录测试过程中产生的程序流。
较佳的,生成一个测试样本之前,进一步包括:
判断本地是否设置有能够调用CPU完成程序流跟踪功能的API,确定存在时,判定本地的CPU支持程序流跟踪功能。
较佳的,记录测试过程中产生的程序流,包括:
将测试过程中产生的程序流保存至缓存区,每当确定缓存区已满时,将缓存区中当前保存的程序流保存至指定的存储位置,并清空缓存区,以及继续在缓存区中记录后续产生的程序流。
较佳的,进一步包括:
监测到当前启动的一个监视进程退出时,确定相应的一个测试样本执行完毕;
提取执行所述一个测试样本的过程中,CPU跟踪并记录的程序流;
对提取的程序流进行分析,根据分析结果判定待测试程序发生异常时,进行告警。
较佳的,进一步包括:
确定一个测试样本执行完毕且对相应的程序流进行分析后,根据分析结果判断是否存在新的代码分支,若是,则保存所述一个测试样本,否则,丢弃所述一个测试样本。
较佳的,进一步包括:
若保存所述一个测试样本,则基于所述一个测试样本,生成一个新的测试样本,以及启动一个新的监测进程,并通过所述API调度CPU,基于所述一个新的监测进程,采用所述一个新的测试样本继续对所述待测试程序进行测试,以及记录测试过程中产生的程序流;
若丢弃所述一个测试样本,则根据指令重新生成一个新的测试样本,以及启动一个新的监测进程,并通过所述API调度CPU,基于所述一个新的监测进程,采用所述一个新的测试样本继续对所述待测试程序进行测试,以及记录测试过程中产生的程序流。
一种Fuzz测试中的程序流跟踪装置,包括:
生成单元,用于生成一个测试样本,并启动一个监视进程;
处理单元,用于通过预先配置的应用程序编程接口API调用中央处理器CPU,基于当前启动的一个监视进程,采用相应的一个测试样本对待测试程序进行测试;
记录单元,用于记录测试过程中产生的程序流。
较佳的,生成一个测试样本之前,所述生成单元进一步用于:
判断本地是否设置有能够调用CPU完成程序流跟踪功能的API,确定存在时,判定本地的CPU支持程序流跟踪功能。
较佳的,记录测试过程中产生的程序流时,所述记录单元用于:
将测试过程中产生的程序流保存至缓存区,每当确定缓存区已满时,将缓存区中当前保存的程序流保存至指定的存储位置,并清空缓存区,以及继续在缓存区中记录后续产生的程序流。
较佳的,所述处理单元进一步包括:
监测到当前启动的一个监视进程退出时,确定相应的一个测试样本执行完毕;
提取执行所述一个测试样本的过程中,CPU跟踪并记录的程序流;
对提取的程序流进行分析,根据分析结果判定待测试程序发生异常时,进行告警。
较佳的,所述处理单元进一步用于:
确定一个测试样本执行完毕且对相应的程序流进行分析后,根据分析结果判断是否存在新的代码分支,若是,则保存所述一个测试样本,否则,丢弃所述一个测试样本。
较佳的,若保存所述一个测试样本,则所述生成单元进一步用于:
基于所述一个测试样本,生成一个新的测试样本,以及启动一个新的监测进程;
所述处理单元进一步用于:
通过所述API调度CPU,基于所述一个新的监测进程,采用所述一个新的测试样本继续对所述待测试程序进行测试,以及记录测试过程中产生的程序流;
若丢弃所述一个测试样本,则所述生成单元进一步用于:
根据指令重新生成一个新的测试样本,以及启动一个新的监测进程;
所述处理单元进一步用于:
通过所述API调度CPU,基于所述一个新的监测进程,采用所述一个新的测试样本继续对所述待测试程序进行测试,以及记录测试过程中产生的程序流。
本申请实施例中,测试装置确定待测试程序后,依次生成测试本对待测试程序进行测试,其中,每生成一个测试样本,测试装置通过预先配置的API调用中央处理器CPU,基于当前启动的一个监视进程,采用相应的一个测试样本对所述待测试程序进行测试,以及记录测试过程中产生的程序流;这样,便将CPU的硬件特性与Fuzz测试相结合,实现了程序流的跟踪,不但提高了测试效率,减少了性能开销,同时,也提升了测试过程中的代码覆盖率,进一步提升了测试准确性,获得良好的测试效果。另一方面,本申请例提供的技术方案,可以支持windows和linux两种系统,也可以跟踪没有源代码的待测试程序,进一步提升了方案的应用广泛性。
附图说明
图1为本申请实施例中程序流跟踪示意图;
图2为本申请实施例中代码分支检测流程图;
图3为本申请实施例中测试装置功能结构示意图。
具体实施方式
为了解决Fuzz测试中现有程序流跟踪方法执行效率低,应用范围有限的问题,本申请实施例中,利用CPU的硬件特性进行程序流跟踪。
下面结合附图对申请优选的实施方式进行详细说明。
本申请实施例中,由于操作系统中通常默认内核不提供调用CPU进行程序流跟踪的功能,因此,需要预先需要编写内核驱动程序设置有相应的应用程序编程接口(Application Programming Interface,API),再通过设定的API开启并调用CPU完成程序流跟踪功能。
参阅图1所示,本申请实施例中,通过CPU进行程序流跟踪的具体流程如下:
开启程序跟踪功能的内核模块流程如下:1.调用cpuid检测cpu是否支持该功能,不支持则退出;2.配置对应的msr寄存器,开启processor trace功能;3.接收到用户层的调用,根据配置监视指定的进程;4.保存跟踪记录的内存缓冲区已满,调用中断处理函数,将内存跟踪记录保存到文件中。5.进程结束,停止记录。具体流程如图:
步骤100:测试装置接收到程序流跟踪指令时,对CPU进行性能检测。
本申请实施例中,通常测试装置本地的Fuzz测试工具启动时(可能是基于管理人员指令启动的)时,测试装置确定接收到程序流跟踪指令,此时,测试装置会对CPU进行性能检测。
步骤101:测试装置根据性能检测结果,判断CPU是否支持程序流跟踪功能,若是,则执行步骤103;否则,执行步骤102。
具体的,判断是否存在能够调用CPU进行程序流跟踪的API(预先已通过配置内核驱动程序设置),若是,则确定本地的CPU支持程序流跟踪,否则,确定本地的CPU不支持程序流跟踪。
步骤102:测试装置退出跟踪流程,并给出相关错误提示。
步骤103:测试装置配置特殊模式(MSR-Model Specific Registers,MSR)寄存器,开启跟踪功能。
之所以要配置MSR寄存器,是因为在程序流跟踪过程中,通常需要缓存程序流,那么缓存区域的地址通常记录在MSR寄存器中。
特殊情况下,若待测试程序的程序量不大,而跟踪获得的程序流直接记录在指定的存储位置(如,指定的文件中),则可以不使用MSR寄存器,在此不再赘述。
步骤104:测试装置确定待测试程序。
测试装置启动Fuzz工具后,会根据管理人员的指令锁定待测试程序。针对待测试程序,测试装置会依次生成不同的测试样本进行测试,每生成一个测试样本,测试装置会启动相应的监视进程执行相应的测试样本。
步骤105:测试装置启动一个监视进程,以及生成相应的一个测试样本。
测试装置初次生成的测试样本,可以是管理人员根据测试经验生成的测试样本。后续生成的测试样本,可以是基于之前的测试样本变异后得到的新的样本,也可以是新生成的样本。
所谓测试样本,可以理解为针对待测试程序的攻击程序,这样,在执行测试样本后,如果待测试程序的程序流出现异常,则可以确定待测试程序存在测试样本所针对的漏洞。
步骤106:测试装置调用CPU基于当前启动的监视进程,采用相应的一个测试样本,对待测试程序进行测试,并进行程序流跟踪。
本申请实施例中,较佳的,测试装置每执行一个测试样本时,需要启用一个监视进程,再通过预先配置的API调用CPU,基于当前启动的一个监视进程,采用相应的一个测试样本,对待测试程序进行测试,以及记录待测试程序在测试过程中产生的程序流。
步骤107:测试装置将跟踪到的程序流保存至指定的缓存区。
本申请实施例中,测试装置会将在待测试程序的跟踪过程中获得的程序流记录至缓存区,当然,若待测试程序的代码量不是非常庞大,则也可以直接将跟踪获得的程序流保存至指定的存储位置,如,将程序流保存至位于指定存储路径的文件中。
步骤108:测试装置判断缓存区是否已满?若是,则执行步骤109;否则,执行步骤110.
步骤109:测试装置将缓存区中当前存储的程序流保存至指定的存储位置。
本申请实施例中,测试装置会不断地将测试过程中产生的程序流保存至缓存区,每当确定缓存区已满时,测试装置会将缓存区中当前保存的程序流提取出来保存至指定的存储位置,并清空缓存区,以及继续在缓存区中记录后续产生的程序流。
步骤110:测试装置判断当前启动的一个监视进程是否退出?若是,则进行步骤111;否则,返回步骤106。
本申请实施例中,CPU每执行完毕一个测试样本,便会退出当前的一个监视进程,因此,测试装置每当监测到当前启动的一个监视进程退出时,便可以确定相应的一个测试样本执行完毕,此时,测试装置可以重新启动一个新的监视进程,以及生成一个新的测试样本。
进一步地,以测试样本A为例,当测试装置确定测试样本A执行结束时,测试装置会提取出测试样本A执行过程中,CPU跟踪并记录的程序流,并对提取的程序流进行分析,判断是否出现了异常,若出现异常,则说明待测试程序中存在测试样本A所针对的漏洞,因此,需要进行告警。其中,测试装置在对应测试样本A提取相应的程序流时,可以分别从缓存区和指定的存储位置提取出测试样本A执行过程中产生的程序流,也可以先从缓存区中提取出测试样本A执行过程中产生的程序流,再将其与指定存储位置中对应测试样本A保存的程序流进行整合,再将整合后的程序流提取出来进行统一分析。
步骤111:测试装置启动一个新的监视进程,以及生成一个新的测试样本,返回步骤106。
测试装置在结束一轮测试后,会重新启动一个新的监视进程,并生成一个新的测试样本,再次并通过预先配置的API调度CPU,基于所述一个新的监测进程,采用所述一个新的测试样本继续对待测试程序进行测试,以及记录测试过程中产生的程序流。
不同的测试样本,在执行过程中可以产生不同的程序流,通过分析可以测试出待测试程序不同的漏洞。同时,通过程序流的分析,也可以发现新的代码分支,从而提高Fuzz测试的代码覆盖率,这一点将在后续实施例中进行详细说明。
参阅图2所示,本申请实施例中,通过测试样本实现代码分支检测的具体流程如下:
步骤200:测试装置获取原测试样本。
步骤201:测试装置对原测试样本进行变异,获得一个新的测试样本。
具体的,对原测试样本进行变异时,可以对原测试样本进行微调(如,改变某个参数的取值,从“0”改为“1)”,如果原测试样本执行过程中发现了新的代码分支,则通过测试样本的微调,可以针对新的代码分支继续进行检测。
步骤202:测试装置创建一个新的监视进程。
步骤203:测试装置调用CPU,基于当前启动的一个新的监视进程,采用当前生成的一个新的测试样本,对待测试程序进行测试,并进行程序流跟踪。
步骤204:测试装置确定确定当前启动的一个新的监视进程退出后,对跟踪过程中记录的程序流进行分析。
步骤205:测试装置根据分析结果判断是否检测到新的代码分支?若是,则执行步骤206;否则,执行步骤207。
实际应用中,进行Fuzz测试最主要的目的是提高代码覆盖率,越多的代码被测试到,越多的代码漏洞越可以被检测出来,因此,测试样本的设计十分关键,只有在测试过程中触发待测试程序进入新的代码分支的测试样本才是理想的样本。
因而,本申请实施例中,每当确定一个测试样本执行完毕且对相应的程序流进行分析后,测试装置均会根据分析结果判断是否存在新的代码分支。
步骤206:测试装置保存当前使用的一个新的测试样本,并将当前使用的一个新的测试样本作为原测试样本,返回步骤201。
在此种情况下,说明测试装置当前使用的一个新的测试样本是理想的样本,可以以此为基础进行微调,从而进一步检测下一个代码分支,从而提升代码覆盖率,因此,需要将当前使用的一个新的测试样本作为原测试样本,继续生成后续使用的测试样本。
步骤207:测试装置丢弃当前使用的一个新的测试样本,根据指令重新生成一个新的测试样本。返回步骤202。
在种情况下,说明测试装置当前使用的一个新的测试样本不是理想的样本,需要丢弃当前使用的一个新的测试样本,并需要变换测试思路,重新生成新的测试样本,以提升代码覆盖率。
基于上述实施例,参阅图3所示,本发明实施例中,一种Fuzz测试中的程序流跟踪装置(即测试装置)至少包括生成单元30、处理单元31和记录单元32,其中,
生成单元30,用于生成一个测试样本,并启动一个监视进程;
处理单元31,用于通过预先配置的API调用CPU,基于当前启动的一个监视进程,采用相应的一个测试样本对待测试程序进行测试;
记录单元32,用于记录测试过程中产生的程序流。
较佳的,生成一个测试样本之前,生成单元30进一步用于:
判断本地是否设置有能够调用CPU完成程序流跟踪功能的API,确定存在时,判定本地的CPU支持程序流跟踪功能、
较佳的,记录测试过程中产生的程序流时,记录单元32用于:
将测试过程中产生的程序流保存至缓存区,每当确定缓存区已满时,将缓存区中当前保存的程序流保存至指定的存储位置,并清空缓存区,以及继续在缓存区中记录后续产生的程序流。
较佳的,处理单元31进一步包括:
监测到当前启动的一个监视进程退出时,确定相应的一个测试样本执行完毕;
提取执行所述一个测试样本的过程中,CPU跟踪并记录的程序流;
对提取的程序流进行分析,根据分析结果判定待测试程序发生异常时,进行告警。
较佳的,处理单元31进一步用于:
确定一个测试样本执行完毕且对相应的程序流进行分析后,根据分析结果判断是否存在新的代码分支,若是,则保存所述一个测试样本,否则,丢弃所述一个测试样本。
较佳的,若保存所述一个测试样本,则生成单元30进一步用于:
基于所述一个测试样本,生成一个新的测试样本,以及启动一个新的监测进程;
处理单元31进一步用于:
通过所述API调度CPU,基于所述一个新的监测进程,采用所述一个新的测试样本继续对所述待测试程序进行测试,以及记录测试过程中产生的程序流;
若丢弃所述一个测试样本,则生成单元进30一步用于:
根据指令重新生成一个新的测试样本,以及启动一个新的监测进程;
处理单元31进一步用于:
通过所述API调度CPU,基于所述一个新的监测进程,采用所述一个新的测试样本继续对所述待测试程序进行测试,以及记录测试过程中产生的程序流。
综上所述,本申请实施例中,测试装置确定待测试程序后,依次生成测试本对待测试程序进行测试,其中,每生成一个测试样本,测试装置通过预先配置的API调用中央处理器CPU,基于当前启动的一个监视进程,采用相应的一个测试样本对所述待测试程序进行测试,以及记录测试过程中产生的程序流;这样,便将cpu的硬件特性与Fuzz测试相结合,实现了程序流的跟踪,不但提高了测试效率,减少了性能开销,同时,也提升了测试过程中的代码覆盖率,进一步提升了测试准确性,获得良好的测试效果。另一方面,本申请例提供的技术方案,可以支持windows和linux两种系统,也可以跟踪没有源代码的待测试程序,进一步提升了方案的应用广泛性。
本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本申请的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请范围的所有变更和修改。
显然,本领域的技术人员可以对本申请实施例进行各种改动和变型而不脱离本申请实施例的精神和范围。这样,倘若本申请实施例的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。
Claims (12)
1.一种Fuzz测试中的程序流跟踪方法,其特征在于,包括:
生成一个测试样本,并启动一个监视进程;
通过预先配置的应用程序编程接口API调用中央处理器CPU,基于当前启动的一个监视进程,采用相应的一个测试样本对待测试程序进行测试;
记录测试过程中产生的程序流。
2.如权利要求1所述的方法,其特征在于,生成一个测试样本之前,进一步包括:
判断本地是否设置有能够调用CPU完成程序流跟踪功能的API,确定存在时,判定本地的CPU支持程序流跟踪功能。
3.如权利要求1或2所述的方法,其特征在于,记录测试过程中产生的程序流,包括:
将测试过程中产生的程序流保存至缓存区,每当确定缓存区已满时,将缓存区中当前保存的程序流保存至指定的存储位置,并清空缓存区,以及继续在缓存区中记录后续产生的程序流。
4.如权利要求1、2或3所述的方法,其特征在于,进一步包括:
监测到当前启动的一个监视进程退出时,确定相应的一个测试样本执行完毕;
提取执行所述一个测试样本的过程中,CPU跟踪并记录的程序流;
对提取的程序流进行分析,根据分析结果判定待测试程序发生异常时,进行告警。
5.如权利要求4所述的方法,其特征在于,进一步包括:
确定一个测试样本执行完毕且对相应的程序流进行分析后,根据分析结果判断是否存在新的代码分支,若是,则保存所述一个测试样本,否则,丢弃所述一个测试样本。
6.如权利要求5所述的方法,其特征在于,进一步包括:
若保存所述一个测试样本,则基于所述一个测试样本,生成一个新的测试样本,以及启动一个新的监测进程,并通过所述API调度CPU,基于所述一个新的监测进程,采用所述一个新的测试样本继续对所述待测试程序进行测试,以及记录测试过程中产生的程序流;
若丢弃所述一个测试样本,则根据指令重新生成一个新的测试样本,以及启动一个新的监测进程,并通过所述API调度CPU,基于所述一个新的监测进程,采用所述一个新的测试样本继续对所述待测试程序进行测试,以及记录测试过程中产生的程序流。
7.一种Fuzz测试中的程序流跟踪装置,其特征在于,包括:
生成单元,用于生成一个测试样本,并启动一个监视进程;
处理单元,用于通过预先配置的应用程序编程接口API调用中央处理器CPU,基于当前启动的一个监视进程,采用相应的一个测试样本对待测试程序进行测试;
记录单元,用于记录测试过程中产生的程序流。
8.如权利要求7所述的装置,其特征在于,生成一个测试样本之前,所述生成单元进一步用于:
判断本地是否设置有能够调用CPU完成程序流跟踪功能的API,确定存在时,判定本地的CPU支持程序流跟踪功能。
9.如权利要求7或8所述的装置,其特征在于,记录测试过程中产生的程序流时,所述记录单元用于:
将测试过程中产生的程序流保存至缓存区,每当确定缓存区已满时,将缓存区中当前保存的程序流保存至指定的存储位置,并清空缓存区,以及继续在缓存区中记录后续产生的程序流。
10.如权利要求7、8或9所述的装置,其特征在于,所述处理单元进一步包括:
监测到当前启动的一个监视进程退出时,确定相应的一个测试样本执行完毕;
提取执行所述一个测试样本的过程中,CPU跟踪并记录的程序流;
对提取的程序流进行分析,根据分析结果判定待测试程序发生异常时,进行告警。
11.如权利要求10所述的装置,其特征在于,所述处理单元进一步用于:
确定一个测试样本执行完毕且对相应的程序流进行分析后,根据分析结果判断是否存在新的代码分支,若是,则保存所述一个测试样本,否则,丢弃所述一个测试样本。
12.如权利要求11所述的装置,其特征在于,若保存所述一个测试样本,则所述生成单元进一步用于:
基于所述一个测试样本,生成一个新的测试样本,以及启动一个新的监测进程;
所述处理单元进一步用于:
通过所述API调度CPU,基于所述一个新的监测进程,采用所述一个新的测试样本继续对所述待测试程序进行测试,以及记录测试过程中产生的程序流;
若丢弃所述一个测试样本,则所述生成单元进一步用于:
根据指令重新生成一个新的测试样本,以及启动一个新的监测进程;
所述处理单元进一步用于:
通过所述API调度CPU,基于所述一个新的监测进程,采用所述一个新的测试样本继续对所述待测试程序进行测试,以及记录测试过程中产生的程序流。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610082897.6A CN107045474B (zh) | 2016-02-05 | 2016-02-05 | 一种Fuzz测试中的程序流跟踪方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610082897.6A CN107045474B (zh) | 2016-02-05 | 2016-02-05 | 一种Fuzz测试中的程序流跟踪方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107045474A true CN107045474A (zh) | 2017-08-15 |
CN107045474B CN107045474B (zh) | 2020-12-04 |
Family
ID=59542726
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610082897.6A Active CN107045474B (zh) | 2016-02-05 | 2016-02-05 | 一种Fuzz测试中的程序流跟踪方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107045474B (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110362485A (zh) * | 2019-07-03 | 2019-10-22 | 杭州安恒信息技术股份有限公司 | 一种挖掘Windows内核API漏洞的模糊测试方法 |
CN110554965A (zh) * | 2019-09-05 | 2019-12-10 | 腾讯科技(深圳)有限公司 | 自动化模糊测试方法及相关设备、计算机可读存储介质 |
CN111162959A (zh) * | 2019-11-28 | 2020-05-15 | 中国航空工业集团公司西安航空计算技术研究所 | 一种基于参数的航电接口数据通信协议模糊测试方法 |
CN111709031A (zh) * | 2020-05-28 | 2020-09-25 | 杭州电子科技大学 | 一种覆盖率引导的VxWorks内核模糊测试方法 |
CN111819551A (zh) * | 2018-03-13 | 2020-10-23 | Arm有限公司 | 跟踪分支指令 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8713370B2 (en) * | 2011-08-11 | 2014-04-29 | Apple Inc. | Non-intrusive processor tracing |
CN104380256A (zh) * | 2012-04-19 | 2015-02-25 | 加泰罗尼亚理工大学 | 用于虚拟化与计算机系统关联的硬件资源的方法、系统和执行代码段 |
-
2016
- 2016-02-05 CN CN201610082897.6A patent/CN107045474B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8713370B2 (en) * | 2011-08-11 | 2014-04-29 | Apple Inc. | Non-intrusive processor tracing |
CN104380256A (zh) * | 2012-04-19 | 2015-02-25 | 加泰罗尼亚理工大学 | 用于虚拟化与计算机系统关联的硬件资源的方法、系统和执行代码段 |
Non-Patent Citations (2)
Title |
---|
ADAM WILLIAMS: "Fuzzing with American Fuzzy(AFL)", 《HTTPS://LABS.NETTITUDE.COM/BLOG/FUZZING-WITH-AMERICAN-FUZZY-LOP-AFL》 * |
ANDI KLEEN ETC: "Intel Processor Trace on Linux", 《HTTPS://HALOBATES.DE/PT-TRACING-SUMMIT15.PDF》 * |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111819551A (zh) * | 2018-03-13 | 2020-10-23 | Arm有限公司 | 跟踪分支指令 |
CN110362485A (zh) * | 2019-07-03 | 2019-10-22 | 杭州安恒信息技术股份有限公司 | 一种挖掘Windows内核API漏洞的模糊测试方法 |
CN110362485B (zh) * | 2019-07-03 | 2022-12-06 | 杭州安恒信息技术股份有限公司 | 一种挖掘Windows内核API漏洞的模糊测试方法 |
CN110554965A (zh) * | 2019-09-05 | 2019-12-10 | 腾讯科技(深圳)有限公司 | 自动化模糊测试方法及相关设备、计算机可读存储介质 |
CN111162959A (zh) * | 2019-11-28 | 2020-05-15 | 中国航空工业集团公司西安航空计算技术研究所 | 一种基于参数的航电接口数据通信协议模糊测试方法 |
CN111709031A (zh) * | 2020-05-28 | 2020-09-25 | 杭州电子科技大学 | 一种覆盖率引导的VxWorks内核模糊测试方法 |
CN111709031B (zh) * | 2020-05-28 | 2022-03-01 | 杭州电子科技大学 | 一种覆盖率引导的VxWorks内核模糊测试方法 |
Also Published As
Publication number | Publication date |
---|---|
CN107045474B (zh) | 2020-12-04 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107045474A (zh) | 一种Fuzz测试中的程序流跟踪方法及装置 | |
Honarvar et al. | Property-based testing of quantum programs in Q# | |
US9459992B2 (en) | System and method of debugging multi-threaded processes | |
CN110580226B (zh) | 操作系统级程序的目标码覆盖率测试方法、系统及介质 | |
CN110532185B (zh) | 测试方法、装置、电子设备和计算机可读存储介质 | |
KR102537875B1 (ko) | 차량 ecu 소프트웨어 검증을 위한 동적 결함 주입 방법 및 장치 | |
CN110363004A (zh) | 一种代码漏洞检测方法、装置、介质及设备 | |
CN104021084A (zh) | 一种Java源代码缺陷检测方法及装置 | |
JP7287480B2 (ja) | 解析機能付与装置、解析機能付与方法及び解析機能付与プログラム | |
CN104156311B (zh) | 一种基于cpu模拟器的嵌入式c语言目标码级单元测试方法 | |
CN109871312B (zh) | 一种接口测试方法、装置、设备及可读存储介质 | |
CN111427792A (zh) | 测试方法、装置、电子设备和可读存储介质 | |
US11249888B1 (en) | System and method for generating counterexample tests of incidental invariants | |
Papadakis et al. | A symbolic execution tool based on the elimination of infeasible paths | |
Bandeira et al. | Non-intrusive fault injection techniques for efficient soft error vulnerability analysis | |
Gaudesi et al. | On test program compaction | |
CN107247663B (zh) | 一种冗余变异体识别方法 | |
Bruns et al. | Efficient cross-level processor verification using coverage-guided fuzzing | |
CN109783837A (zh) | 仿真设备、仿真系统、仿真方法和仿真程序 | |
Koca et al. | Spectrum-based fault localization for diagnosing concurrency faults | |
CN109726115B (zh) | 一种基于Intel处理器跟踪的反调试自动绕过方法 | |
CN110647467B (zh) | 基于单步异常的目标码覆盖率测试方法、系统及介质 | |
Condia et al. | Untestable faults identification in GPGPUs for safety-critical applications | |
US20050166103A1 (en) | System, method, and apparatus for firmware code-coverage in complex system on chip | |
JP2009129132A (ja) | ソフトウェア部分テストシステム、それに用いる方法およびプログラム |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |