FUZZ

模糊测试工具主要分为两类,分别是变异测试以及生成测试

预处理

需要搜集目标相关信息(输入格式、内部结构),指定模糊测试的策略

通常依赖于插桩、符号执行以及污点分析这类程序分析技术

分析技术与信息获取

插桩

向目标代码的合适位置添加预设好的代码,获取程序的静态或者动态执行信息

静态插桩

在源码或者中间代码的编译过程中进行插桩

如:通过gcc在汇编语言上插桩,或者通过LLVM在生成的中间语言上插桩

依赖源码

动态插桩

利用qemu等模拟技术进行插桩,获取程序的运行时信息

符号执行

将程序行为的推理归结为逻辑领域的推理,通过构建一个表示程序执行的逻辑公式,可以同时推断一个程序在不用输入上的行为。

静态符号执行

通常会因为循环和递归的存在陷入路径爆炸当中,还会因为hash之类操作的存在导致约束求解失败。

动态符号执行

动态符号通过对程序进行实际执行和符号化执行,维护程序的实际状态和符号化状态,通过将难以求解的约束替换为实际值,缓解静态符号执行的问题,并按照深度优先的策略对于目标程序进行探索

污点分析

污点分析技术会观测程序中哪些数据受到预置污染源(如输入)的污染,目的是跟踪污染源和汇聚点(如敏感数据)之间的信息流

静态污点分析

获取程序控制流图、抽象语法树等信息,依据数据流以及依赖关系精选污点分析。

动态污点分析

插桩编译

afl-gcc -g -o test test.c 

然后创建两个文件夹fuzz_in和fuzz_out

fuzz_in文件夹内需要创建一个testcase文件,随便输入一点内容即可,比如aaa

开始fuzz

可以直接从stdin读取输入的目标 
./afl-fuzz -i fuzz_in -o fuzz_out ./test


可从文件读取输入的目标程序
./afl-fuzz -i fuzz_in -o fuzz_out ./test @@

重点关注的信息

uniq crashes 崩溃的次数

last new path 最近的一次新路径,方便判断是否陷入死循环

分析crash

crasher文件夹是产生crash的样例,hangs是产生超时的样例,queue里面是每个不同执行路径的测试用例

xxd [crash文件名]

无源码fuzz

gcc -g -o test test.c
afl-fuzz -i fuzz_in -o fuzz_out -Q ./test2