首页> 中国专利> 一种基于静态路径分析的导向符号执行方法

一种基于静态路径分析的导向符号执行方法

摘要

本发明提供一种基于静态路径分析的导向符号执行方法,能够快速到达指定的代码的位置,并给出到达目的代码的测试输入。步骤一、首先通过静态分析确定检测的目标,找到目标程序中内存分配相关的代码或指令;步骤二、获取从程序起始点到指定代码点的路径相关函数和基本块,并依据路径可达性和距离对这些函数和基本块进行权值计算;步骤三、优先选择权值大的静态分析可达路径进行遍历;步骤四、静态路径分析;步骤五、将静态路径分析所得到的路径相关的函数和基本块信息放到Paths[funcs,bbs]中,所有要分析的目标指令存放到allocCallInst的Vector中,states中存放当前所有的路径状态,当符号执行引擎对目标程序进行执行分析,通过循环对程序中的指令进行逐条解释执行。

著录项

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2017-08-25

    授权

    授权

  • 2015-05-06

    实质审查的生效 IPC(主分类):G06F11/36 申请日:20141204

    实质审查的生效

  • 2015-04-08

    公开

    公开

说明书

技术领域

本发明涉及一种导向符号执行方法,具体涉及一种基于静态路径分析的导 向符号执行方法。

背景技术

符号执行是一种通过将输入数据看作符号值,并模拟程序执行,在执行的 过程中将路径的约束条件使用无量词一阶公式形成约束表达式,从而实现对程 序的分析。

尽管符号执行技术在三十年前就被提出,近年来大量的研究人员对其充满 热情,尤其是在软件安全分析方面,符号执行技术被用于产生高覆盖率的测试 用例、查找程序中更深层的bug、攻击代码自动生成等等。符号执行技术已经在 学术实验室和工业领域被应用到各种工具中。符号执行首先在代码检测中被用 于提高代码的覆盖率,可以遍历尽可能多的代码路径,已经在多个工具中得到 应用。理论上可控内存分配问题可以使用进行完整的检测。但符号执行所引起 的路径爆炸导致无法完整的遍历完成整个程序。但我们的工作主要是搜索到达 特定代码的路径,因此只需对部分代码进行遍历。

我们了解到已有一些工作对利用符号执行来到大某个特殊代码行的相关研 究,如执行综合,最短路径符号执行,综合信息控制流图等。其中ESD使用接 近的导向符号执行来到达程序的指定代码行,但其工作并没有公开,我们无法 重复其工作。而我们使用的是基于路径相关函数和基本块的权值实现的导向符 号执行的。最短路径符号执行和后向符号执行是在一个过程间的控制流图上进 行导向符号执行,可以通过计算到达目标代码行的最短距离来导向程序的执行, 以及从指定目标代码行向调用该代码的函数进行后向执行来实现找到指定代码 的可达路径探测。Domagoj在2011年提出了基于静态导向的动态测试用例生成, 并设计了一个三步完成的思路。2013年,Caselden在其基础上又提出了综合信 息控制流图的方法,可以对二进制程序构建一个特殊的控制流图,从而实现导 向符号执行。基于循环扩展的符号执行对符号执行做了一定的优化,可以检测 到因为符号值作为循环变量导致的缓冲区溢出,但其需要引入多个其他符号变 量。而我们的符号执行优化主要是对整数相关的属性进行增强以及整数转换操 作函数进行优化。虽然有效的提高了代码的覆盖率,但其对执行到指定代码处 没有任何速度上的提高,且没有任何对路径爆炸的优化。

目前静态分析技术找到的路径很多,且并不一定实际可达。而符号执行技 术受限与路径爆炸问题,难以快速到达指定的目标代码。

发明内容

本发明的目的在于提供一种基于静态路径分析的导向符号执行方法,能够快 速到达指定的代码的位置,并给出到达目的代码的测试输入。

本发明的目的是通过以下技术方案实现:

一种基于静态路径分析的导向符号执行方法,包括以下步骤:

步骤一、首先通过静态分析确定检测的目标,找到目标程序中内存分配相关 的代码或指令;

