首页 / 专利库 / 专利权 / 第I章 / 受理局 / 形式要求 / 缺陷 / 一种针对软件缺陷的检测方法

一种针对软件缺陷的检测方法

阅读:3发布:2021-06-13

专利汇可以提供一种针对软件缺陷的检测方法专利检索,专利查询,专利分析的服务。并且本 发明 涉及一种针对 软件 缺陷 (software vulnerability)的检测方法,属于信息安全技术领域。其具体操作步骤如下:①收集包含已知缺陷的软件源代码程序;②获取缺陷代码表;③获取待测试程序的 控制流图 CFG和汇编代码;④确定待测试程序汇编代码中的重点分析代码段并通过待测试程序的控制流图CFG获取经过重点分析代码段对应的 节点 的所有路径;⑤对每条可疑路径,利用改进的Fuzzing测试方法进行检测,得到待测试程序的检测结果。本发明在确定适应度函数时,消除了对被测程序的源代码的依赖,并保持了信息的可用性;消除了抽象语法树中的冗余信息并保持有用信息的完整性因此具有更好的实用性和更高的效率。,下面是一种针对软件缺陷的检测方法专利的具体信息内容。

1.一种针对软件缺陷的检测方法,其特征在于:其具体操作步骤如下:
步骤一、收集包含已知缺陷的软件源代码程序;
步骤二、获取缺陷代码表;
对步骤一中所述的软件源代码程序进行处理,确认引发缺陷的相关代码,并利用反汇编工具得到引发缺陷的相关代码的汇编代码,构造缺陷代码表;
步骤三、获取待测试程序的控制流图CFG和汇编代码;
分析待测试程序的可执行文件,利用反汇编工具可得到待测试程序的控制流图CFG和汇编代码;控制流图CFG表示为G=,其中N为控制流图CFG中的节点的集合,E为控制流图CFG中的边的集合;控制流图CFG中的每个节点对应待测试程序的可执行文件中的一个汇编代码段;控制流图CFG中的每条边表示各节点之间的跳转关系,并为集合N建立一张节点起始地址表,其记录每个节点对应的汇编代码段的起始地址;
步骤四、确定待测试程序汇编代码中的重点分析代码段并通过待测试程序的控制流图CFG获取经过重点分析代码段对应的节点的所有路径;具体为:
步骤4.1:根据步骤二得到的缺陷代码表,在步骤三得到的待测试程序的汇编代码中查找缺陷代码表中的代码;如果在待测试程序的汇编代码中出现缺陷代码表中的代码,则记录其位置,确定其为重点分析代码段;
步骤4.2:在待测试程序的控制流图CFG中标记该重点分析代码段对应的节点位置;
步骤4.3:获取经过标记节点的所有路径,称之为可疑路径;
步骤五、对每条可疑路径,利用改进的Fuzz ing测试方法进行检测,得到待测试程序的检测结果;
所述改进的Fuzzing测试方法与已有Fuzzing测试方法的区别在于:对已有Fuzzing测试方法的第1步生成的测试用例采用遗传算法,从中挑选出仅经过可疑路径的测试用例,并通过多次迭代不断生成经过可疑路径的测试用例;
其具体过程如下:
步骤5.1:将迭代次数generation的初始值为0,并随机生成一组测试用例X(generation)={x1,x2,……,xs};s为正整数,表示生成的测试用例的数量;设置记录X(generation)中的测试用例经过节点i的次数mi的初始值为0;表示节点i转向节点h的次数ni,h的初始值为0;节点i∈N;节点h∈N;
步骤5.2:设置遗传算法中使用到的参数值,包括:交叉概率CrossoverRate、变异概率Mutation Rate和最大迭代次数Max的值;
步骤5.3:设置表示测试用例序号j的初始值为1;j的取值范围为正整数;
步骤5.4:将待测试程序的控制流图CFG中每个节点的状态参数设置为0,表示测试用例未经过该节点;
步骤5.5:输入测试用例xj,并对测试用例xj在执行过程中所经过每个节点,作如下操作:
步骤5.5.1:在节点i,测试用例xj是否使待测试程序出现异常退出或出错的情况,如果使待测试程序出现异常退出或出错,则结束对该条可疑路径的检测,开始对下一条可疑路径的检测;否则,执行步骤5.5.2的操作;
步骤5.5.2:当测试用例xj使程序从节点i转向下一节点时,判断下一节点的起始地址是否出现在步骤三中所述节点起始地址表中,如果出现在步骤三中所述节点起始地址表中,称下一节点为节点h,同时mi和ni,h的值均增加1,并且如果节点h的状态参数为0,则将其状态更新为1;然后执行步骤5.6的操作;如果该节点的转向地址不在步骤三中所述节点起始地址表中,结束对该条可疑路径的检测,开始对下一条可疑路径的检测;
步骤5.6:j的值增1,并判断j>s是否成立,如果成立,则执行步骤5.7;否则,重复执行步骤5.4;
步骤5.7:判断generation≥Max是否成立,如果成立,则认为当前可疑路径上不存在潜在缺陷,结束对当前路径的检测;如果不成立,则执行步骤5.8;
步骤5.8:使用公式1,依次计算待测试程序的控制流图CFG中的节点i到节点i的下一节点h的适应度值:
步骤5.9:计算每个测试用例经过的路径的适应度值F',计算方法为:将该测试用例经过的所有节点i到其下一节点h的适应度值的和或乘积作为该测试用例的适应度值F';
步骤5.10:计算可疑路径的适应度值F;计算方法为:将该可疑路径上的所有节点i到其下一节点h的适应度值的和或乘积作为该可疑路径的适应度值F;
步骤5.11:在X(generation)中删除适应度值F'不等于可疑路径的适应度值F的测试用例;
步骤5.12:对X(generation)中的每一个测试用例转换成二进制编码;
步骤5.13:在X(generation)中随机选取两个测试用例xp和xq,采用单点交叉的策略,将测试用例xp和xq的二进制编码中的第r位上的值以交叉概率Crossover Rate互换,生成两个新的子测试用例xp’和xq’,将其保存在X(generation+1)中;其中交叉位置r随机生成,并且确保测试用例xp和xq的二进制编码中的第r位上的值不相等;r的取值范围为正整数;
步骤5.14:重复步骤5.13,直到X(generation)中的测试用例都被选中为止;
步骤5.15:在X(generation)中随机选取一个测试用例xa,在测试用例xa的二进制编码中的第v位上的值,以变异概率Mutation Rate取反,生成一个子测试用例xa’,将其保存在X(generation+1)中,其中v随机生成,v为正整数;
步骤5.16:将X(generation+1)中的测试用例的二进制编码转换成原编码方式;
步骤5.17:迭代次数generation增加1;重复执行步骤5.3的操作;重复执行步骤5.3到步骤5.17的操作,直到完成对该可疑路径的检测;
重复执行步骤5.1到步骤5.17的操作,直到完成对所有可疑路径的检测;经过上述步骤的操作,即可检测出待测试程序是否存在缺陷。

