标题: [AFL]-f 选项解惑 分类: Fuzzing 创建: 2022-10-30 00:33 修改: 链接: http://0x2531.tech/fuzzing/202210300033.txt -------------------------------------------------------------------------------- 刚开始使用 afl-fuzz 时,对 -f 选项怎么用干什么的非常困惑,网上也没找到详细的说明文章。相信不 少 AFL 的初学者也会遇到这个问题,本文就来解惑下 -f 选项的作用。 在进入正题前,先简单介绍下程序接收外部输入的几种常见方式: - argv -- 这种最常见,作为 main 函数的参数接收外部输入 - stdin -- 标准输入 - env -- 环境变量 afl-fuzz 是如何支持这些输入方式的呢?这就引出了 -f 选项的作用。 如果在 afl-fuzz 命令行中传递了 -f 选项,则将其参数值赋给全局变量 out_file。 在检查目标程序参数(函数 detect_file_args)时,会检查是否包含 @@ 参数,该参数为输入文件占位 符。如果包含该参数,则将其替换为本地文件。如果指定了 -f 选项,则本地文件就是 out_file 里存储 的文件;否则,就是默认的输出目录下的 .cur_input 文件,同时将该文件路径赋值给 out_file。在执 行目标程序前,afl-fuzz 会将测试用例内容拷贝至该文件。然后执行目标程序。 所以,如果目标程序接收一个文件参数的话,只需在文件参数处传入 @@ 即可。如果对运行时输入文件有要 求,则通过 -f 选项指定自定义文件路径。一般情况下,则无需指定 -f 选项,直接使用默认的运行时输入 文件。 如果未设置 -f 选项且目标程序不包含 @@ 参数,afl-fuzz 会默认在输出目录下创建并打开 .cur_input 文件,并将文件 fd 赋值给全局变量 out_fd。 现在,我们有了 out_file 和 out_fd。接下来,就是在执行目标程序(函数 run_target)时使用他 们。 dup2(dev_null_fd, 1); dup2(dev_null_fd, 2); if (out_file) { dup2(dev_null_fd, 0); } else { dup2(out_fd, 0); close(out_fd); } 配置目标程序执行标准输出(1)和标准错误(2)指向 /dev/null。如果 out_file 非0,即设置了 -f 选项或使用了 @@ 参数,则标准输入(0)也指向 /dev/null,此时外部输入以 argv 方式传递而忽 略标准输入;否则,标准输入指向 out_fd,即 out_dir/.cur_input 文件,测试数据流转路径为:测 试用例->.cur_input->stdin。 至此,如何让目标程序接收标准输入 stdin 也明了了。不设置 -f 选项且目标程序不包含 @@ 参数就可以 了。另外,目标程序自身也需要有接收标准输入的代码实现,如果没有则需适当改造(harness)。