0

我正在尝试了解 AFL-fuzzer,但我有一些问题:

  1. 我看到一个视频显示,例如,如果代码中有两个输入,那么在测试用例中,每一行都对应每个输入。那是对的吗?由于我想将完整的消息(例如 HTTP 请求)放入一个变量中,那么我该怎么做呢?
  2. 我不明白什么时候放@@。

例如,我正在尝试模糊此代码:

void Check_buffer(char* data) 
{
    char buffer[5];
    strcpy(buffer, data);
}

int main(int argc, char* argv[])
{
    char tmp_data = argv[1];
    Check_buffer(argv[1]);
    return 0;
}

我已经创建了 in 和 out 文件夹。在 in 文件夹中,我创建了一个包含以下内容的 txt 文件:“AAA”。

我执行的命令行是:afl-clang -fno-stack-protector -z execstack 4.c -o vul4

然后我运行:afl-fuzz -m none -i in/ -o out/ ./vul4 @@

我收到以下错误:perform_dry_run(), afl-fuzz.c:2852

如果我像这样运行命令:afl-fuzz -m none -i in/ -o out/ ./vul4 AA 它运行良好,但没有找到任何新路径,也没有发现崩溃。

此外,我正在尝试理解这个概念。如果我想在特定位置注入代码,我该怎么做?

4

1 回答 1

0
  1. 您正在尝试从命令行参数获取数据,但 AFL 不适用于 argv[](除非您的程序读取 ./prog file.txt 之类的文件)。而是使用类似的东西

    #define INPUTSIZE 100
    char input[INPUTSIZE] = {0};
    read (STDIN_FILENO, input, INPUTSIZE)
    

    如果您仍然对从 argv[] 获取数据感兴趣,可以使用 AFL 存储库中的实验方法afl argv Experiment

  2. @@ 当您的程序通过命令行接受文件时使用,这意味着模糊器将获取文件,对其进行变异,然后将其替换到程序中 @@

ps

#include <stdio.h>
#include <unistd.h>


#define INPUTSIZE 100
void Check_buffer(char* data)
{
    char buffer[5];
    strcpy(buffer, data);
}

int main(int argc, char* argv[])
{

char input[INPUTSIZE] = {0};
read (STDIN_FILENO, input, INPUTSIZE);

    Check_buffer(input);
    return 0;
}

AFL 结果图像

于 2020-01-21T15:42:58.600 回答