符号执行:基础概念

一、概念

    符号执行技术的核心思想是使用符号值来表示程序的输入数据,并将程序的运算过程逐指令或逐语句地转换为数学表达式,在CFG的基础上生成符号执行树,并为每一条路径建立一系列以输入数据为变量的符号表达式。

    在符号执行过程中,每当遇到判断与跳转语句时,符号执行工具便会将当前执行路径的路径约束收集到该路径的约束集合中。其中,路径约束(Path Constraint)是指程序分支指令中与输入符号相关的分支条件的取值,是一系列不具有量词的布尔型公式。而路径约束集合则被用来存储每一条程序路径上收集到的约束,用“与”操作进行连接,通过使用约束求解器(ConstraintSolver)对约束集合进行求解,可以得到该条路径的可达性:如果约束求解的结果有解,表示该条路径可达,否则表示该条路径不可达,在时间与计算资源足够的理想情况下,符号执行能够遍历目标程序的所有路径并判断其可达性。

    PC表示Path Constraint,利用约束求解器可知,存在对应的XYZ是的这三条路径约束为真,即这三条路径约束均是可满足、可达的。

二、示例

示例程序


控制流图


符号执行树


三、技术难点

    (1)路径遍历算法覆盖率低

符号执行在控制流图CFG的基础上生成符号执行树,采用何种路径遍历和搜索方法便成了符号执行中的一个重要部分,常用的包括:深度优先搜索DFS、广度优先搜索BFS等。DFS与BFS虽然简单直接,但缺乏目的性。每次访问路径时容易出现较长的共有路径前缀,导致路径的覆盖面减少,低覆盖率很有可能会让时间复杂度变地无法容忍。

    (2)路径爆炸问题(Path Explosion)

Path Explosion是指程序中的路径数量随着程序中的分支数量的增长而成指数级增长的现象。符号执行实质是通过限制路径搜索空间来进行程序遍历,运行时间与所需要遍历的路径空间大小成正比。路径抱着会使得时空复杂度均无法容忍。

    (3)约束求解开销巨大

最为耗时的部分,会包含大量的复杂的数据操作,大大增加约束求解的难度。目前的改进方法包括:SMT求解方法、提高约束求解器的求解速度、利用查询技术简化约束项等。尽管如此,约束求解的巨大时间开销仍是妨碍符号执行技术走向大规模应用的障碍之一。

    (4)目标语言的复杂性

比如数组、指针等复杂的语言特性,如何较好地支持这些复杂的语言特性是面临的挑战之一。

    (5)应用领域的多样性

目标程序可能会具有不同的领域特征,如数据库程序、Web服务程序等。


猜你喜欢

转载自blog.csdn.net/wannafly1995/article/details/80842459