1

我正在尝试熟悉 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] 应该填充随机值吗?虽然看起来我的假设是错误的。
  • “@@”是否意味着它将从我的输入文件中读取并将读取的内容放入命令行(从我从文档中读取的内容,似乎是这种情况)?
4

1 回答 1

1

它没有结果而结束,因为您的命令是错误的,并且它没有执行任何模糊测试。

AFL++ 将从文件中获取测试用例,因此您需要修改源代码以执行模糊测试,例如打开一个文件,读取它并使用带有文件内容的缓冲区执行 strcpy。或者,添加 get 以从标准输入获取文件内容。在第一个示例中,命令应该是:

afl-fuzz -i afl_inputs -o afl_outputs ./target_application @@

在第二个例子中:

afl-fuzz -i afl_inputs -o afl_outputs ./target_application
于 2021-01-13T11:46:19.313 回答