AFL 简易使用
一、环境
名称 | 版本 | 链接 |
---|---|---|
AFL | 2.57B | https://github.com/google/AFL |
Ubuntu | 18.04 | https://ubuntu.com/ |
UPX | 3.94 | https://github.com/upx/upx.git |
afl-cov | 0.62 | https://github.com/mrash/afl-cov#prerequisites |
二、测试
- vi test.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(int argc, char* argv[]) {
char buf[100] = {0};
gets(buf);
printf("%s\n",buf);
return 0;
}
-
使用afl-gcc test.c
-
创建输入输出文件夹,并初始化首个样本文件
-
使用afl-fuzz -i fuzz_in -o fuzz_iout ./a.out
-
如上图所示即为运行成功。
-
在fuzz_iout 目录下存在crashes文件夹,里面存放着可以导致崩溃的文件
*如下图所示触发
三、fuzz upx
-
首先拉取upx代码并切换到3.94版本
git clone https://github.com/upx/upx.git
cd upx
git checkout v3.94 -
拉取依赖(在当前目录下运行)
git submodule update --init --recursive -
上面这一步是为了拉取src/lzma-sdk/目录下的代码
-
vim src/Makefile
- CC = /usr/local/bin/afl-gcc (添加)
- CXX ?= /usr/local/bin/afl-g++ (修改)
-
安装 UCL
- 链接:http://www.oberhumer.com/opensource/ucl/
./configure CPPFLAGS="$CPPFLAGS -std=c90 -fPIC"
make
make install
export UPX_UCLDIR=/ucl-1.03
- 链接:http://www.oberhumer.com/opensource/ucl/
-
进入upx目录执行make all
-
编译完成之后就可以进行fuzz了
-
mkdir upx_in upx_out
-
cp /bin/touch upx_in
-
afl-fuzz -i upx_in -o upx_out -m 300 -t 300000 -- upx/src/upx.out @@
四、简易介绍
- afl命令
afl-gcc 和afl-g++ 分别对应的是gcc 和g++ 的封装 可以编译文件,并在源文件中添加特殊指令用于 afl fuzz 编译插装
afl-clang 和afl-clang++ 分别对应clang 的c 和c++ 编译器封装À。
afl-fuzz 是AFL 的主体,用于对目标程序进行fuzz。
afl-analyze 可以对用例进行分析,通过分析给定的用例,看能否发现用例中有意义的字段。
afl-qemu-trace 用于qemu-mode,默认不安装,需要手工执行qemu-mode 的编译脚本进行编译
afl-plot 生成测试任务的状态图
afl-tmin 和afl-cmin 对用例进行简化
afl-whatsup 用于查看fuzz 任务的状态
afl-gotcpu 用于查看当前CPU 状态
afl-showmap 用于对单个用例进行执行路径跟踪 - afl-fuzz 参数
-i:指定测试样本所在目录;
-o:指定测试结果存放目录;
-M:运行主(Master) Fuzzer;
-S:运行从属(Slave) Fuzzer;
-t:设置程序运行超时值,单位为 ms;
-m:最大运行内存,单位为 MB; - 窗口信息
Process timing:Fuzzer运行时长、以及距离最近发现的路径、崩溃和挂起经过了多长时间。
Overall results:Fuzzer当前状态的概述。
Cycle progress:我们输入队列的距离。
Map coverage:目标二进制文件中的插桩代码所观察到覆盖范围的细节。
Stage progress:Fuzzer现在正在执行的文件变异策略、执行次数和执行速度。
Findings in depth:有关我们找到的执行路径,异常和挂起数量的信息。
Fuzzing strategy yields:关于突变策略产生的最新行为和结果的详细信息。
Path geometry:有关Fuzzer找到的执行路径的信息。
五、afl-cov的使用
- afl-cov主要是为了查看覆盖率,并且需要编译支持。
- 首先拷贝一份upx的代码
-
cd upx_2
-
vi src/Makefile
-
在上面更改的CC和CXX后面添加-fprofile-arcs -ftest-coverage
-
make all
-
./afl-cov/afl-cov -d fuzz_upx/upx_out/ --live --coverage-cmd="./upx/upx_2/src/upx.out AFL_FILE" --code-dir="./upx/upx_2/src/"
-d afl-fuzz 的输出目录
--live 实施获取
--coverage-cmd 被fuzz文件与AFL_FILE 为生成的例子
--code-dir= 代码目录
- 在upx_out 目录下存在cov目录,cov目录下存在web,可以使用python启动web服务器查看。
- python启动web服务命令
- python -m SimpleHTTPServer 80
- 浏览器中访问
- 根据上图所示,更改示例达到更好的fuzz效果。