AFL入門


1 afl 是什么?

  American fuzzy lop 號稱是當前最高級的Fuzzing 測試工具之一,由谷歌的Michal Zalewski 所開發。通過對源碼進行重新編譯時進行插樁(簡稱編譯時插樁)的方式自動產生測試用例來探索二進制程序內部新的執行路徑。與其他基於插樁技術的fuzzers 相比,afl-fuzz 具有較低的性能消耗,有各種高效的fuzzing 策略和tricks 最小化技巧,不需要先行復雜的配置,能無縫處理復雜的現實中的程序。當然AFL 也支持直接對沒有源碼的二進制程序進行測試,但需要QEMU 的支持,將在本文后面做詳細介紹。

2 安裝

從官網http://lcamtuf.coredump.cx/afl/ 下載最新版的源碼(latest version),解壓后進入所在目錄。執行以下命令進行編譯和安裝:

make
sudo make install


默認情況下,afl 相關的可執行文件會被安裝到/usr/local/bin 目錄下,我們看看安裝了哪些工具,執行ls 命令(如圖1):

ls /usr/local/bin/afl*

 

從圖1可以看到,AFL 安裝的文件,作用分別為:

• afl-gcc 和afl-g++ 分別對應的是gcc 和g++ 的封裝
• 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 用於對單個用例進行執行路徑跟蹤

3.使用

1.文件FUZZ

官網有許多:略

2.網絡I/O

1. 如果手頭有被測程序的源碼,可以修改源碼,對網絡接收報文的函數進行封裝,改為從文件文件讀取數據;
2. 如果沒有源碼,或者不想修改代碼這么麻煩的話,可以使用LD_PRELOAD 加載一些hook 庫,替換掉recv、recv_from 等網路I/O 函數。preeny 是一個很好的選擇À。我們以兩個實際的例子,看看如何使用AFL 測試一個網絡程序,分別對應修改源碼和替換系統函數這兩種方式。

 4.建議

首先我們需要認識到AFL 的優劣勢,選擇適合的工具做合適的事情。AFL 設計之初就是用來做文件格式fuzz的,而且也測出了很多知名開源組件的漏洞,如:OpenSSH,ntpd,PHP,sqlite、FirefoxÀ該目錄中的所有用例都是AFL 在FUZZ 過程中能導致目標程序異常退出的如何更有效地使用等等,這些漏洞的共同的特征是從文件中讀取數據進行解析。AFL 未設計針對有特定狀態機的復雜網絡程序的fuzz,所以,像那些有復雜交互狀態的網絡程序,如通過一些交互報文建立一個會話,后續在此會話中處理輸入,那么AFL 就不太適合了,peach 是更合適的選擇。另外,AFL 目前也不支持fuzz 命令行參數,所以對於有些程序直接讀取命令行參數中的內容,並對參數內容進行處理,AFL 也做不了。
這里給出幾個更有效使用AFL 的TIPS。

1. 盡量使測試用例足夠小

大用例不光使得目標進程解析時需要耗費更多CPU 時間和更多內存,也會使得fuzz 進程效率非常低下。舉個例子,如果要對一個圖片處理程序進行fuzz,就沒必要將高分辨率的照片作為用例,一個16x16 分辨率的圖片就足矣。再舉個例子,從數據上來看,如果一個用例的大小為100 字節,那么fuzz 1000 次,可以有71% 的機會觸發到有問題的執行路徑;如果用例的大小變為1k 字節,則同樣的執行次數,觸發有問題的分支的概率降低為%11;如果用例規模進一步增長,變為10k字節,則同樣的執行次數,觸發問題分支的概率將降低為%1。

2. 確保測試對象足夠簡單

有些基本的文件格式處理庫被不同的處理程序使用,有些處理程序功能復雜,有些簡單,那么,我們應該選擇那些功能簡單的處理程序來fuzz。舉個例子,就圖片格式處理程序來說,djpeg、readpng 以及gifhisto 要比ImageMagick 在執行效率上快5 到10 倍,但是他們都用同樣的圖片格式解析庫。

3. 只給需要測的庫進行打樁因為AFL

是在匯編級別對被測程序的源碼進行插樁的,也就是說,插樁的點越多,編譯出來的程序執行效率就會越低。那么,如果只想對其中某一個庫進行fuzz 的話,可以用未插樁的庫替換掉被測程序中使用AFL 編譯器編譯出來的庫。

4. 並行

afl-fuzz 設計成只給工作進程分配一個核,現在的機器都具備多個CPU,每個CPU 又有多個核,所以我們可以最大地發揮硬件效率,同時執行多個afl-fuzz。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM