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
http://lcamtuf.coredump.cx/afl/README.txt
http://lcamtuf.coredump.cx/afl/