说明书全文

一种针对软件缺陷的检测方法

技术领域

[0001] 本发明涉及一种针对软件缺陷(software vulnerability)的检测方法,属于信息安全技术领域。

背景技术

[0002] 随着计算机技术的迅速发展,人类社会的信息化程度越来越高,整个社会的政治、经济、军事、文化以及其他领域对计算机信息系统的依赖程度也越来越高。在这种情况下,计算机系统的安全性得到了人们越来越多的关注。然而,大型软件、系统的编写需要许许多多程序员共同完成,他们将一个软件或系统分成若干板,分工编写,然后再汇总,测试;最后再修补、发布,因此在软件中存在安全漏洞几乎是不可避免的。软件缺陷包括软件安全漏洞和其它软件错误。软件安全漏洞是在软件设计实现过程中被引入的、在数据访问或行为逻辑等方面的错误并被攻击者利用,从而使程序行为违背一定的安全策略。其它软件错误是相对于基于软件安全漏洞来讲不能够威胁到软件系统安全的那些软件错误。
[0003] 按照检测过程中是否需要执行程序的标准,软件安全漏洞检测技术分为动态检测和静态检测。
[0004] (1)动态测试
[0005] 动态测试是在程序运行过程中注入测试数据,通过对程序的运行环境(包括环境变量、内存、堆和栈等)进行分析,观察程序运行是否正常、程序行为是否满足要求,来检测程序是否存在漏洞。动态检测技术的优点是不直接面对源代码,不需要修改目标程序源代码,这在一定程度上提高程序的保密性。但其缺点是仅关注程序运行的外部表现,因此,定位不准确、漏报率高,不能很好地发现隐藏在程序中的漏洞。动态测试主要应用于软件生命周期的测试阶段。
[0006] (2)静态检测
[0007] 静态检测主要应用于软件生命周期的编码阶段。静态检测不编译运行程序,而是通过对程序源代码进行分析以发现其中的错误。静态检测的目标不是证明程序完全正确,而是作为动态测试的补充,在程序运行前尽可能多地发现其中隐含的错误,提高程序的可靠性和健壮性。对一些状态有限且对稳定性要求很高的软件来说,采用适当的静态检测技术是非常有必要的。但静态检测也有局限性,对于程序的某些性质(比如和指针运算、动态存储分配等相关的性质),用静态检测难以奏效。因此,静态检测并不能完全替代动态测试。
[0008] 目前对软件安全漏洞检测技术的研究有很多,这些方法可用于对软件缺陷进行检测,但其检测的不够全面,基本检测不到与软件安全漏洞对应的其它软件错误。
[0009] 本发明提出的方法中使用到两项重要的已有技术:遗传算法和Fuzzing技术。
[0010] 遗传算法是近年来发展迅速的一种启发式搜索算法。自上世纪70年代美国Michigan大学的John Holland教授提出遗传算法(genetic algorithms,GA)的概念体系以来,遗传算法在许多领域得到了高度关注和广泛应用。遗传算法是一种借鉴生物界自然选择和自然遗传机制的高度并行、随机、自适应搜索算法。它借用了生物遗传学的观点,通过自然选择、遗传、变异等作用机制,实现各个个体的适应性的提高,体现了自然界中“物竞天择、适者生存”的进化过程。天然并行性和对全局信息的有效利用能是遗传算法的两大显著特点。遗传算法不需要梯度信息,对目标函数性质没有过多要求。采用遗传算法来求解搜索问题,是充分发挥该算法并行、在满足一定条件上进行高效搜索的优点。
[0011] 一个串行运算的遗传算法描述如下:
[0012] (1)对待解决问题进行编码;
[0013] (2)随机初始化种群X(0)=(x1,x2,…xk);k为初始种群数量;
[0014] (3)对当前群体X(t)(t为迭代次数)中的每个个体xi,计算其适应度Fit(xi)的值,适应度表示了该个体的性能好坏;
[0015] (4)应用选择算子产生中间代Xr(t);
[0016] (5)对Xr(t)应用其它的算子,产生新一代群体X(t+1),这些算子的目的在于扩展有限个体的覆盖面,体现全局搜索的思想;
[0017] (6)判断是否满足终止条件,如果满足,输出结果,结束;否则,t=t+1;返回(3)。
[0018] 遗传算法中最常用的算子有如下几种:
[0019] (1)选择算子(selection/reproduction):选择算子从群体中按某一概率成对选择个体,某个体xi被选择的概率与其适应度值成正比。最通常的实现方法是轮盘赌(roulette wheel)模型。
[0020] (2)交叉算子(Crossover):交叉算子将被选中的两个个体的基因链按概率pc进行交叉,生成两个新的个体,交叉位置是随机的。其中pc是一个系统参数。
[0021] (3)变异算子(Mutation):变异算子将新个体的基因链的各位按概率pm进行变异。
[0022] Fuzzing是一种基于缺陷注入的自动软件测试技术。通过编写fuzzer工具向目标程序提供某种形式的输入并观察其响应来发现问题,这种输入可以是完全随机的或精心构造的。Fuzzing测试通常以大小相关的部分、字符串、标志字符串开始或结束的二进制块等为重点,使用边界值附近的值对目标进行测试。
[0023] 主要有两种类型的fuzzing技术:
[0024] 1.dumb fuzzing:这种测试无需了解协议或文件本身格式,通过提供完全随机的输入或简单改变某些字节去发现问题。这种方法实现起来较简单,容易快速触发错误,但它的完全随机性会导致产生大量无效的输入或格式。
[0025] 2.Intelligent fuzzing:研究目标应用程序的协议或文件格式、功能配置,了解各类漏洞的成因,有目的地编写fuzzer。编写有效的fuzzer需要花费时间,但能够对某些感兴趣的部分集中测试,因此更有效。在对目标进行fuzzing的过程中,也可能存在各种问题:校验和、加密、压缩等措施会大大增加fuzzer工具的编写难度;编写智能化的fuzzer依赖目标程序的协议文档,因此协议文档的完整性影响fuzzing测试的效果,等等。
[0026] Fuzzing测试过程中需要采取措施记录目标的状态,通常通过日志的方式记录下各种信息,以便后续分析。目前比较有名的fuzzer工具有SPIKE和Peach,它们提供了对许多协议接口的支持,现有的许多fuzzer都是基于这两个框架实现的。
[0027] 概括的讲,Fuzzing测试过程如下:
[0028] 第1步:生成大量的数据作为测试用例
[0029] 第2步:将测试用例输入到程序中,看程序是否发生异常。
[0030] 第3步:监测并记录任何引发程序崩溃或者异常的恶意输入。
[0031] 第4步:审查测试日志,继续深入分析。

