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
I'm so cute. Please give me money.
- 記事へのリンク:https://torebtr.github.io/2022/08/11/FUZZ/
- 著作権表示:このブログ内のすべての記事は、特別な記載がない限り の下のライセンスで保護されています。
GitHub IssuesGitHub Discussions