AFLQemu模式

AFL Qemu模式

记录一下安装 AFL Qemu 模式时踩的坑。

遇到的问题:

  1. 运行 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

  1. 安装一些软件包时,遇到找不到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

  1. qemu下载地址出错,404 not found.

解决办法:在脚本中更换qemu地址,目前qemu下载地址为:https://download.qemu.org/

  1. 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