0x00 原理
環境:kail linux
選取AFL對libtiff(Libtiff 是一個用來讀寫標簽圖像文件格式的庫)進行模糊測試,作為入門示例。——測試目標libtiff。
將libtiff的編譯程序指定為AFL的編譯器(afl-gcc,afl-g++)進行編譯,這樣AFL編譯器會對源碼進行打樁。 最后通過afl-fuzz 啟動編譯出來的libtiff程序,並指定輸入文件夾與輸出文件夾。 AFL會讀取輸入文件,進行變異喂給應用程序,最后將crash等輸出信息保存到輸出文件夾。
打樁原理:
源碼:
while (go): req = get_request() process(req)
AFL插入后代碼:
while (go) put_request(read(file)) // AFL req = get_request() process(req) notify_fuzzer() // AFL
0x01 AFL安裝
下載:wget http://lcamtuf.coredump.cx/afl.tgz tar xfz afl.tgz
解壓:tar xfz afl.tgz
進入文件夾:cd afl-1.88b (看下載的版本,不一定是1.88)
安裝: sudo make install
0x02 編譯libtiff
下載:wget http://download.osgeo.org/libtiff/tiff-3.8.2.tar.gz
解壓:tar zxvf tiff-3.8.2.tar.gz
加入文件夾: cd tiff-3.8.2
指定編譯程序為AFL的編譯器:export CC=afl-gcc (設置linux環境變量,env查看)
export CXX=afl-g++

編譯:./configure –disable-shared
make clean
make
編譯完成后會在tools文件夾下面生成可執行程序如bmp2tiff

0x03 開始fuzzing
建立輸入輸出文件夾:mkdir input output
將初始文件放入到輸入文件夾中: cp bmp/full/images/* input/
(也可在網上下載,關鍵在於把初始文件放入到input文件夾)

開始fuzzing: afl-fuzz -i input –o output /root/tiff-3.8.2/tools/bmp2tiff @@ /dev/null(通過afl-fuzz啟動應用程序,-i指定應用程序的輸入,-o指定fuzzing結果的輸出,/root/tiff-3.8.2/tools/bmp2tiff通過AFL編譯生成的應用程序路徑,/dev/null不輸出錯誤信息到屏幕中)
開發fuzzing后會進入這樣一個界面

Output中生成這些文件,一些crashes和hangs文件等

0x04 小結
AFL非常適合於linux下有源碼程序的測試,在linux下環境搭建簡單,使用方便。對於crash的分析與對無源碼程序的fuzz有待后續深入研究。
0x05 參考資料
http://files.meetup.com/17933012/2015-03-introduction-fuzzing-with-afl.pdf
