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效果。