发明内容

[0032] 本发明的目的是针对上述已有技术存在的不足,提出一种针对软件缺陷的检测方法。
[0033] 本发明的目的是通过下述技术方案实现的。
[0034] 一种针对软件缺陷的检测方法,其具体操作步骤如下:
[0035] 步骤一、收集包含已知缺陷的软件源代码程序。
[0036] 步骤二、获取缺陷代码表。
[0037] 对步骤一中所述的软件程序进行处理,确认引发缺陷的相关代码,并利用反汇编工具得到引发缺陷的相关代码的汇编代码,构造缺陷代码表。
[0038] 步骤三、获取待测试程序的控制流图CFG和汇编代码。
[0039] 分析待测试程序的可执行文件,利用反汇编工具可得到待测试程序的控制流图CFG(Control Flow Graph)和汇编代码。控制流图CFG表示为G=,其中N为控制流图CFG中的节点的集合,E为控制流图CFG中的边的集合。控制流图CFG中的每个节点对应待测试程序的可执行文件中的一个汇编代码段;控制流图CFG中的每条边表示各节点之间的跳转关系。然后为集合N建立一张节点起始地址表,其记录每个节点对应的汇编代码段的起始地址。
[0040] 步骤四、确定待测试程序汇编代码中的重点分析代码段并通过待测试程序的控制流图CFG获取经过重点分析代码段对应的节点的所有路径。具体为:
[0041] 步骤4.1:根据步骤二得到的缺陷代码表,在步骤三得到的待测试程序的汇编代码中查找缺陷代码表中的代码;如果在待测试程序的汇编代码中出现缺陷代码表中的代码,则记录其位置,确定其为重点分析代码段。
[0042] 步骤4.2:在待测试程序的控制流图CFG中标记该重点分析代码段对应的节点位置。
[0043] 步骤4.3:获取经过标记节点的所有路径,称之为可疑路径。
[0044] 步骤五、对每条可疑路径,利用改进的Fuzzing测试方法进行检测,得到待测试程序的检测结果。
[0045] 所述改进的Fuzzing测试方法与已有Fuzzing测试方法的区别在于:对已有Fuzzing测试方法的第1步生成的测试用例采用遗传算法,从中挑选出仅经过可疑路径的测试用例,并通过多次迭代不断生成经过可疑路径的测试用例。
[0046] 其具体过程如下:
[0047] 步骤5.1:将迭代次数generation的初始值为0,并随机生成一组测试用例X(generation)={x1,x2,……,xs};s为正整数,表示生成的测试用例的数量。设置记录X(generation)中的测试用例经过节点i的次数mi的初始值为0;表示节点i转向节点h的次数ni,h的初始值为0;节点i∈N;节点h∈N。
[0048] 步骤5.2:设置遗传算法中使用到的参数值,包括:交叉概率Crossover Rate、变异概率Mutation Rate和最大迭代次数Max的值。
[0049] 步骤5.3:设置表示测试用例序号j(j为正整数)的初始值为1。
[0050] 步骤5.4:将待测试程序的控制流图CFG中每个节点的状态参数设置为0,表示测试用例未经过该节点。
[0051] 步骤5.5:输入测试用例xj,并对测试用例xj在执行过程中所经过每个节点,作如下操作:
[0052] 步骤5.5.1:在节点i,测试用例xj是否使待测试程序出现异常退出或出错的情况,如果使待测试程序出现异常退出或出错,则结束对该条可疑路径的检测,开始对下一条可疑路径的检测;否则,执行步骤5.5.2的操作。
[0053] 步骤5.5.2:当测试用例xj使程序从节点i转向下一节点时,判断下一节点的起始地址是否出现在步骤三中所述节点起始地址表中,如果出现在步骤三中所述节点起始地址表中,称下一节点为节点h,同时mi和ni,h的值均增加1,并且如果节点h的状态参数为0,则将其状态更新为1;然后执行步骤5.6的操作;如果该节点的转向地址不在步骤三中所述节点起始地址表中,结束对该条可疑路径的检测,开始对下一条可疑路径的检测。
[0054] 步骤5.6:j的值增1,并判断j>s是否成立,如果成立,则执行步骤5.7;否则,重复执行步骤5.4。
[0055] 步骤5.7:判断generation≥Max是否成立,如果成立,则认为当前可疑路径上不存在潜在缺陷,结束对当前路径的检测;如果不成立,则执行步骤5.8。
[0056] 步骤5.8:使用公式1,依次计算待测试程序的控制流图CFG中的节点i到节点i的下一节点h的适应度值f:
[0057]
[0058] 步骤5.9:计算每个测试用例经过的路径的适应度值F′,计算方法为:将该测试用例经过的所有节点i到其下一节点h的适应度值的和或乘积作为该测试用例的适应度值F′。
[0059] 步骤5.10:计算可疑路径的适应度值F;计算方法为:将该可疑路径上的所有节点i到其下一节点h的适应度值的和或乘积作为该可疑路径的适应度值F。
[0060] 步骤5.11:在X(generation)中删除适应度值F′不等于可疑路径的适应度值F的测试用例。
[0061] 步骤5.12:在X(generation)中进一步删除测试用例经过路径的第二个节点与可疑路径经过路径的第二个节点不同的测试用例。
[0062] 步骤5.13:对X(generation)中的每一个测试用例转换成二进制编码。
[0063] 步骤5.14:在X(generation)中随机选取两个测试用例xp和xq,采用单点交叉的策略,将测试用例xp和xq的二进制编码中的第r(r为正整数)位上的值以交叉概率Crossover Rate互换,生成两个新的子测试用例xp’和xq’,将其保存在X(generation+1)中;其中交叉位置r随机生成,并且确保测试用例xp和xq的二进制编码中的第r位上的值不相等。
[0064] 步骤5.15:重复步骤5.14,直到X(generation)中的测试用例都被选中为止。
[0065] 步骤5.16:在X(generation)中随机选取一个测试用例xa,在测试用例xa的二进制编码中的第v(v为正整数)位上的值,以变异概率Mutation Rate取反,生成一个子测试用例xa’,将其保存在X(generation+1)中,其中v随机生成。
[0066] 步骤5.17:将X(generation+1)中的测试用例的二进制编码转换成原编码方式。
[0067] 步骤5.18:迭代次数generation增加1;重复执行步骤5.3到步骤5.18的操作,直到完成对该可疑路径的检测。
[0068] 重复执行步骤5.1到步骤5.18的操作,直到完成对所有可疑路径的检测;
[0069] 经过上述步骤的操作,即可检测出待测试程序是否存在缺陷。
[0070] 有益效果
[0071] 本发明提出的方法与已有技术相比较,有如下优点:
[0072] ①本发明在原有Fuzzing测试方法中,使用了遗传算法,确保了测试用例的有效性,是检测更实用、有效;
[0073] ②在确定适应度值时,消除了对待测试程序的源代码的依赖;
[0074] ③本发明不仅可以检测出待测试程序中潜在的漏洞进行检测,而且可以发现其中的其它缺陷问题,使检测结果更为全面。附图说明
[0075] 图1为关于本发明的针对软件缺陷的检测方法的一种具体实施方式中的操作流程示意图;
[0076] 图2为关于本发明的针对软件缺陷的检测方法的一种具体实施方式中的控制流CFG图;
[0077] 图3为关于本发明的针对软件缺陷的检测方法的一种具体实施方式中包含有节点适应度值的控制流CFG图。