步骤二、获取从程序起始点到指定代码点的路径相关函数和基本块,并依据 路径可达性和距离对这些函数和基本块进行权值计算,形成一个基于代码基本 块的加权源-目标有向图;

步骤三、函数和基本块路径的权值确定后,通过符号执行寻找实际可达路径, 优先选择权值大的静态分析可达路径进行遍历,减少路径探测引发的组合爆炸;

步骤四、静态路径分析:首先分析指定的起点和终点之间路径可达性关系, 然后获取可达路径相关的函数和基本块信息,最后利用函数、基本块之间的可 达性和路径距离进行权值设定;

步骤五、导向符号执行:将静态路径分析所得到的路径相关的函数和基本块 信息放到Paths[funcs,bbs]中,所有要分析的目标指令存放到allocCallInst的 Vector中,states中存放当前所有的路径状态,当符号执行引擎对目标程序进行 执行分析,通过循环对程序中的指令进行逐条解释执行。

其中逐条解释执行采用以下方法:首先通过选择路径算法选择权值最大的 路径优先执行,在符号执行的过程中,如果碰到退出或者发生错误将产生相应 的测试用例并退出该路径,如果遇到函数调用指令,则判断是否是我们需要检 测的目标指令,如果是则将进行检测,输出到达目标指令的路径并生成相应的 测试输入;当执行到分支指令时,则对分支跳转的基本块进行判断,在符号求 解之后检查可跳转的基本块是否在静态分析的相关路径的基本块中,如果是则 加入要执行的路径状态,如果不是则不加入。从而实现路径相关的选择。

其中选择路径算法为在每次路径选择时,通过对当前所有的状态进行遍历, 依据静态分析的结果来选择当前权值最大的基本块作为下一个执行的路径。

其中导向符号执行中还包括整数敏感的符号执行。

其中步骤四中静态路径分析具体包括以下步骤:

(1)首先确定路径分析的起点和终点:main函数入口为起点,终点由用户 指定,通过目标代码的位置,找到相应指令和函数位置;

(2)通过函数调用关系图分析,获取从程序入口到达目标函数的路径,以 函数名称和调用指令所在基本块作为路径节点;

(3)在上述分析得到的路径基础上,在函数内以基本块为单位进行路径分 析,获取从函数入口基本块到调用指令所在基本块函数内路径;

(4)根据后面启发式符号执行所需要的信息,建立可达路径节点集合和不 可达路径节点集合;集合中的节点由函数和基本块组成,可达路径集合包括前 面所获取的路径上的所有节点,而不可达节点目前仅包含在前面获取的路径上 的函数内,但不属于可达路径集合的节点。

本发明的有益效果:

本发明主要通过基于静态路径分析的导向符号执行来实现找到指定的路径, 通过符号执行可以对程序代码进行遍历,但路径状态爆炸导致常规的符号执行 无法实现指定路径的查找。本发明在静态路径分析的基础上,并结合针对符号 执行的优化来实现执行路径的快速查找。

附图说明

图1为一种基于静态路径分析的导向符号执行方法流程图。

具体实施方式

下面结合具体实施例详细说明本发明,但本发明并不仅限于此。

首先需要通过静态分析确定检测的目标,即找到目标程序中内存分配相关 的代码(或指令)。为此需要获取从程序起始点到指定代码点的路径相关函数 和基本块,并依据路径可达性和距离对这些函数和基本块进行权值计算,形成 一个基于代码基本块的加权源-目标有向图。

当函数/基本块路径的权值确定后,再通过符号执行寻找实际可达路径。通 过采用启发式的导向符号执行技术,可优先选择权值大的静态分析可达路径进 行遍历,减少路径探测引发的组合爆炸,从而可有效的实现可达路径的探测。

静态路径分析:首先分析指定的起点(一般是main函数入口)和终点(指 定的目标代码)之间路径可达性关系,获取可达路径相关的函数和基本块信息, 并利用函数、基本块之间的可达性和路径距离进行权值设定。主要包括下述4 个阶段:

