AFL++模糊测试入门:无法触发目标程序崩溃的问题排查
AFL++模糊测试问题解答
背景说明
我有一个调用strcpy会触发崩溃的简单程序,正模拟闭源二进制模糊测试场景,但使用AFL++无法触发该程序崩溃。
程序代码:
int main(int argc, char *argv[]) { char dest[4]; strcpy(dest, argv[1]); printf("%s\n", dest); return 0; }
使用的AFL++命令:
./afl-fuzz -i ./testcases/ -o ./findings_dir -Q -- ../src/strcpy_arm64_linux z
输入测试用例仅包含一个内容为"zzzz"的文件。
问题解答
1. 如何正确开展模糊测试?已等待约10分钟,是否需要继续等待?
- 你的命令参数有误,导致AFL根本没对程序的风险输入点(
argv[1])进行模糊测试。当前命令里的z是固定死的参数,AFL不会修改它,自然触发不了越界崩溃。 - 正确做法是让AFL++把测试用例内容作为
argv[1]传入,适合闭源场景的方案是写包装脚本:
新建wrapper.sh脚本:
给脚本加执行权限:#!/bin/bash read -r input ../src/strcpy_arm64_linux "$input"chmod +x wrapper.sh,然后用AFL++运行脚本:
这样AFL++会把测试用例内容通过标准输入传给脚本,脚本再转成命令行参数给目标程序。./afl-fuzz -i ./testcases/ -o ./findings_dir -Q -- ./wrapper.sh - 已经等10分钟没必要继续,改完参数重新跑,正常几秒内就能触发崩溃。
2. 已在命令行指定参数"z",是否仍需指定输入文件夹及测试用例文件?
- 不能指定固定参数
z,这个参数会锁死argv[1]的输入,AFL++无法对其进行变异,等于白跑。 - 输入文件夹
-i是必须的,AFL++需要初始测试用例作为变异起点,哪怕只有一个用例也得指定。
3. 输入测试用例文件何时、如何在测试过程中生效?
- 初始测试用例是AFL的模糊起点:启动后,AFL会先运行所有初始用例,记录代码覆盖率,然后基于这些用例做字节翻转、重复、插入等变异,生成新输入。
- 生效方式取决于输入模式:在你用的包装脚本模式下,脚本读取标准输入的测试用例,再转成命令行参数传给目标程序;如果是默认标准输入模式,AFL++直接把测试用例内容写入程序的标准输入。
- 你的场景里因为固定了
argv[1]为z,初始测试用例根本没被用到,所以没生效。
4. 在哪里可以查看模糊测试器尝试的各种输入变体?
- 崩溃的输入会被自动保存到输出目录的
findings_dir/crashes/下,每个崩溃对应一个文件,直接查看即可。 - 所有能带来新代码覆盖率的有效输入变体,会保存在
findings_dir/queue/目录下,这些是AFL++认为有价值的输入,覆盖了核心的变异方向。 - 如果要查看所有尝试过的输入(包括没带来新覆盖率的),可以启用
-d调试参数运行AFL++,但会大幅降低模糊速度,一般只用于调试。
内容的提问来源于stack exchange,提问作者localacct
相关产品推荐
相关产品推荐

