AFL++下载及安装
git clone https://github.com/AFLplusplus/AFLplusplus
cd AFLplusplus
apt install build-essential libtool-bin python3-dev automake flex bison libglib2.0-dev libpixman-1-dev clang python3-setuptools llvm
make distrib
make install
如果输入 afl-fuzz -Q -m none -i in -o out test @@
,即可对无源码的 test 二进制文件进行 fuzz 测试。
FFmpeg准备
FFmpeg是一个自由软件,可以运行音频和视频多种格式的录影、转换、流功能,包含了libavcodec ─这是一个用于多个项目中音频和视频的解码器库,以及libavformat——一个音频与视频格式转换库。
下载并安装
wget https://ffmpeg.org/releases/ffmpeg-4.0.2.tar.bz2
tar -jxvf ffmpeg-4.0.2.tar.bz2
cd ffmpeg-4.0.2/
./configure
make
make install
构建语料库
ffmpeg黑盒测试主要就是用的官网上的语料库,本次实验主要是用的test数据集下的一些avi测试集。构建语料库代码如下:
# 进入到你的ffmeg所在位置
mkdir in # 当前文件夹下创建in文件下
cd in
# 通过wget指令可以下载测试语料库,这里只给出一个测试集
wget http://samples.ffmpeg.org/tests/DivX-test/Xmen-OpenDivX-200-slow.avi
黑盒测试FFmpeg
所谓黑盒测试,通俗地讲就是对没有源代码的程序进行测试,这时就要用到AFL的QEMU模式了。启用QEMU模式,要先编译。
# 进入到AFLplusplus所在位置
cd qemu_mode
./build_qemu_support.sh
现在准备工作已经全部做好了,只需添加 -Q 选项即可使用QEMU模式进行Fuzzing。
afl-fuzz -Q -m none -i in -o out ./ffmpeg -i @@
结果展示
根据 fuzz 时输入的命令,我们的结果是输出在 out 目录下。
├── cmdline
├── crashes
├── fuzz_bitmap
├── fuzzer_stats
├── hangs
├── plot_data
└── queue
├── id:000000,time:0,orig:Xmen-OpenDivX-650-fast.avi
├── id:000001,src:000000,time:28078,op:flip1,pos:5,+cov
├── id:000002,src:000000,time:28192,op:flip1,pos:5
├── id:000003,src:000000,time:28302,op:flip1,pos:5
├── id:000004,src:000000,time:28422,op:flip1,pos:6
├── id:000005,src:000000,time:28590,op:flip1,pos:7,+cov
├── id:000006,src:000000,time:28690,op:flip1,pos:7
├── id:000007,src:000000,time:28786,op:flip1,pos:7
├── id:000008,src:000000,time:37873,op:flip1,pos:12,+cov
├── id:000009,src:000000,time:38178,op:flip1,pos:12
├── id:000010,src:000000,time:38603,op:flip1,pos:13
├── id:000011,src:000000,time:38876,op:flip1,pos:13,+cov
├── id:000012,src:000000,time:39579,op:flip1,pos:15,+cov
├── id:000013,src:000000,time:40218,op:flip1,pos:18
├── id:000014,src:000000,time:40425,op:flip1,pos:20
├── id:000015,src:000000,time:40660,op:flip1,pos:22,+cov
├── id:000016,src:000000,time:40877,op:flip1,pos:24,+cov
├── id:000017,src:000000,time:40963,op:flip1,pos:24
├── id:000018,src:000000,time:41171,op:flip1,pos:25,+cov
├── id:000019,src:000000,time:41347,op:flip1,pos:27
├── id:000020,src:000000,time:41483,op:flip1,pos:28,+cov