"Fork server handshake failed" 对没有源代码的 arm 二进制文件进行模糊测试时出错

"Fork server handshake failed" Error when fuzzing an arm binary without source code

有人吗? 我一直致力于使用 afl-qemu 模式模糊测试 IoT 二进制文件。但是当开始 运行 二进制文件时,我遇到了“Fork 服务器握手失败”的问题。我已经阅读了之前的相关课程,但其中 none 解决了我的问题。

二进制信息在这里:

./bin/busybox: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-uClibc.so.0, stripped

通过我的测试,只有大于4.1.0的qemu版本才能成功应对'-L'参数。所以我通过编辑 build_qemu_support.sh 来升级 qemu 版本。需要说明的是,为了处理出现的错误运行ning.

,我注释掉了几行代码
#patch -p1 <../patches/elfload.diff || exit 1
#patch -p1 <../patches/cpu-exec.diff || exit 1
#patch -p1 <../patches/syscall.diff || exit 1

设置QEMU_LD_PREFIX和AFL_PATH后,我尝试了'afl-showmap -m none -o fuzz_out/out.txt -Q ./bin/busybox cat'这样的建议,结果没问题。

root@ubuntu:squashfs-root# afl-showmap -m none -o fuzz_out/out.txt -Q ./bin/busybox cat
afl-showmap 2.52b by <lcamtuf@google.com>
[*] Executing './bin/busybox'...

-- Program output begins --

但是当我尝试命令 'afl-fuzz -m none -i fuzz_in/ -o fuzz_out/ -Q ./bin/busybox cat @@' 时,它报告如下所示的错误。

root@ubuntu:squashfs-root# afl-fuzz -m none -i fuzz_in/ -o fuzz_out/ -Q ./bin/busybox cat @@
afl-fuzz 2.52b by <lcamtuf@google.com>
[+] You have 4 CPU cores and 2 runnable tasks (utilization: 50%).
[+] Try parallel jobs - see /usr/local/share/doc/afl/parallel_fuzzing.txt.
[*] Checking CPU core loadout...
[+] Found a free CPU core, binding to #0.
[*] Checking core_pattern...
[*] Setting up output directories...
[+] Output directory exists but deemed OK to reuse.
[*] Deleting old session data...
[+] Output dir cleanup successful.
[*] Scanning 'fuzz_in/'...
[+] No auto-generated dictionary tokens to reuse.
[*] Creating hard links for all input files...
[*] Validating target binary...
[*] Attempting dry run with 'id:000000,orig:testcase'...
[*] Spinning up the fork server...

[-] Hmm, looks like the target binary terminated before we could complete a
    handshake with the injected code. Perhaps there is a horrible bug in the
    fuzzer. Poke <lcamtuf@coredump.cx> for troubleshooting tips.

[-] PROGRAM ABORT : Fork server handshake failed
         Location : init_forkserver(), afl-fuzz.c:2253

谁能告诉我问题出在哪里?跟我升级qemu有关系吗?非常感谢!!

您已尝试升级 afl-qemu 使用的 QEMU 版本。因为 afl-qemu 对 QEMU 的源代码进行了修改,所以这不是一件小事。特别是,您注释掉的这些命令:

#patch -p1 <../patches/elfload.diff || exit 1
#patch -p1 <../patches/cpu-exec.diff || exit 1
#patch -p1 <../patches/syscall.diff || exit 1

都是说“对 .diff 文件指定的 QEMU 源代码进行精确修改”的命令。注释掉补丁命令意味着不进行修改。因此,生成的 QEMU 二进制文件没有以应有的方式与 afl-qemu 框架交互也就不足为奇了。

如果您需要使 afl-qemu 与更新的 QEMU 一起工作,您将必须查看所有补丁文件并确定更新的 QEMU 版本上的等效更改是什么。这将很棘手,除非您熟悉(或愿意花时间熟悉)QEMU 和 afl-qemu 的内部结构。 (您可能会环顾四周,看看是否有人已经这样做过。)

如果您尝试此升级的唯一原因是试图避免 QEMU 错误及其在早期 QEMU 版本中的“-L”选项,那么如果您改为使用标准的 afl-qemu 并更改您将“-L”指向的目录更简单,以便较旧的 QEMU 可以使用它。特别是,不要将其指向整个 chroot,而是仅将其指向具有来宾共享库的目录结构,并且目录之间没有任何符号 link。 (特别是符号 link 结构是导致旧版 QEMU 挂起的原因。)