具体实施方式

[0078] 下面结合附图和具体实施例对本发明技术方案进行详细描述。
[0079] 本实施例采用本发明方法对一个大小为172KB的待测试可执行程序进行测试,该可执行程序的功能是实现对密码的验证,如果验证结果为正确,则输出Access granted,如果验证结果为错误,则输出Access denied。
[0080] 其操作流程如图1所示,具体为:
[0081] 步骤一、收集包含已知缺陷的软件源代码程序。
[0082] 收集已知的具有缺陷的软件程序及其源代码,共32个。其中包括缓冲区溢出、格式化字符串、整数溢出等漏洞程序和已知相关缺陷的程序。
[0083] 步骤二、获取缺陷代码表。
[0084] 对步骤一中所述的软件程序进行处理,确认引发缺陷的相关代码,并利用反汇编工具得到引发缺陷的相关代码的汇编代码,构造有32条记录的缺陷代码表。
[0085] 步骤三、获取待测试程序的控制流图CFG和汇编代码。
[0086] 经IDA pro分析待测试程序后,得到其CFG图,如图2所示。其中节点集N={A,B,C,D,E},边集E={AB,AE,BC,BD,CE,DE}。节点起始转向地址表如下:
[0087] 表1节点起始转向地址表
[0088]节点 起始地址
A 00401070
B 00401098
C 004010CB
D 004010DA
E 004010E7
[0089] 其中,节点A包含的汇编码如下:
[0090] sub_401070 proc near
[0091] var_50=byte ptr-50h
[0092] var_10=byte ptr-10h
[0093] var_4=dword ptr-4
[0094] push ebp
[0095] mov ebp,esp
[0096] sub esp,50h
[0097] push ebx
[0098] push esi
[0099] push edi
[0100] lea edi,[ebp+var_50]
[0101] mov ecx,14h
[0102] mov eax,0CCCCCCCCh
[0103] rep stosd
[0104] mov [ebp+var_4],0
[0105] mov eax,1
[0106] test eax,eax
[0107] jz short loc_4010E7
[0108] 节点B包含的汇编码如下:
[0109] push offset aPleaseInputPas;″please input password:\t\t″[0110] call _printf
[0111] add esp,4
[0112] lea ecx,[ebp+var_10]
[0113] push ecx
[0114] push offset Format;″%s″
[0115] call _scanf
[0116] add esp,8
[0117] lea edx,[ebp+var_10]
[0118] push edx
[0119] call sub_401005
[0120] add esp,4
[0121] mov [ebp+var_4],eax
[0122] cmp [ebp+var_4],0
[0123] jz short loc_4010DA
[0124] 节点C包含的汇编码如下:
[0125] push offset aIncorrectPassw
[0126] call _printf
[0127] add esp,4
[0128] jmp short loc_4010E7
[0129] 节点D包含的汇编码如下:
[0130] push offset aCongratulation
[0131] call _printf
[0132] add esp,4
[0133] 节点E包含的汇编码如下:
[0134] loc_4010E7:
[0135] pop edi
[0136] pop esi
[0137] pop ebx
[0138] add esp,50h
[0139] cmp ebp,esp
[0140] call _chkesp
[0141] mov esp,ebp
[0142] pop ebp
[0143] retn
[0144] sub_401070 endp
[0145] 步骤四、确定待测试程序汇编代码中的重点分析代码段并通过待测试程序的控制流图CFG获取经过重点分析代码段对应的节点的所有路径。具体为:
[0146] 步骤4.1:经过分析可确定,一段具有缓冲区溢出缺陷的汇编代码段出现在了节点B中,故将节点B进行标记。
[0147] 步骤4.2:获取经过标记节点B的所有路径,A→B→C→E和A→B→D→E。
[0148] 步骤五、对每条可疑路径,利用改进的Fuzzing测试方法进行检测。得到待测试程序的检测结果。
[0149] 对路径A→B→C→E进行检测的具体过程如下:
[0150] 步骤5.1:设置generation=0,并随机生成30个测试用例,使X(0)={x1,x2,……,x30}。设置mi=0,ni,h=0。
[0151] 步骤5.2:设置交叉概率Crossover Rate=80%,变异概率MutationRate=75%,最大迭代次数Max=50。
[0152] 步骤5.3:设置表示测试用例序号j的初始值为1。
[0153] 步骤5.4:将待测试程序的控制流图CFG中每个节点的状态参数设置为0。
[0154] 步骤5.5:输入测试用例xj,并记录测试用例xj在执行过程中所经过每个节点。
[0155] 步骤5.6:当步骤5.1产生的30个测试用例执行完以后,根据步骤5.5的记录结果,执行步骤5.7。
[0156] 步骤5.7:判断generation≥50是否成立,不成立,因此执行步骤5.8。
[0157] 步骤5.8:使用公式1,得到待测试程序的控制流图CFG中的节点i到节点i的下一节点h的适应度值,f(A,B)=0.93;f(A,E)=0.07;f(B,C)=0.9;f(B,D)=0.1;f(C,E)=1;f(D,E)=1。
[0158] 步骤5.9:使用步骤5.8得到的结果,分别计算30个测试用例经过的路径的适应度值F′,计算方法为:某一个测试用例经过的所有节点i到其下一节点h的适应度值的乘积即为该测试用例的适应度值F′。
[0159] 步骤5.10:计算可疑路径A→B→C→E的适应度值F。
[0160] F=0.93×0.9×1=0.837
[0161] 步骤5.11:在X(0)中删除适应度值不等于0.873测试用例。
[0162] 步骤5.12:在X(0)中进一步删除测试用例经过路径的第二个节点不是节点B的测试用例。
[0163] 步骤5.13:对X(0)中的每一个测试用例转换成二进制编码,如测试用例93547转换成二进制编码后为1001 0011 0101 0100 0111。
[0164] 步骤5.14:随机选取两个测试用例x1、x7进行交叉操作,如下表所示:
[0165]父测试用例 子测试用例
1001 0011 0101 0100 0111 1001 0011 0101 0100 0101
1010 0110 0101 0111 0100 1010 0110 0101 0111 0110
[0166] 步骤5.15:重复步骤5.14,直到X(generation)中的测试用例都被选中为止。
[0167] 步骤5.16:随机选取一个测试用例x29进行变异操作,在测试用例x29的二进制编码中,随机生成v值,本次操作中v=7,即将测试用例x29的二进制编码中第7位上的值,以变异概率90%取反,生成一个子测试用例x29’,如010001110001经过变异后为0100 01010001,将其保存在X(generation+1)中。
[0168] 步骤5.17:将X(generation+1)中的测试用例的二进制编码转换成原编码方式。
[0169] 步骤5.18:迭代次数generation增加1;重复执行步骤5.3到5.18的操作。经过多次的重复操作,在第9次迭代,即X(9),执行测试用例376242872765中,该测试程序出现了异常退出,确定节点B具有缓冲区溢出的缺陷。
[0170] 重复执行步骤5.1到步骤5.18的操作,直到完成对所有可疑路径的检测。
[0171] 使用本发明方法,共生成73个测试用例即检测出该待测试可执行文件的缺陷类型及所在位置。
[0172] 为说明本发明效果,使用已有的Fuzzing测试方法对相同的待测试可执行文件进行测试,共生成2876个测试用例,该测试程序出现了异常退出。
[0173] 上述实施例发现,在确定适应度值时没有利用待测试程序的源代码信息,也保持了检测结果的准确性;同时与传统的Fuzzing技术相比,两种方法生成的测试用例数量之比为73∶2876,也说明本发明方法的效率高。
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