You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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-fuzz -i ./testcases/ -o ./findings_dir -Q -- ./wrapper.sh
    
    这样AFL++会把测试用例内容通过标准输入传给脚本,脚本再转成命令行参数给目标程序。
  • 已经等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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 09:52:32