(1)首先确定路径分析的起点和终点。一般是main函数入口为起点,终点 由用户指定。通过目标代码的位置,找到相应指令和函数位置。

(2)通过函数调用关系图分析,获取从程序入口到达目标函数的路径,以 函数名称和调用指令所在基本块(Basic Block,简称BB)作为路径节点。这里 不考虑函数中的递归调用关系。

(3)在第2阶段分析得到的路径基础上,在函数内以基本块为单位进行路 径分析,获取从函数入口基本块到调用指令所在基本块函数内路径。

(4)在前面所获取的路径信息的基础上,根据后面启发式符号执行所需要 的信息,将建立可达路径节点集合和不可达路径节点集合。集合中的节点由函 数和基本块组成。可达路径集合包括前面所获取的路径上的所有节点。而不可 达节点目前仅包含在前面获取的路径上的函数内,但不属于可达路径集合的节 点。对于静态路径分析中没有获取到的函数,目前我们不能断定就是不可达路 径集合中的节点。

导向符号执行:传统的符号执行通过各种不同的路径搜索策略试图遍历所有 的程序路径,然而程序复杂性、循环、递归等导致常用的路径搜索算法无法执 行更多的代码,如深度优先、广度优先。使用了多种随机搜索策略来跳过循环, 执行更多的代码。本文将提出一种启发式的导向符号执行技术,可以更有效的 到达指定的终点,也就是我们需要检测的内存分配的代码。

首先我们将静态分析所得到的路径相关的函数和基本块信息放到 Paths[funcs,bbs]中,所有要分析的目标指令存放到allocCallInst的Vector 中,states中存放当前所有的路径状态。当符号执行引擎对目标程序进行执行 分析,主要通过一个循环对程序中的指令进行逐条解释执行(5-30行)。首先 通过selectState(31-40行)算法选择权值最大的路径(在我们的符号执行中用 state表示路径)优先执行,selectState算法将在后面进行详细介绍。在符号 执行的过程中,如果碰到退出或者发生错误将产生相应的测试用例并退出该路 径(8-11行)。如果遇到函数调用指令,则判断是否是我们需要检测的目标指 令,如果是则将进行检测,输出到达目标指令的路径并生成相应的测试输入 (13-17行);当执行到分支指令时,我们将对分支跳转的基本块进行判断,在 符号求解之后检查可跳转的基本块是否在静态分析的相关路径的基本块中 (21-26行)。如果是则加入要执行的路径状态(22,25行),如果不是则不 加入。从而实现路径相关的选择。对于符号执行过程中如何优先选择权值更大 的基本块进行执行则在selectState(31-40行)中完成,即在每次路径选择时, 通过对当前所有的状态进行遍历,依据静态分析的结果来选择当前权值最大的 基本块作为下一个执行的路径。

整数敏感的符号执行:为了进一步扩展和优化符号执行,提出了整数敏感的 符号执行优化技术;一方面,除了外部的输入数据直接影响内存分配的关键因 素,我们还发现外部输入数据的属性也可能影响内存分配的大小。而在传统的 符号执行中没有将这些因素考虑。通过直接添加约束来实现针对输入数据属性 的符号化技术。另一方面,由于原始的klee在处理整数转换(atoi)的时候, 由于直接调用了uclibc中的实现,如果转换的字符串是符号化数据,将会在调 用atoi的时候产生新的路径,从而加剧不必要的路径增长。据我们实验统计, 调用atoi转换一个字符的时候将产生7条路径,转换两个字符时将产生25条 路径。为降低这种转换所带来的路径增长,实现了atoi直接符号转换算法,根 据符号化数据的长度直接转换为相应的整数表达式,通过实验,该方法针对多 个处理整数的程序大大降低了路径的数据,同时达到了相同的代码覆盖率。除 了atoi函数以外,还对atol,strtol,strtoul等类似函数进行了处理。

虽然参考优选实施例对本发明进行描述,但以上所述实例并不构成本发明 保护范围的限定,任何在本发明的精神及原则内的修改、等同替换和改进等, 均应包含在本发明的权利要求保护范围内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号