QEMU-AFL:跟随 fork() 进入子节点

QEMU-AFL: follow fork() into child

提问人:jimkokko5 提问时间:11/17/2023 更新时间:11/17/2023 访问量:16

问:

我已经搜索 AFL++ 和 QEMU 文档一段时间了,但我似乎找不到这个问题的答案:你能指示 QEMU-AFL(AFL++ 的 QEMU 分支,运行时使用)跟随在当前模糊处理的过程中创建的分支吗?afl-fuzz -Q

一个非常简单的例子是二进制文件和二进制文件(见下面的代码)。二进制“fork + exec”是二进制文件,子二进制文件从中读取一个字符,如果它等于 .崩溃将传播到二进制文件。parentchildparentchildstdin'c'parent

当我用 运行它时,我得到:afl-fuzz -i in/ -o out/ -Q -- ./parent

last new find : none yet (odd, check syntax!)

这让我相信 AFL++ 实际上并没有跟踪子进程中的覆盖率。由于似乎可以使用检测二进制文件执行此操作,因此我认为限制不在 AFL++ 中,而是在 QEMU-AFL 中。有没有办法指示 QEMU-AFL(或 QEMU)遵循分叉?


代码 :parent.c

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>


int main(int argc, char* argv[])
{
    printf("Hello from the parent!\n");

    pid_t new_pid = fork();

    if (new_pid == 0) {
        execve("./child", argv, NULL);
        return 0;
    }

    // Wait for child to finish.
    int child_retcode = 0;
    while (wait(&child_retcode) > 0);

    return child_retcode;
}

代码 :child.c

#include <stdio.h>
#include <stdlib.h>


int main(int argc, char* argv[])
{
    printf("Hello from the child!\n");

    char c1 = getchar();
    char c2 = getchar();
    if (c1 == 'c') {
        printf("Oh no, we're crashing!\n");
        abort();
    }

    return 0;
}
qemu 模糊测试 american-fuzzy-lop

评论


答: 暂无答案