文章目录
- 方法概述
-
- 漏洞挖掘方法分类
-
- 静态分析技术
- 动态分析技术
- 符号执行
-
- 符号执行的基本原理
- 符号执行的应用
- 漏洞挖掘-检测是否数组越界
- 污点分析
-
- 基本思想
- 污点分析核心要素
- 优缺点
- 词法分析
-
- 基本概念
- 漏洞挖掘实战
-
- 实践一:基于词法分析和逆向分析的可执行代码静态检测
- 实验一:基于IDA Pro分析给定的可执行文件是否存在溢出漏洞
-
- 第一步:通过IDA打开所生成的exe文件
- 第二步:定位敏感函数
- 实验二:使用Bugscam脚本来代替手工过程完成漏洞挖掘
- 数据流分析
-
- 基本概念
- 数据流分析方法分类
- 程序代码模型
- 基于数据流的漏洞分析流程
-
- 示例一:检测指针变量的错误使用
- 示例二:检测缓冲区溢出
- 模糊测试
-
- 基本概念
- 模糊测试分类
-
- 基于生成的模糊测试
- 基于变异的迷糊测试
- 模糊测试步骤
- 智能模糊测试
-
- 智能模糊测试具体的实现步骤
- 智能模糊测试的核心思想
- 模糊测试实践
-
- 使用工具
- 自己动手写Fuzzer
- AFL模糊测试框架
-
- AFL模糊测试框架
- AFL工作流程
- AFL安装
- AFL模糊测试
-
- 创建本次实验的程序
- 创建测试用例
- 启动模糊测试
- 分析crash
方法概述
漏洞挖掘方法分类
静态分析技术
方法:词法分析、数据流分析、控制流分析、模型检查、定理证明、符号执行、污点传播分析等。
不需要运行程序、分析效率高、资源消耗低
动态分析技术
方法:模糊测试、动态污点分析、动态符号执行等
需要运行程序、准确率非常高、误报率很低
符号执行和污点分析两类技术都分别支持静态分析和动态分析
符号执行
符号执行(Symbolic Execution)的基本思路是使用符号值替代具体值,模拟程序的执行。在模拟程序运行的过程中,符号执行引擎会收集程序中的语义信息,探索程序中的可达路径、分析程序中隐藏的错误。
动态符号执行结合了真实执行和传统符号执行技术的优点,在真实执行的过程中同时进行符号执行,可以在保证测试精度的前提下提升了执行效率。
符号执行的基本原理
符号执行三个关键点是变量符号化、程序执行模拟和约束求解。
变量符号化是指用一个符号值表示程序中的变量,所有与被符号化的变量相关的变量取值都会用符号值或符号值的表达式表示。
程序执行模拟最重要的是运算语句和分支语句的模拟:
- 对于运算语句,由于符号执行使用符号值替代具体值,所以无法直接计算得到一个明确的结果,需要使用符号表达式的方式表示变量的值。
- 对于分支语句,每当遇到分支语句,原先的一条路径就会分裂成多条路径,符号执行会记录每条分支路径的约束条件。最终,通过采用合适的路径遍历方法,符号执行可以收集到所有执行路径的约束条件表达式。
约束求解主要负责路径可达性进行判定及测试输入生成的工作。对一条路径的约束表达式,可以采用约束求解器进行求解:
- 如有解,该路径是可达的,可以得到到达该路径的输入
- 如无解,该路径是不可达的,也无法生成到达该路径的输入
符号执行有代价小、效率高的优点,然而由于程序执行的可能路径随着程序规模的增大呈指数级增长,从而导致符号执行技术在分析输入和输出之间关系时,存在一个路径状态空间的路径爆炸问题。由于符号执行技术进行路径敏感的遍历式检测,当程序执行路径的数量超过约束求解工具的求解能力时,符号执行技术将难以分析。
符号执行的应用
符号执行已经广泛应用在软件测试、漏洞挖掘和软件破解等。
在软件测试中,符号执行可以获得程序执行路径的集合、路径的约束条件和输出的符号表达式,可以使用约束求解器求解出满足约束条件的各个路径的输入值,用于创建高覆盖率的测试用例。符号执行与模糊测试的结合也是当前流行的软件测试技术。
在漏洞挖掘中,通过符号执行技术可以获得漏洞监测点的变量符号表达式,结合路径约束条件、变量符号表达式和漏洞分析规则,可以通过约束求解的方法来求解是否存在满足或违反漏洞分析规则的值。
符号执行还可以用于搜索特定目标代码的到达路径,进而计算该路径的输入,用在面向特定任务(比如代码破解)的程序分析中。
漏洞挖掘-检测是否数组越界
int a[10];
scanf("%d", &i);
if (i > 0) {
if (i > 10)
i = i % 10;
a[i] = 1;
}
- 在a[i]=1语句处存在可能数组越界的情况
访问越界的约束条件是x>=10 - 整段代码存在两个if分支,经过符号执行,知道到达a[i]=1语句处有2条路径:
路径约束条件为x>0∧x<=10,此时变量i的符号表达式为x;
路径约束条件为x>0∧x>10,此时变量i的符号表达式为x%10。 - 得到两个判定条件:
(x>0∧x<=10)∧(x>=10) --有解 x=10 满足越界条件** 存在漏洞**
(x>0∧x>10)∧x%10>=10)
污点分析
污点分析(Taint Analysis)通过标记程序中的数据(外部输入数据或者内部数据)为污点,跟踪程序处理污点数据的内部流程,进而帮助人们进行深入的程序分析和理解。
污点分析可以分为污点传播分析(静态分析)和动态污点分析(动态分析)。静态污点分析技术在检测时并不真正运行程序,而是通过模拟程序的执行过程来传播污点标记,而动态污点分析技术需要运行程序,同时实时传播并检测污点标记。
基本思想
首先,确定污点源,即污点分析的目标来源。通常来讲,污点源表示了程序外部数据或者用户所关心的程序内部数据,是需要进行标记分析的输入数据。
然后,标记和分析污点。对污点源在内存中进行标记、计算涉及到污点的执行过程。