honggfuzz漏洞挖掘技術深究系列(3)——Fuzz策略
honggfuzz在對輸入檔案進行變異前,會先建立個臨時檔名(honggfuzz+pid+time),然後將輸入資料變異後寫入臨時檔案。
fuzz策略的實現主要集中在mangle.c中,在迴圈的fuzzloop函式中,會根據使用者的選擇的fuzz方式來呼叫動態fuzz或者靜態fuzz的方法,但最後都是呼叫mangle_mangleContent來變異檔案資料:
跟進mangle_mangleContent函式:
重點就在於後半部分,它會隨機選擇變異函式進行處理,更改的位元組數也是隨機的,根據使用者指定的mutation變異率來定,即允許變異檔案大小的百分比,變異函式列表如下:

這些函式都是在mangle_init中初始化,各函式之間也會相互呼叫:
把這些函式過一遍就是honggfuzz中所有的檔案變異規則了,如果想實現自己的fuzzer,這些規則來扣出來用Python實現一遍,順便把afl的規則也扣過來就更完美了,下面是我之前寫office fuzzer時的半成品程式碼,最後偷懶直接用radamas去實現變異了:
再回到剛才的變異函式列表,我們一個個走讀原始碼。
1、mangle_Resize函式:
用空格填充隨機位置
2、mangle_Byte函式:
向隨機位置寫隨機的uint8型別的資料
3、mangle_Bit函式:
取隨機位置的數值做位翻轉
4、mangle_Bytes函式:
在隨機位置覆蓋寫2~4位元組資料
5、mangle_Magic函式:
取各種邊界值進行覆寫,這些邊界值部分跟AFL還不一樣,我在自己的fuzzer裡面把它們作了整合。由於邊幅所限,我省略了不少邊界值:
6、mangle_IncByte函式:
取隨機位置的資料加1
7、mangle_DecByte函式:
取隨機位置的資料減1
8、mangle_NegByte函式:
取隨機位置的資料取反
9、mangle_AddSub函式:
取隨機位置的1、2、4或8位元組的資料長度作加減操作,運算元取 rand(0~8192)-4096
10、mangle_Dictionary函式:
變異目錄名,也是隨機取資料夾名稱進行變異,如果有多個目錄,那被變異的目錄數也是隨機的
11、mangle_DictionaryInsert函式:
在目錄的隨機位置中插入隨機資料
12、mangle_MemMove函式:
取隨機位置的資料拷貝隨機長度的資料,裡面就是呼叫memmove函式實現的
13、mangle_MemSet函式:
取隨機位置、隨機大小,用UINT8_MAX數值填充
14、mangle_Random函式:
取隨機位置、隨機大小的緩衝區,用隨機數填充
15、mangle_CloneByte函式:
取兩處隨機位置的作資料交換
16、mangle_Expand函式:
檔案末尾擴充套件隨機長度的空間,用空格填充,然後在隨機位置,取前面的隨機長度作資料拷貝
17、mangle_Shrink函式:
刪除隨機長度的檔案內容
18、mangle_InsertRnd函式:
在檔案的隨機位置插入隨機長度的資料
19、mangle_ASCIIVal函式:
在隨機位置覆蓋32位元組的隨機數
總結
在Fuzzing過程中,很多變異規則是共用的,可以參考一些主源的開源軟體,比如afl\peach\honggfuzz\libfuzzer,提取規則作整合,然後寫個自己的fuzzing框架,在後面作針對的fuzzer時,可以直接套用。
從上面的fuzz策略可以總結出常規的變異規則:
- 隨機資料替換
- 資料值增減
- 已知邊界值替換
- 插入隨機資料
- 刪減檔案內容
- 目錄變異
- 資料拷貝覆蓋
- ……