天天看點

AFL使用

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/