1. 环境安装
1.1 源代码编译
1.2 官方镜像: aflplusplus/aflplusplus
1.3 包管理器安装: apt install afl++
解析:源代码编译在线下载大文件数据包,不够稳定;包管理其安装 afl++ 只是一个基础包,无法进行模糊测试,仍需安装其它依赖包;
推荐官方镜像安装:实时更新,环境完整,但是镜像较大,5.31GB大小。
2. 常用几种模式
2.1 LLVM 模式(插桩模式)
2.1.1 测试过程输出及结果
首先使用AFL++ 的编译器 afl-clang-fast 进行编译,编译时插入额外的代码,用于在程序运行时收集执行信息。
输出结果:
2.1.2 测试程序
输入种子
2.2 Qemu 模式
QEMU 模式是一种用于模糊测试未插桩的二进制文件的技术。它允许用户在没有源代码或无法使用 AFL 的插桩编译器的情况下,对二进制程序进行模糊测试。QEMU 是一个开源的虚拟化工具,能够模拟不同的硬件架构,并提供对二进制文件的动态分析。
使用 gcc 编译二进制文件,模拟无源码二进制文件进行模糊测试。测试程序如上 2.1.1
(1) QEMU 模式的作用
无需源代码:
AFL++ 通常需要目标程序在编译时进行插桩(instrumentation),以跟踪代码覆盖率。
如果没有源代码,AFL++ 的 QEMU 模式可以通过动态二进制翻译(Dynamic Binary Translation)对二进制文件进行插桩。
跨平台支持:
QEMU 模式支持对不同架构(如 ARM、MIPS)的二进制文件进行模糊测试。
动态插桩:
QEMU 模式会在运行时动态插桩,记录代码覆盖率信息,帮助 AFL++ 生成更有效的测试用例。
(2) QEMU 模式的工作原理
二进制翻译:
QEMU 将目标二进制文件的指令翻译为宿主机的指令,并在翻译过程中插入插桩代码。
覆盖率跟踪:
插桩代码会记录目标程序的执行路径(如基本块、分支等)。
反馈机制:
AFL++ 利用覆盖率信息生成新的测试用例,优先探索未覆盖的代码路径。
2.3 Unicorn 模式
Unicorn 模式适用于简单的二进制程序或需要高性能的模糊测试场景。只模拟 CPU 指令执行(不涉及硬件或操作系统)
官方测试案例:
测试程序地址:https://github.com/AFLplusplus/AFLplusplus/tree/stable/unicorn_mode/samples/python_simple
测试输出结果:
脚本文件解析:
2.4 Frida 模式
是一种基于动态插桩的模糊测试模式,它利用 Frida 工具对目标程序进行插桩,从而实现对闭源程序的模糊测试。Frida 模式特别适合测试没有源代码的程序(如移动端应用、桌面端应用等 JavaScript、Android 应用、加密保护或反调试的程序)。
官方文档介绍截图如下:
2.4.1 测试结果
2.4.2 测试程序
目标程序:target_binary.c
加载驱动程序:frida_script.js
2.5 区别
QEMU 和 Unicorn 模式
主要区别
(1) 模拟范围:QEMU 模式模拟整个操作系统环境,模拟硬件(CPU、内存、IO 等)跨架构支持:几乎支持所有 CPU 架构(x86、ARM、MIPS 等)而 Unicorn 模式只模拟 CPU 指令执行仅模拟(不涉及硬件或操作系统)。
(2) 性能:Unicorn 模式通常比 QEMU 模式更快,因为它不模拟操作系统环境。
(3) 适用场景:QEMU 模式适用于需要模拟操作系统环境的复杂程序,而 Unicorn 模式适用于简单的二进制程序或需要高性能的模糊测试场景。
QEMU 和 Frida 模式
主要区别
选择 QEMU 模式:
- (1) 需要对完整的二进制文件或系统进行模糊测试。
(2) 目标程序是跨架构的(如 ARM、MIPS)。
(3) 需要支持多种架构。
选择 Frida 模式:
(1) 需要对闭源程序或特定代码片段进行测试。
(2) 目标程序运行在支持 Frida 的环境中(如 Android、iOS、Windows)。
(3) 需要动态插桩和细粒度调试。
2.6 崩溃测试案例
2.6.1 测试结果
测试时间:2 days 21 hrs 36 min
2.6.2 测试程序
1. vulnerable_program.c
2. 编译
·-fno-stack-protector:禁用栈保护机制,使缓冲区溢出更容易触发。
·-z execstack:禁用栈不可执行保护,使栈上的代码可以执行(仅用于测试目的)
3. 准备输入目录
创建一个输入目录,并在其中放置一些初始测试用例。例如:
4. 检查崩溃记录
5. 分析崩溃记录
2.6.3 编译器
例子:
(1) gcc 编译:启用了栈保护机制,当检测到栈溢出时,程序会立即终止并输出错误信息。
(2) afl-clang-fast 编译:可能禁用了某些安全机制,以便更好地进行模糊测试,因此程序可能不会立即终止,或者不会输出栈溢出错误。
这两种编译方式的不同行为是由于它们的目标不同:gcc 更注重程序的稳定性和安全性,而 afl-clang-fast 更注重发现程序中的潜在漏洞。
中科固源专注于通讯协议安全与模糊测试,提供Wisdom系列工具和Swift系列工具,帮助企业构建全面的网络安全防护体系。了解更多产品与解决方案。加入我们,开启你的高效代码创新之旅!
①扫描二维码或添加微信,获取1V1线上云指导。
②解锁免费高效的开源级开发工具,还有更多专属权益等你来拿。
③关注我们,在评论区留言“我要学习资料”,即可免费获得独家学习资料包,包括详细使用教程、应用案例分析及相关技术文档。
发表评论
您还未登录,请先登录。
登录