我正在尝试熟悉 afl++ 的用法。我写了一个简单的程序,如果 argv[1] 太长,它会因为缓冲区溢出而崩溃。
int main(int argc, char *argv[])
{
char buffer[4];
if(argc == 2)
{
strcpy(buffer, argv[1]);
}
return 0;
}
我希望 afl++ 很快就会发现崩溃,但在运行了相当长的一段时间后,可能大约 2 小时,我还没有看到任何崩溃记录。
我使用的命令行是
afl-fuzz -i afl_inputs -o afl_outputs -- ./target_application
该程序是用
CC=afl-clang-fast++ AFL_HARDEN=1 make
有趣的是,当我解决这个问题时,我在输入文件中放入了一些 ASCII 字符,例如字符“Z”并修改了命令行afl-fuzz -i afl_inputs -o afl_outputs -- ./target_application @@
,afl++ 将立即终止,说明其中一个测试用例导致了崩溃。
此外,我尝试使用该输入文件运行应用程序本身,./target_application ./afl_inputs/input.txt
但./target_application < ./afl_inputs/z.txt
它在两种情况下都不会崩溃。
问题
- 我究竟做错了什么?
- 由于 afl++ 模糊标准输入,如果我没有指定“@@”,我可以假设 argv[1] 应该填充随机值吗?虽然看起来我的假设是错误的。
- “@@”是否意味着它将从我的输入文件中读取并将读取的内容放入命令行(从我从文档中读取的内容,似乎是这种情况)?