Angora是由Peng Chen等人开发并维护的一款灰盒模糊测试器。其相关论文《Angora: Efficient Fuzzing by Principled Search》发表在了安全领域顶级会议S&P2018,该工具目前已在GitHub上开源。本文主要结合GitHub主页的技术文档和笔者实际安装经历,介绍一下笔者的Angora安装使用经历。
安装环境
Ubuntu 64位16.04.4
当前工作目录为/root
安装步骤
1.下载Angora
git clone https://github.com/AngoraFuzzer/Angora
下载完成后,Angora目录路径为/root/Angora。
2.安装LLVM
在Angora目录下运行:
PREFIX=/path-to-install ./build/install_llvm.sh
其中path-to-install为clang+llvm的安装路径,不妨设为/root/,运行成功后,clang+llvm被安装至目录/root/clang+llvm。
注意到,install_llvm.sh的安装方法是通过wget下载llvm的压缩包后自动安装,可能会由于网络问题出现无法下载的情况,因此,可以通过手动点击该链接下载压缩包clang+llvm-7.0.0-x86_64-linux-gnu-ubuntu-16.04.tar.xz,并存放在root目录下,之后将install_llvm.sh中的wget那一行语句删除,在root目录下运行:
PREFIX=/path-to-install ./Angora/build/install_llvm.sh
即可安装成功。
3.安装Rust
直接在/root目录下运行:
curl https://sh.rustup.rs -sSf | sh
之后按照提示运行:
source $HOME/.cargo/env
其中$HOME为.cargo的所在目录,这里为/root。
4.设置环境变量
在root目录下运行:
export PATH=/path-to-clang/bin:$PATH
export LD_LIBRARY_PATH=/path-to-clang/lib:$LD_LIBRARY_PATH
这里我们运行的命令应为:
export PATH=/root/clang+llvm/bin:$PATH
export LD_LIBRARY_PATH=/root/clang+llvm/lib:$LD_LIBRARY_PATH
5.建立Angora
在Angora目录下运行:
./build/build.sh
即可成功编译并安装Angora。
6.对CPU进行设置
运行:
echo core | sudo tee /proc/sys/kernel/core_pattern
7.测试是否能成功运行
在Angora/tests/目录下运行:
./test.sh mini
进行测试,显示无错误信息后测试成功
使用Angora对GNU Binutils 2.32进行测试
GNU Binutils 2.32是常用的评估漏洞挖掘工具效率的Benchmark软件,我们将其安装在/root/binutils-2.32/
1.通过./configure配置Make所需环境变量
在Binutils 2.32所在目录下依次运行:
CC=/path/to/angora/bin/angora-clang
CXX=/path/to/angora/bin/angora-clang++
LD=/path/to/angora/bin/angora-clang
PREFIX=/path/to/target/directory
./configure --disable-shared
这里,我们实际运行的命令为:
CC=/root/Angora/bin/angora-clang CXX=/root/Angora/bin/angora-clang++ LD=/root/Angora/bin/angora-clang PREFIX=/root/binutils-2.32 ./configure --disable-shared
成功配置并生成Makefile文件。
2.对Binutils进行污点跟踪编译
在Binutils 2.32所在目录下运行:
USE_TRACK=1 make -j
make install
编译安装完成后,在binutils目录下生成了被污点跟踪技术插桩编译产生的可执行文件objdump等。
创建target目录,在/root/目录下建立文件夹/target,在/root/target/目录下分别建立文件夹/fast及/taint,将binutils目录下的可执行文件objdump、readelf等复制到/root/target/taint/目录下,并重命名为objdump.taint、readelf.taint等。
3.对Binutils进行快速编译
在Binutils 2.32所在目录下运行:
make clean
USE_FAST=1 make -j
make install
编译安装完成后,在binutils目录下生成了快速编译产生的可执行文件objdump等,与2类似,将binutils目录下的可执行文件objdump、readelf等复制到/root/target/fast/目录下,并重命名为objdump.fast、readelf.fast等。
4.对objdump -d进行测试
在/root/目录下建立种子文件夹/input/,放入ELF可执行文件,作为种子对objdump进行测试,这里我们选取AFL提供的ELF文件格式的初始种子。
在Angora目录下运行:
./angora_fuzzer -i input -o output -t path/to/taint/program -- path/to/fast/program [argv]
这里我们实际运行命令为:
./angora_fuzzer -I /root/input -o /root/output -t /root/target/taint/objdump.taint -- /root/target/fast/objdump.fast -d @@
注意,与AFL相类似,在命令行参数后要加上@@。同时,输出目录不能是已经存在的目录,若在运行此命令前已创建了/root/output文件夹,则无法进行测试。