最近在搞漏洞挖掘,之前寫過一個檔案格式漏洞挖掘的博文,使用的是光刃牛寫的Alpha Fuzz工具。感覺樣本生成的質量不是很好,這次打算使用一下老牌的Fuzz工具peach。學長介紹了一下說peach的樣本生成演算法比較屌,質量比較高。所以這次來學習一下。
另外最近打算搞android方面的漏洞挖掘和分析,部落格也沒怎麼寫。這次也是想學習一下android平臺的漏洞挖掘,感覺android平臺好用的工具不多,需要自己去研究,大牛們基本也都是有自己的“秘密工具”。
首先說一下,peach是基於檔案格式進行生成的原則進行產生樣本的。所以使用的時候需要去提供檔案格式的詳細資訊。但是也支援提供檔案樣本,基於檔案樣本變異去Fuzz。peach是用python寫的,官方提供了python原始碼和編譯成exe的版本。peach最好配合windbg使用。進行網路協議fuzz的話,最好配合wireshark使用。
peach pit是用xml寫的,用來描述檔案格式的檔案。peach pit的內容包含了使用工具進行Fuzz的整個過程,包括了測試樣本的生成、Fuzz過程的設定和捕獲異常的操作等,所以這個peach pit檔案決定了整個的Fuzz測試過程。
下面學習一下這個檔案的結構。
首先肯定是xml檔案,結構示意圖如下
其中可以在一個 Peach Pit 檔案裡指定任意數目的 DataModel,一般複雜的資料結構都會拆成幾部分,增強可讀性和可重用性。為了達到這個目的,提供了ref屬性,這個屬性只能讓DataModel和Block標籤使用。目的是為了是分開的幾塊提供重複使用,避免重複編寫的。常見的屬性和標籤如下:
屬性:
name-資料模型的名字[必須]
ref-引用模版資料模型[可選],這個用於給DataModel標籤使用。目的是為了是分開的幾塊提供重複使用,避免重複編寫的。
size-這個標籤代表的資料的大小(以bit為單位)
value-這個標籤代表的資料的內容,比如字串<String name="exmple" value="Hello world!">
minOccours-Block標籤使用,表示一個Block的重複出現的最低次數(用於重複出現資料使用)
maxOccours-Block標籤使用,表示一個Block的重複出現的最高次數(用於重複出現資料使用)
size-Number-數字使用,指定數字的進位制數
signed-數字使用,指定是否有符號
mutable-這個屬性標誌當前的資料是否可變,因為如果是magic之類的話要設為不可變。
有效的子元素:
Block 組合塊
Choice 指定標籤中任意一個塊(不是塊也可以?)是有效的,類似於switch。也是用來隨機生成資料的。
String 字串
Number 有signed屬性表示有無符號,
Blob 無型別的資料
Flags 以位為單位的資料
Fixup 求校驗值用
Relation 用於動態生成值的。有特有的type屬性配合特有的of屬性使用。
Transformer
這個是Flags標籤的使用方法,可見是一個Flag列表。
<Flags name="options" size="16">
<Flag name="compression" position="0" size="1" />
<Flag name="compressionType" position="1" size="3" />
<Flag name="opcode" position="10" size="2" value="5" />
</Flags>
Block 元素是用於組合幾個標籤使用的,因為多個標籤不能一起引用,所以把幾個標籤放入一個Block中就可以一起引用了。Block不能單獨使用,因為沒有意義。
Relation 用於動態生成資料使用的,因為檔案可能會有各種校驗值,就可以使用這個值來生成,與之對應的還有Fixup 用來生成校驗值的。
以上大部分都是抄的-。-沒有錯。下面寫點自己的東西
peach指令
- peach -t peach_xml_file 對pit檔案查錯
- peach -p 10,2 peach_xml_flie [test_name] 好像跟併發有關,不會用
- peach -1 --debug peach_xml_file 除錯執行Pit?
1.mutable="false" token="true" 這兩個屬性很有用,用來定義各種magic
2.Number與String的區別在於比如都指定"0"時一個是數字一個是字元。
3.長度指定。Blob——length、String——length、Number——size、Flag——size。其中前兩個的單位是byte,後兩個單位是bit。
4.<Choice>標籤很有用,這個標籤用來處理列舉值再好不過了。
5.用<Block>把每個塊分出來很方便。
6.我發現其實pit裡的資料型別就<Blob>、<Number>、<String>三種
7.常用的屬性其實就三個value、size、length、name
8.表示長度時要記得signed="false"
9. minOccurs="0" maxOccurs="50" 要成對出現,不然會報錯
<Publisher class="file.FileWriter">
</Publisher>
這一對標籤是Test標籤中用於輸出的類,引數如下。示例<Param name="FileName" value="FuzzedFile"/>
Supported Parameters:
FileName: [REQUIRED] Name of file to open for reading/writing
Append: Append to end of file [true/false, default flase]
Overwrite: Replace existing file? [true/false, default true]