AFL++安装与使用
简介:
AFL++模糊测试框架包括:
1、一个具有许多变异器和配置的模糊器:afl-fuzz
2、不同的源代码检测模块:LLVM模式,afl-as,GCC插件
3、不同的二进制代码检测模块:QEMU模式,Unicorn模式,QBDI模式
4、用于测试用例/语料库最小化的实用程序:afl-tmin,afl-cmin
5、辅助库:libtokencap,libdislocator,libcompcov
安装:
1、安装依赖:
sudo apt-get update
sudo apt-get install -y build-essential python3-dev automake git flex bison libglib2.0-dev libpixman-1-dev python3-setuptools
sudo apt-get install -y lld-11 llvm-11 llvm-11-dev clang-11 || sudo apt-get install -y lld llvm llvm-dev clang
sudo apt-get install -y gcc-$(gcc --version|head -n1|sed 's/.* //'|sed 's/\..*//')-plugin-dev libstdc++-$(gcc --version|head -n1|sed 's/.* //'|sed 's/\..*//')-dev
2、将项目git到本地,配置LLVM_CONFIG进行安装:
cd $HOME
git clone https://github.com/AFLplusplus/AFLplusplus && cd AFLplusplus
export LLVM_CONFIG="llvm-config-11"
make distrib
sudo make install
3、设置环境变量:
export CC=/home/closure/AFLplusplus/afl-clang-fast
export CXX=/home/closure/AFLplusplus/afl-clang-fast++
export LLVM_CONFIG="llvm-config-11"
使用:
开始fuzz:
参数:
-i:指定输入文件夹,里面是准备好的种子
-o:指定输出文件夹,存放fuzz过程中出现的生成的queue,crash,hang等
-s:固定变异数据
-:分隔符,后加测试目标
@@:指代文件,如果不加@@就是标准输入
例:采用Xpdf==>
$HOME/AFL/afl-fuzz -i $HOME/fuzzing_xpdf/pdf_examples/ -o $HOME/fuzzing_xpdf/out/ -M fuzzer1 – $HOME/fuzzing_xpdf/install/bin/pdftotext @@ $HOME/fuzzing_xpdf/output
例:采用Libexif
/home/hollk/AFLplusplus/afl-fuzz -i /home/hollk/fuzzing_libexif/exif-samples-master/jpg/ -o /home/hollk/fuzzing_libexif/out/ -s 123 – /home/hollk/fuzzing_libexif/install/bin/exif @@
fuzz结果:
fuzz结果参数:
process timing:进程时间
run time:运行总时间
last new find:距离上一次发现新路径的时间
last uniq crash:距离上一次发现crash的时间
last uniq hang:距离上一次挂起的时间
overall results:总体状态信息
cycles done:运行的总周期数
total paths:运行的总路径数
uniq crashes:运行中的崩溃次数
uniq hangs:运行中挂起次数
cycle progress:进程周期进展
now processing:当前测试用例编号
paths timed out:由于超时放弃的输入数量
map coverage:映射覆盖率
map desity:已命中分支元组数与bitmap可以容纳的数量的比例(当前输入/全部语料库值)
count coverage:二进制文件中元组命中计数变化
stage progress:执行状态
now tring:正在执行变异策略
stage execs:当前的进度
total execs:全部执行总数
exec speed:执行速度
findings in depth:路径深度发现
favored paths:基于最小算法的favored路径
new edge on:新发现边数
total crashes:总crashs:总crashes数
total tmouts:总挂起数
fuzzing strategy yields:用于追踪fuzzing策略所获得的路径和尝试执行的次数的比例,用于验证有效性
path geometry:
levels:fuzzing过程中达到的路径深度,用户提供测试用例为1,根据变异阶段逐渐增加
pending:还有多少输入数据没有经过任何测试
pend fav:fuzzer在这个队中真正想达到的条目
own finds:找到的新路径数量
imported:从其他fuzzer导入的路径数量
stability:衡量观测到痕迹的一致性
参数注意点:
last new path:距离上一次发现新路径的时间==》可以更好了解fuzzing过程中是否存在某些问题==》
如果距离上一次发现新路径的时间过长==》输入的种子存在问题==》考虑暂停,进一步蒸馏种子
uniq crashes:运行中的崩溃次数==》一旦出现crash==》程序由于一些输入导致崩溃==》
该崩溃很可能是因为溢出导致