AFL Qemu模式 记录一下安装 AFL Qemu 模式时踩的坑。
遇到的问题:
运行 build 脚本后,提示 libtool 等资源库没有安装
1 2 3 4 5 6 7 $ sudo ./build_qemu_support.sh ================================================= AFL binary-only instrumentation QEMU build script ================================================= [*] Performing basic sanity checks... [-] Error: 'libtool' not found, please install first.
解决办法:sudo apt install libtool-bin
安装一些软件包时,遇到找不到glib2的错误
1 2 3 4 5 6 7 8 9 10 11 12 $ ./build_qemu_support.sh ================================================= AFL binary-only instrumentation QEMU build script ================================================= [*] Performing basic sanity checks... [-] Error: devel version of 'glib2' not found, please install first. $ sudo apt install glib2 正在读取软件包列表... 完成 正在分析软件包的依赖关系树 正在读取状态信息... 完成 E: 无法定位软件包 glib2
解决办法:
查看安装脚本中的报错处的代码,需要在 /usr/include/glib2.0/
或者 /usr/local/include/glib-2.0/
有相关库,代码如下:
1 2 3 4 5 6 if [ ! -d "/usr/include/glib-2.0/" -a ! -d "/usr/local/include/glib-2.0/" ]; then echo "[-] Error: devel version of 'glib2' not found, please install first." exit 1 fi
通过安装 libgtk2.0-dev 工具解决:sudo apt install libgtk2.0-dev
qemu下载地址出错,404 not found.
解决办法:在脚本中更换qemu地址,目前qemu下载地址为:https://download.qemu.org/
qemu编译出错
编译时出现下面的错误:
1 2 3 4 5 6 7 8 9 util/memfd.c:40:12: error: static declaration of 'memfd_create' follows non-static declaration static int memfd_create(const char *name, unsigned int flags) ^~~~~~~~~~~~ In file included from /usr/include/x86_64-linux-gnu/bits/mman-linux.h:115, from /usr/include/x86_64-linux-gnu/bits/mman.h:45, from /usr/include/x86_64-linux-gnu/sys/mman.h:41, from /root/afl-2.52b/qemu_mode/qemu-2.10.0/include/sysemu/os-posix.h:29, from /root/afl-2.52b/qemu_mode/qemu-2.10.0/include/qemu/osdep.h:104, from util/memfd.c:28:
因为这个qemu版本太老了,现在已经出到 8.x 版本了,AFL用的还是 2.10.0 版本,所以需要自己再打一个patch:
1 2 3 4 5 6 7 8 9 10 11 12 diff -ru qemu-2.10.0-clean/util/memfd.c qemu-2.10.0/util/memfd.c --- qemu-2.10.0-clean/util/memfd.c 2018-11-20 18:11:00.170271506 +0100 +++ qemu-2.10.0/util/memfd.c 2018-11-20 18:11:13.398423613 +0100 @@ -37,7 +37,7 @@ #include <sys/syscall.h> #include <asm/unistd.h> -static int memfd_create(const char *name, unsigned int flags) +int memfd_create(const char *name, unsigned int flags) { #ifdef __NR_memfd_create return syscall(__NR_memfd_create, name, flags);
将上述文件命名为 memfd_create.diff 后,放如 patchs 目录,然后在脚本中打 patch 的地方,新增一行:
1 patch -p1 <../patches/memfd_create.diff || exit 1
重新运行安装脚本即可。
最后脚本安装成功后会有以下输出:
1 2 3 4 5 6 7 [+] Build process successful! [*] Copying binary... -rwxr-xr-x 1 guoxb guoxb 10981040 Sep 1 04:30 ../afl-qemu-trace [+] Successfully created '../afl-qemu-trace'. [*] Testing the build... [+] Instrumentation tests passed. [+] All set, you can now use the -Q mode in afl-fuzz!
只有第6行显示插桩测试通过后,并且在上一级目录能找到 afl-qemu-trace 文件才算安装成功 AFL 的 qemu 模式。
下面第一个博客中写插桩测试不通过但是也能运行成功,但反正我没有成功。
采用 qemu 模式进行 fuzz 只需要对目标 binary 文件测试时命令行加上 -Q
参数即可。
1 afl-fuzz -i fuzz-in -o fuzz-out -Q ./path/to/binary
注: 我的测试环境是Ubuntu18.04,只出现了上面列出的几种问题,在翻阅博客的时候还看到有其他各种各样的问题,我暂时没遇到,就先不管了,把博客挂在下边,如果后续遇到其他问题可以查阅参考。
问题解决参考博客:
http://www.gandalf.site/2019/01/aflafl-qemufuzz.html
https://blog.csdn.net/qysh123/article/details/114792891(成功)
https://www.mail-archive.com/debian-bugs-dist@lists.debian.org/msg1643066.html