AFL++安装与使用
2022-03-20 18:51:36

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==》程序由于一些输入导致崩溃==》

该崩溃很可能是因为溢出导致