基于智能路径引导的敏感点逼近方法

xiaoxiao2021-3-1  215

基于智能路径引导的敏感点逼近方法
【技术领域】
[0001] 本发明涉及漏洞挖掘和信息安全技术领域,特别涉及一种基于智能路径引导的敏 感点逼近方法。
【背景技术】
[0002] 动态数据流分析是研究与发现软件漏洞的有效手段,其中动态污点分析技术的使 用最为突出。动态污点分析从软件安全漏洞利用的本质出发,标记外部输入为污点数据,跟 踪污点数据在内存中的扩散过程,检测程序是否非法使用污点数据,譬如覆盖栈中返回地 址,作为EIP的值等等。动态污点分析技术广泛运用于软件回归测试、软件脆弱性分析、网络 渗透攻击检测分析等领域中。由于其抓住了软件安全漏洞利用的实质,无论安全漏洞是否 已经公开,该检测技术在原理上都是行之有效的。但是如何高效地进行动态污点分析是软 件分析中的重要问题。为解决测试案例集覆盖率低下的问题,目前研究的热点是将程序抽 象为形式化模型,采用测试案例自动生成算法对形式化模型中的各种信息进行提取、生成 一个完备的测试案例集,其中最常用的方法是符号执行。符号执行是一种基于符号化的模 型检验方法,广泛用于符号调试,测试案例生成等。其核心思想是使用符号值代替具体的变 量输入,并使用符号表达式来表示程序中各变量的值。最终,程序的输出值被转化为一个以 符号值作为输入的函数。符号执行将程序抽象为符号执行树,其中顺序语句对应着树的计 算节点,分支语句对应着分支节点,而对于循环语句,将其按循环次数展开为语义上等价的 分支语句。一般,一条循环语句对应一组分支节点。可以认为,在符号执行过程中,程序只有 顺序和分支两种结构。符号执行的过程本质上是路径条件的构造过程。路径条件指的是对 于执行该路径的测试案例,程序输入值所需要满足的数学约束条件。因而一个路径条件唯 一地对应一条执行路径。一个路径条件由一组子条件(sub-condi t ion)组成,每一个被执行 分支的条件作为一个子条件。在初始时路径条件为true,在探索程序的过程中,每遇到一个 分支语句,就更新路径条件,将被执行分支的条件加入到路径条件中,公式为PC = PC~new sub-condition。由于每一个分支语句都对应着true和false两个分支,而符号执行基于静 态分析,变量没有具体的数值,因而无法确定执行哪一条分支。所以对两条分支都进行探索 (搜索顺序可按需定义,深度优先,广度优先等),即分别以两个分支的条件作为子条件来更 新路径条件。这样就得到了两个新的路径条件,对应两条不同的执行路径。之后,继续对这 两条路径分别进行探索。符号执行实现了对程序的全路径探索。当程序探索结束时就得到 了被测程序所有执行路径的路径条件。最后,检查所有得到的路径条件,如果路径条件是无 法被满足的,则说明该路径是一条不可执行路径,如果路径条件可以被满足,则说明该路径 是一条可执行路径。将路径条件输入约束求解器即可解出对应的测试案例。
[0003]但是现阶段符号执行的使用仍存在一定阻碍,使得其难以大规模使用。首先符号 执行是一种基于搜索的遍历算法,需要对程序的所有分支进行遍历,虽然可以通过一些附 加的剪枝条件进行优化,但其算法的复杂度非常高,为〇(2 n),其中η为被测程序中分支点的 数目,导致路径爆炸,测试的效率就受到较大影响。其次针对二进制代码,由于其缺乏包含 语义和语法的类型信息。使得对其的污点分析污染源往往是外部输入的比特流,只能按字 节等内存操作数的粒度来定义污点数据;同样地,对于符号执行来说,对输入数据的符号化 也将针对字节粒度等。这不仅增加了技术实现的复杂性,也会使得符号执行得到的符号表 达式往往非常庞大、冗余很多,由此得到的路径条件往往相当复杂或难于求解。

【发明内容】

