笔者最近在学习导向型fuzz,这就不得不提到AFLGO了。由于之前改代码弄环境把虚拟机搞得很杂,新开虚拟机进行搭建实验。网上相关教程较少,大部分是关于AFL的,所以写下此篇博客记录从一无所有的虚拟机到搭建完成测试的过程。由于作者本身也是小白,所以写的也很详细,如有已完成或觉得啰嗦的步骤请自行跳过。有不对的地方还请大佬们指正。
一、环境
ubuntu 18.04.5 LTS
内存:8G(建议分配8G以上,不然搭建AFLGO时编译可能会出错)
存储:60G
值得注意的是如果要做对比实验可能需要用ubuntu 16,但是里面许多东西都太老了,不能直接从apt中获取。大部分东西需要下压缩包然后./configure+make+make install,具体可以看里面的README
二、换源
初始安装完系统后apt的东西较为古早,导致如果直接进行aflgo搭建前的llvm安装会提示版本问题,建议换源后再进行。
关于换源的教程比较多了,放一个参考
1.打开sources.list文件
sudo gedit /etc/apt/sources.list
2.用"#"注释掉以前的源(deb开头)
3.增加自己想加的源后保存,以下为阿里源。
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
4.更新
sudo apt-get update
sudo apt-get upgrade
三、AFLGO搭建
AFLGO项目地址
https://github.com/aflgo/aflgo
0.git
(*)未安装则sudo apt-get install git
(-)建议配置git
代理git config --global http.proxy ‘http://192.168.x.x:10809’
(*)git clone https://github.com/aflgo/aflgo
1.修改搭建脚本
AFLGO提供了sh脚本可以自动完成搭建,但是需要进行一些修改。
(*)编辑aflgo/scripts/build/aflgo-build.sh
(*)配置proxy,后续需要用到wget。如果不配置,中间很容易被超时被中断。
加入两行即可
export http_proxy=“http://192.168.x.x:10809”
export https_proxy=“http://192.168.x.x:10809”
另外由于文件名为aflgo,所以需要将最后的afl改为aflgo。即/afl替换为$HOME/aflgo
2.运行脚本
sudo ./build.sh
注意编译时间会比较长,大概需要2-3小时。另外如果内存给的不够的话可能会失败,建议分配8G或以上的内存。
如图即为成功,如果失败了可以看下是哪一步出错了,然后把已经成功的步骤省略,不然重新编译又要耗费很长时间。
四、测试
至此AFLGO搭建完成,然而由于AFLGO与AFL不同,需要对程序进行插桩计算距离后才能使用。AFLGO中也提供了许多漏洞自动测试脚本,但是其中有许多坑需要排,有些脚本甚至怀疑写脚本的人自己没跑过(哭)。下面是我的排坑记录,如果不想走坑记得先执行加粗部分。如果还有问题,可以尝试把sh里的命令单步执行一行一行敲,看是哪里出了问题。
1.cxxfilt-CVE-2016-4487
(*)首先是所有脚本都需要加入的AFLGO路径
(-)请注意这个export是临时的变量,即当你关闭终端时就失效,而用sh脚本跑类似于重开终端,所以即使你在同一终端下,sh脚本配置了变量,终端中仍然不会显示。所以请在sh脚本内配置变量或者代理,而不是在执行sh脚本前的终端前配置。
这里做了个小实验,sh脚本为打印值为"123456"的变量test,直接运行sh能打印出,而在终端中却无法echo,即是上面所说的原因。
(*)执行sh脚本(执行前建议先执行下面黑体的内容)
待测试程序大部分是从github上下载,如果速度较慢请考虑配置git代理。
问题挺多,挨着排查
<1>首先是提示echo core > /proc/sys/kernel/core_pattern
直接输入会提示permission denny,输入sudo bash -c 'echo core > /proc/sys/kernel/core_pattern’即可
<2>然后是一堆编译的错误
‘makeinfo’ is missing on your system然后紧跟了几个error。这个是因为没有安装texinfo导致的
sudo apt install texinfo即可
(因为只是warning所以一开始没太在意,结果还真是这个的原因orz)。在obj-aflgo下重新make clean;make。
<3> ERROR: LeakSanitizer: detected memory leaks
加入环境变量export ASAN_OPTIONS="detect_leaks=0"
再跑后面的步骤,重新计算距离等。
到这儿就成功了,可以看到cpu百分比过高,这个是虚拟机设置的问题。关闭虚拟机后设置里多给点内核即可
2.giflib-bugs-74
(*)加入AFLGO路径 export AFLGO=$HOME/aflgo
(*)运行脚本
aclocal: warning: couldn’t open directory ‘m4’: No such file or directory
查了下是让安装automake,但是apt install时提示已安装,并且有1 not upgrade,故执行sudo apt dist-upgrade。再跑就没问题了。
3.jasper-CVE-2015-5221
这个改完aflgo路径直接跑就没问题。
4.KTY_Pretty_Printer(建议单步跑)
(*)改AFLGO路径
(*)运行脚本
<1>提示安装xlsxwriter pycrypto
这里需要注意环境里既有python2也有python3。
默认的python是指python2,而只有一个pip
所以先apt install python-pip,再pip2 install xlsxwriter pycrypto即可
<2>cmake出错
查了下是需要升级cmake到3.14,我的cmake版本是3.10.2。网上有许多教程,这里用的是这篇,感觉相对简单一点。
#https://blog.csdn.net/qq_26018075/article/details/104114107
#添加签名密钥
wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | sudo apt-key add -
#添加储存库
sudo apt-add-repository 'deb https://apt.kitware.com/ubuntu/ bionic main'
#更新(不用像原文一样卸载再安装,直接upgrade就行)
sudo apt update
sudo apt upgrade
然后再跑报新的错了,整了半天没解决,准备放着不管,但是后面跑Palindrome的时候又出现了一样的情况。最后询问师兄之后才解决。
可以看到这里用的是系统下自带的clang-11,而我们这里是想用aflgo提供的afl-clang-fast,所以会提示未知参数。进入KTY-Pretty-Printer的cmake文件夹下,改动64.cmake(32位系统就改32.cmake),然后改build.sh。后面如果是64位记得把sh里的build改成build64
因为先解决的是Palindrome,步骤相似,具体往后翻看第10部分就行。
后面就是流畅跑完了。
运行起来说提供的初始用例不行,具体需要什么格式的输入没去研究,但是搭建是成功了的。
5.libming-CVE-2018-8807与CVE-2018-8962
(*)改aflgo路径
(*)运行脚本
提示安装bison,sudo apt install bison flex libfreetype6 libfreetype6-dev即可。后续也有一些安装需要,这里一起安装了
然后报了新的错,重定义问题。
折腾了许久,查libming的issue发现0.4.7和0.4.8都会出现这个问题,而测试的版本是0.4.8。折腾了许久发现并不影响最后执行。
所以建议是:改完AFLGO路径直接运行sh脚本就好
6.libxml2-ef709ce2
(*)改aflgo路径
(*)运行脚本
sudo apt install gawk后
直接运行即可
提示第一个testcase过慢,解决方法两个,一个是加上-t 1000+参数再运行,一个是在in文件夹下删除这个测试用例。
7.lrzip-CVE-2017-8846与lrzip-CVE-2018-11496
(*)改aflgo路径
(*)运行脚本
跑到autogen.sh那段的时候会报错
apt install libbz2-dev即可,同样的,还需要安装liblzo2-dev
接下来就可以一次性跑通了
8.mjs-issues-57与mjs-issues-78
改完aflgo路径即可直接跑
9.objdump- CVE-2017-8392
最开始运行sh脚本提示不可运行,不知道是不是自己的原因。如果出现同样的情况
chmod +x ./objdump-CVE-2017-8392.sh 即可
改完aflgo路径即可直接跑
10.Palindrome(建议单步跑)
跑到./build.sh的时候
也是跟前面一样提示参数未识别
因为这里用的是系统的clang,而非aflgo提供的clang。仅通过脚本的export CFLAG和CXXFLAG是不行的。
进入aflgo/scripts/fuzz/cb-multios/cmake下,编辑64.cmake(如果是32位系统就编辑32.cmake),把里面的clang改为aflgo的afl-clang-fast的绝对路径。
如果是64位系统直接运行会提示-m32不支持
这里奇怪的是为什么64位系统,却使用了32位的cmake配置文件。查看cb-multios文件夹下的build.sh找到原因
如果定义了BUILD64这个变量,他才会跑64.cmake,不然就跑32.cmake。所以我们需要加入一行export BUILD64=XX,如上面框出来的部分。
这个时候再往后跑就没问题了(这儿折腾了好久,感谢实验室师兄的帮忙)
再到后面cd build/challenges/Palindrome会提示没有该文件夹,因为之前编译64位生成的是build64,改成build64即可
然后终于成了