[0004] 针对现有技术中的不足,本发明提供一种基于智能路径引导的敏感点逼近方法, 根据漏洞模型识别出可疑漏洞位置,有效缓解路径爆炸问题,提高漏洞挖掘的效率。
[0005] 按照本发明所提供的设计方案,一种基于智能路径引导的敏感点逼近方法,包含 如下步骤:
[0006] 步骤1.标记敏感点,提取不同类型的漏洞模型,通过静态分析,识别出可疑的漏洞 位置,标记为敏感点;
[0007] 步骤2.以敏感点为起点,采用路径回溯算法向上回溯,查找所有路径分支点,找到 跳转指令地址,直至回溯到离程序入口点最近的路径分支点,将所有的路径分支点放入可 达路径集合T = ( tl,t2 . . . tm);
[0008] 步骤3.对被测程序进行指令级插粧,输入初始样本,记录与污点有关的二进制指 令序列;
[0009] 步骤4.将二进制指令序列提升为中间语言描述;
[0010] 步骤5.获得中间语言描述的路径分支点P=(P1,P2. . .pn),第一个分支点pi肯定在 集合T= (tl,t2. . . tm)中,并且pi = tl,根据分支点是否位于集合T中,对分支点进行翻转,弓| 导控制流抵达敏感点,若PleT且巧+1 g 7(l<i<n),则将中间语言描述中的分支点?1进行 翻转,若PieT且pi+1 eT( 1 < i <n),则不改变分支点,找到不在集合T中的分支点,若所有分 支点都在集合T中,说明控制流已抵达敏感点,算法结束,否则,进入步骤6;
[0011] 步骤6.从翻转后的中间语言描述中提取约束范式,使用STP约束求解器进行求解, 产生新的样本,回到步骤3,重新输入样本。
[0012]上述的,步骤2具体包含如下内容:
[0013]步骤2.1、将敏感点位置记为A,建立队列LI、L2,并初始化为空;
[0014] 步骤2.2、获取厶的交叉引用以1^~)=汽4),(41,六2-_)表示交叉引用结果的集 合,判断集合中元素的个数N,若N为0,执行步骤2.5;若N为1,执行步骤2.3;若大于1,则执行 步骤2.4;
[0015] 步骤2.3、获取元素对应的汇编指令,若为跳转指令,则判断元素是否存在于最终 结果集合RES中,若不存在,则保存到最终结果集合RES中;若存在,则不保存,将元素位置设 为A,执行步骤2.2;
[0016] 步骤2.4、获取元素对应的汇编指令,若为跳转指令,则判断元素是否存在于最终 结果集合RES中,若不存在,则保存到最终结果集合RES中;若存在,则不保存,并判断元素是 否在L1或者L2中,不在的元素结果入队L2;
[0017] 步骤2.5、获取队列L2队头,位置设为A,将A入队L1,执行步骤2.2,并判断队列L2, 若队列L2为空,则算法结束。
[0018] 上述的,所述步骤5中根据分支点是否位于集合T中,对分支点进行翻转,引导控制 流抵达敏感点,具体包含如下内容:
[0019] 步骤5.1、输入当前分析的路径分支点序号i,查找指定分支点,包括路径分支点pi 的相对地址和模块名称,逐行扫描中间语言描述文件,计算出指定路径分支点序号i的程序 分支点的相对地址和所在模块名称;
[0020] 步骤5.2、查询集合T,判断路径分支点pi相对地址是否在集合T中,若pi相对地址 不在集合T中或pi为当前路径最后分支点,则算法结束,否则进入步骤5.3;
[0021] 步骤5.3、查询集合1',判断路径分支点?1 + 1相对地址是否在集合1'中,若?1+1相对 地址不在集合T中,则将分支点pi翻转,得到翻转后的中间语言文件,否则,进入步骤5.4; [0022]步骤5.4、不翻转当前路径分支点pi,i递增1,将当前分析的路径分支点切换为下 一个,跳转步骤5.1执行。
[0023]上述的,所述步骤5.1中,查找指定分支点,包括路径分支点pi的相对地址和模块 名称,逐行扫描中间语言描述文件,计算出指定路径分支点序号i的程序分支点的相对地址 和所在模块名称,具体包含如下步骤:
[0024] 步骤5 · 1 · 1、打开中间语言描述文件,设置bool型变量found为false;
[0025] 步骤5.1.2、判断是否到达文件终止处,若是,则跳转至步骤5.1.8,否则,读取一行 文件内容到字符串line中,备份读取该行前的文件指针值到curposl,备份读取该行后的文 件指针值到curpos2;
[0026] 步骤5.1.3、判断line中保存的内容是否是assert语句所在行内容,若是,贝1J进入 步骤5.1.4,否则,跳转至步骤5.1.6执行;
[0027] 步骤5.1.4、判断该assert语句对应的分支点深度是否等于i,若是,则将found变 量赋值为true,并进入步骤5.1.5,否则,跳转至步骤5.1.2执行;
[0028]步骤5.1.5、利用curpos 1读取上一行的内容,使用字符串截取出内容中该分支点 指令的绝对地址addr,跳转至步骤5.1.2执行;
[0029] 步骤5.1.6、通过字符串比较操作,判断line中保存的内容是否是loaded module 所在行内容,若是,则进入步骤5.1.7,否则,跳转至步骤5.1.2执行;
[0030]步骤5. 1.7、截取出模块名称、模块低地址和模块高地址,存放于结构体数组 module中,跳转至步骤5.1.2执行;
[0031] 步骤 5.1.8、文件扫描结束时,如果found变量为false,则在输出结果中插入错误 路径标记,并进入步骤5.1.10,如果found变量为true,则进入步骤5.1.9;
[0032] 步骤5.1.9、比较分支点绝对地址addr和结构体数组module中保存的模块低地址 和模块高地址,判断出指定分支点所在的模块名称m 〇 d u 1 e n a m e,并计算分支点相对地址 relativeaddr,将 modulename 和 relativeaddr 写入输出结果,进入步骤 5.1 · 10;
[0033]步骤5.1.10、算法结束,从输出结果中查找到分支点地址。
[0034]本发明的有益效果:
[0035] 1、本发明根据漏洞模型识别出敏感点位置,通过敏感点来引导控制流抵达敏感点 位置,有效缓解现有技术中路径爆炸的问题,提高漏洞挖掘的效率,因敏感点是漏洞挖掘的 终点,如何构造测试样本抵达敏感点位置是关键,通过深度和广度优先算法,抵达敏感点需 要产生样本个数为〇(2~n),通过本发明的智能引导,产生样本的数量可以减少为0(n),其 中,η为被测程序中分支点的数目。
[0036] 2、本发明目的性强,可以专门测试特定类型的漏洞,通过静态分析扫描漏洞模型, 识别出符合特定漏洞模式的敏感点,通过动态符号执行,智能逼近敏感点,验证该敏感点是 否为真实漏洞,通过异常监控,若发现触发异常,则判定为真实漏洞,否则说明静态分析扫 描结果为误判,有效降低静态扫描的误报率,大大提高测试效率。
【附图说明】:
[0037] 图1为现有技术中基于深度优先遍历算法的全局翻转点示意图;
[0038]图2为本发明的流程示意图;
[0039] 图3为本发明的全局翻转点示意图。
【具体实施方式】:
[0040] 下面结合附图和技术方案对本发明作进一步详细的说明,并通过优选的实施例详 细说明本发明的实施方式,但本发明的实施方式并不限于此。
[0041] 实施例一,参见图2所示,一种基于智能路径引导的敏感点逼近方法,包含如下步 骤:
[0042] 步骤1.标记敏感点,提取不同类型的漏洞模型,通过静态分析,识别出可疑的漏洞 位置,标记为敏感点;
[0043]步骤2.以敏感点为起点,采用路径回溯算法向上回溯,查找所有路径分支点,找到 跳转指令地址,直至回溯到离程序入口点最近的路径分支点,将所有的路径分支点放入可 达路径集合T = ( tl,t2 . . . tm);
[0044] 步骤3.对被测程序进行指令级插粧,输入初始样本,记录与污点有关的二进制指 令序列;
[0045] 步骤4.将二进制指令序列提升为中间语言描述;
[0046]步骤5.获得中间语言描述的路径分支点P=(P1,P2. . .Pn),第一个分支点pi肯定在 集合T= (tl,t2. . . tm)中,并且pi = tl,根据分支点是否位于集合T中,对分支点进行翻转,弓| 导控制流抵达敏感点,若PleT且巧+1 0 ra < i<n),则将中间语言描述中的分支点?1进行 翻转,若PieT且pi+1 eT( 1 < i <n),则不改变分支点,找到不在集合T中的分支点,若所有分 支点都在集合T中,说明控制流已抵达敏感点,算法结束,否则,进入步骤6;
[0047]步骤6.从翻转后的中间语言描述中提取约束范式,使用STP约束求解器进行求解, 产生新的样本,回到步骤3,重新输入样本。
[0048] 实施例二,参见图2~3所示,一种一种基于智能路径引导的敏感点逼近方法,通过 下述步骤对路径进行智能引导,最终抵达缓冲区溢出敏感点,具体如下:
[0049] 步骤1.标记敏感点,提取不同类型的漏洞模型,通过静态分析,识别出可疑的漏洞 位置,标记为敏感点;
[0050] 步骤2.以敏感点为起点,采用路径回溯算法向上回溯,查找所有路径分支点,找到 跳转指令地址,直至回溯到离程序入口点最近的路径分支点,将所有的路径分支点放入可 达路径集合T = ( tl,t2 . . . tm),具体包含如下内容:
[0051 ]步骤2.1、将敏感点位置记为A,建立队列LI、L2,并初始化为空;
[0052]步骤2.2、获取八的交叉引用以1,厶2~)=汽厶),(厶1,厶2-_)表示交叉引用结果的集 合,判断集合中元素的个数N,若N为0,执行步骤2.5;若N为1,执行步骤2.3;若大于1,则执行 步骤2.4;
[0053] 步骤2.3、获取元素对应的汇编指令,若为跳转指令,则判断元素是否存在于最终 结果集合RES中,若不存在则保存到最终结果集合RES中;若存在则不保存,将元素位置设为 A,执彳丁步骤2.2;
[0054] 步骤2.4、获取元素对应的汇编指令,若为跳转指令,则判断元素是否存在于最终 结果集合RES中,若不存在则保存到最终结果集合RES中;若存在则不保存,并判断元素是否 在L1或者L2中,不在的元素结果入队L2;
[0055] 步骤2.5、获取队列L2队头,位置设为A,将A入队L1,执行步骤2.2,并判断队列L2, 若队列L2为空,则算法结束。
[0056] 步骤3.对被测程序进行指令级插粧,输入初始样本,记录与污点有关的二进制指 令序列;
[0057]步骤4.将二进制指令序列提升为中间语言描述;
[0058]步骤5.获得中间语言描述的路径分支点P=(P1,P2. . .Pn),第一个分支点pi肯定在 集合T= (tl,t2. . . tm)中,并且pi = tl,根据分支点是否位于集合T中,对分支点进行翻转,弓| 导控制流抵达敏感点,若PleT且巧+1 g F(1 < i<n),则将中间语言描述中的分支点?1进行 翻转,若PieT且pi+1 eT( 1 < i <n),则不改变分支点,找到不在集合T中的分支点,若所有分 支点都在集合T中,说明控制流已抵达敏感点,算法结束,否则,进入步骤6;
[0059]根据分支点是否位于集合T中,对分支点进行翻转,引导控制流抵达敏感点,具体 包含如下内容:
[0060]步骤5.1、输入当前分析的路径分支点序号i,查找指定分支点,包括路径分支点pi 的相对地址和模块名称,逐行扫描中间语言描述文件,计算出指定路径分支点序号i的程序 分支点的相对地址和所在模块名称,查找指定分支点,包括路径分支点Pi的相对地址和模 块名称,逐行扫描中间语言描述文件,计算出指定路径分支点序号i的程序分支点的相对地 址和所在模块名称,具体包含如下步骤:
[0061 ] 步骤5.1.1、打开中间语言描述文件,设置bool型变量found为false;
[0062] 步骤5.1.2、判断是否到达文件终止处,若是,则跳转至步骤5.1.8,否则,读取一行 文件内容到字符串line中,备份读取该行前的文件指针值到curposl,备份读取该行后的文 件指针值到curpos2;
[0063] 步骤5.1.3、判断line中保存的内容是否是assert语句所在行内容,若是,贝1J进入 步骤5.1.4,否则,跳转至步骤5.1.6执行;
[0064] 步骤5.1.4、判断该assert语句对应的分支点深度是否等于i,若是,则将found变 量赋值为true,并进入步骤5.1.5,否则,跳转至步骤5.1.2执行;
[0065]步骤5.1.5、利用curpos 1读取上一行的内容,使用字符串截取出内容中该分支点 指令的绝对地址addr,跳转至步骤5.1.2执行;
[0066] 步骤5.1.6、通过字符串比较操作,判断line中保存的内容是否是loaded module 所在行内容,若是,则进入步骤5.1.7,否则,跳转至步骤5.1.2执行;
[0067] 步骤5. 1.7、截取出模块名称、模块低地址和模块高地址,存放于结构体数组 module中,跳转至步骤5.1.2执行;
[0068] 步骤5.1.8、文件扫描结束时,如果found变量为false,则在输出结果中插入错误 路径标记,并进入步骤5.1.10,如果found变量为true,则进入步骤5.1.9;
[0069] 步骤5.1.9、比较分支点绝对地址addr和结构体数组module中保存的模块低地址 和模块高地址,判断出指定分支点所在的模块名称m 〇 d u 1 e n a m e,并计算分支点相对地址 relativeaddr,将 modulename 和 relativeaddr 写入输出结果,进入步骤 5.1 · 10;
[0070]步骤5.1.10、算法结束,从输出结果中查找到分支点地址;
[0071]步骤5.2、查询集合T,判断路径分支点pi相对地址是否在集合T中,若pi相对地址 不在集合T中或pi为当前路径最后分支点,则算法结束,否则进入步骤5.3;
[0072]步骤5.3、查询集合1',判断路径分支点?1 + 1相对地址是否在集合1'中,若?1+1相对 地址不在集合T中,则将分支点pi翻转,得到翻转后的中间语言文件 ,否则,进入步骤5.4;
[0073] 步骤5.4、不翻转当前路径分支点pi,i递增1,将当前分析的路径分支点切换为下 一个,跳转步骤5.1执行。
[0074] 步骤6.从翻转后的中间语言描述中提取约束范式,使用STP约束求解器进行求解, 产生新的样本,回到步骤3,重新输入样本。
[0075] 随着程序版本升级,会引入新的代码块,称为增量代码,增量代码在增多程序功能 同时,也可能引入新的安全风险;原来的代码已经经过之前的多次测试,相对安全,所以针 对增量代码的测试,能够提高测试效率,首先通过静态分析技术,识别出可增量代码位置, 记为敏感点;以敏感点为起点,采用路径回溯算法,向上回溯查找所有路径分支点,即跳转 指令的地址,直至回溯到离程序入口点最近的一个路径分支点,将所有的路径分支点放入 一个可达路径集合T=(tl,t2. . .tm);对被测试程序进行指令级插粧,输入初始样本,记录与 污点有关的二进制指令序列,同时通过对程序进行异常监控,若发生异常,很有可能触发了 漏洞,进一步保存异常上下文,包括发生异常时的指令,寄存器,以及内存等信息,以待人工 进一步进行漏洞可用性判定;将记录的二进制指令序列提升为中间语言描述;获得中间语 言描述的路径分支点P=(P1,P2. . .pn),第一个分支点pi肯定在集合T中,并且pi = tl,但是之 后的分支点不一定在集合中,若PieT且巧_fl. € F (1 < i<n),则将中间语言描述中的分支 点Pi翻转;若PieT且pi+1 eT(l < i<n),则不改变分支点,一直找到不在集合T中的分支点, 若所有分支点都在集合T中,那么说明控制流已经抵达敏感点,算法结束;从翻转后的中间 语言描述中提取约束范式,然后使用STP约束求解器求解,产生新的样本,然后回到前述输 入样本步骤重新执行。
[0076] 根据漏洞模型识别出敏感点位置,通过敏感点来引导控制流抵达敏感点位置,有 效缓解现有技术中路径爆炸的问题,提高漏洞挖掘的效率,因敏感点是漏洞挖掘的终点,如 何构造测试样本抵达敏感点位置是关键,通过深度和广度优先算法,如图1所示,抵达敏感 点需要产生样本个数为〇(2~n),通过本发明的智能引导,参见图3所示,产生样本的数量可 以减少为〇(n),其中,η为被测程序中分支点的数目。
[0077] 本发明并不局限于上述【具体实施方式】,本领域技术人员还可据此做出多种变化, 但任何与本发明等同或者类似的变化都应涵盖在本发明权利要求的范围内。
【主权项】
1. 一种基于智能路径引导的敏感点逼近方法,其特征在于:包含如下步骤:步骤1.标记 敏感点,提取不同类型的漏洞模型,通过静态分析,识别出可疑的漏洞位置,标记为敏感点; 步骤2.以敏感点为起点,采用路径回溯算法向上回溯,查找所有路径分支点,找到跳转 指令地址,直至回溯到离程序入口点最近的路径分支点,将所有的路径分支点放入可达路 径集合T=(tl,t2. . .tm); 步骤3.对被测程序进行指令级插粧,输入初始样本,记录与污点有关的二进制指令序 列; 步骤4 .将二进制指令序列提升为中间语言描述; 步骤5.获得中间语言描述的路径分支点P=(P1,P2. . .pn),第一个分支点pi肯定在集合T = (tl,t2. . .tm)中,并且Pl = tl,根据分支点是否位于集合T中,对分支点进行翻转,引导控制 流抵达敏感点,若PiGT且朽+1_ @ T (I < i<n),则将中间语言描述中的分支点Pi进行翻转, 若PieT且pi+1 eT(I < i<η),则不改变分支点,找到不在集合T中的分支点,若所有分支点 都在集合T中,说明控制流已抵达敏感点,算法结束,否则,进入步骤6; 步骤6.从翻转后的中间语言描述中提取约束范式,使用STP约束求解器进行求解,产生 新的样本,回到步骤3,重新输入样本。2. 根据权利要求1所述的基于智能路径引导的敏感点逼近方法,其特征在于: 步骤2具体包含如下内容: 步骤2.1、将敏感点位置记为A,建立队列LI、L2,并初始化为空; 步骤2.2、获取厶的交叉引用以1^~)=汽六),以^2-)表示交叉引用结果的集合,判 断集合中元素的个数N,若N为O,执行步骤2.5;若N为1,执 行步骤2.3;若大于1,则执行步骤2.4; 步骤2.3、获取元素对应的汇编指令,若为跳转指令,则判断元素是否存在于最终结果 集合RES中,若不存在,则保存到最终结果集合RES中;若存在,则不保存,将元素位置设为A, 执行步骤2.2; 步骤2.4、获取元素对应的汇编指令,若为跳转指令,则判断元素是否存在于最终结果 集合RES中,若不存在,则保存到最终结果集合RES中;若存在,则不保存,并判断元素是否在 Ll或者L2中,不在的元素结果入队L2; 步骤2.5、获取队列L2队头,位置设为Α,将A入队Ll,执行步骤2.2,并判断队列L2,若队 列L2为空,则算法结束。3. 根据权利要求1所述的基于智能路径引导的敏感点逼近方法,其特征在于:所述步骤 5中根据分支点是否位于集合T中,对分支点进行翻转,引导控制流抵达敏感点,具体包含如 下内容: 步骤5.1、输入当前分析的路径分支点序号i,查找指定分支点,包括路径分支点pi的相 对地址和模块名称,逐行扫描中间语言描述文件,计算出指定路径分支点序号i的程序分支 点的相对地址和所在模块名称; 步骤5.2、查询集合T,判断路径分支点pi相对地址是否在集合T中,若pi相对地址不在 集合T中或pi为当前路径最后分支点,则算法结束,否则进入步骤5.3; 步骤5.3、查询集合T,判断路径分支点pi + Ι相对地址是否在集合T中,若pi + Ι相对地址 不在集合T中,则将分支点Pi翻转,得到翻转后的中间语言文件,否则,进入步骤5.4; 步骤5.4、不翻转当前路径分支点pi,i递增1,将当前分析的路径分支点切换为下一个, 跳转步骤5.1执行。4.根据权利要求3所述的基于智能路径引导的敏感点逼近方法,其特征在于: 所述步骤5.1中,查找指定分支点,包括路径分支点pi的相对地址和模块名称,逐行扫 描中间语言描述文件,计算出指定路径分支点序号i的程序分支点的相对地址和所在模块 名称,具体包含如下步骤: 步骤5.1. 1、打开中间语言描述文件,设置bool型变量found为false; 步骤5.1.2、判断是否到达文件终止处,若是,则跳转至步骤5.1.8,否则,读取一行文件 内容到字符串line中,备份读取该行前的文件指针值到curposl,备份读取该行后的文件指 针值到curpos2; 步骤5.1.3、判断I ine中保存的内容是否是assert语句所在行内容,若是,则进入步骤 5.1.4,否则,跳转至步骤5.1.6执行; 步骤5.1.4、判断该assert语句对应的分支点深度是否等于i,若是,则将found变量赋 值为true,并进入步骤5.1.5,否则,跳转至步骤5.1.2执行; 步骤5.1.5、利用curpos 1读取上一行的内容,使用字符串截取出内容中该分支点指令 的绝对地址addr,跳转至步骤5.1.2执行; 步骤5.1.6、通过字符串比较操作,判断line中保存的内容是否是loaded module所在 行内容,若是,则进入步骤5.1.7,否则,跳转至步骤5.1.2执行; 步骤5.1.7、截取出模块名称、模块低地址和模块高地址,存放于结构体数组module中, 跳转至步骤5.1.2执行; 步骤5.1.8、文件扫描结束时,如果found变量为false,则在输出结果中插入错误路径 标记,并进入步骤5.1 · 10,如果found变量为true,则进入步骤5.1.9; 步骤5.1.9、比较分支点绝对地址addr和结构体数组module中保存的模块低地址和模 块高地址,判断出指定分支点所在的模块名称moduIename,并计算分支点相对地址 relativeaddr,将 modulename 和 relativeaddr 写入输出结果,进入步骤 5.1 · 10; 步骤5.1.10、算法结束,从输出结果中查找到分支点地址。
【专利摘要】本发明涉及一种基于智能路径引导的敏感点逼近方法,包含:提取不同类型的漏洞模型,通过静态分析识别敏感点位置;以敏感点为起点,采用路径回溯算法向上回溯,查找所有路径分支点,直至回溯到离程序入口点最近的路径分支点;对被测程序进行指令级插桩,输入初始样本,记录与污点有关的二进制指令序列;将二进制指令序列提升为中间语言描述;获得中间语言描述的路径分支点,根据分支点是否位于集合中,对分支点进行翻转,引导控制流抵达敏感点;从翻转后的中间语言描述中提取约束范式,使用STP约束求解器进行求解,产生新的样本,返回重新输入样本。本发明通过敏感点引导控制流抵达敏感点位置,有效缓解路径爆炸的问题,提高漏洞挖掘的效率。
【IPC分类】G06F9/44, G06F11/36
【公开号】CN105487983
【申请号】CN201510997194
【发明人】宋建杨, 刘高坡, 周泽斌, 徐晶晶
【申请人】郑州恩倍网络科技有限公司
【公开日】2016年4月13日
【申请日】2015年12月24日

最新回复(0)