開源Fuzz框架负拟。
簡介
Michael Eddington等人開發(fā)的Peach是一個遵守MIT開源許可證的模糊測試框架秋麸,最初采用Python語言編寫袖外,發(fā)布于2004年循头,第二版于2007年發(fā)布唠摹,最新的第三版使用C#重寫了整個框架爆捞。
Peach支持對文件格式、ActiveX勾拉、網(wǎng)絡(luò)協(xié)議煮甥、API等進行Fuzz測試;Peach Fuzz的關(guān)鍵是編寫Peach Pit配置文件藕赞。
Windows下使用Peach3需要預(yù)先安裝.net 4和windbg成肘;Linux、OS X下需要安裝Mono .net開發(fā)框架斧蜕。
peach中最重要一部分就是peach Pit配置文件双霍。Peach Pit文件包含以下內(nèi)容:
1、General Configuration(通用配置)
2批销、Data Modeling(數(shù)據(jù)模型)
3洒闸、State Modeling(狀態(tài)模型)
4、Agents and Monitors(代理和監(jiān)視)
5均芽、Test Configuration(測試配置)
具體文件結(jié)構(gòu)如下:
<?xml 版本丘逸,編碼之類?>
<Peach 創(chuàng)建時間,地址骡技,作者等等>
<Include 包含外部文件 />
<DataModel> 類型信息鸣个,關(guān)系(大小,計數(shù)布朦,偏移)囤萤、可嵌套等<\DataMode>
<StateModel>測試邏輯,狀態(tài)轉(zhuǎn)換</StateModel>
<Agent>監(jiān)視被測目標的情況是趴,崩潰信息等</Agent>
<Test>指定使用哪個StateModel涛舍,Agent,Publisher唆途、Strategy富雅、Logger等</Test>
</Peach>
一、 數(shù)據(jù)模型(data modeling)
1.1 Data Model
(1)屬性:
- Name---必須的肛搬。當(dāng)引用模型或者調(diào)試時没佑,友好的DataModel名字是非常有用的。
- Ref---可選的温赔。引用一個DataModel模板蛤奢。
- Mutable---可選的,默認為真。該元素是否可變異啤贩。
- Constraint---可選的待秃。確定一個表達式,它幫助Peach確定數(shù)據(jù)元素是否已被適當(dāng)?shù)南摹?/li>
(2)子元素:
- Block痹屹、
- Choice章郁、
- Custom、
- Flag志衍、
- Flags暖庄、
- Number、
- Padding足画、
- String雄驹、
- XmlAttribute、
- XmlElement淹辞、
- Relation、
- Fixup俘侠、
- Transformer象缀、
- Placement
(3)例子:


當(dāng)一個DataModel被解析時,自定義DataModel看起來像是兩個數(shù)據(jù)模型的組合爷速,如下所示:

一個Peach文件中可以指定任意多個DataModel元素央星,但每個DataModel的名字必須唯一。通過DataModel可以將復(fù)雜的格式按照邏輯分解為更小的模型惫东,使數(shù)據(jù)模型更易閱讀莉给、調(diào)試和重用。一個名字為“HelloWorld”的DataModel包含一個字符串和輸出“Hello World廉沮!”如下所示:
1.2颓遏、 Blob
Blob元素是DataModel或Block的一個子元素。Blob元素常常用于代表缺少類型定義或格式的數(shù)據(jù)滞时。如下所示:
(1)屬性(除非聲明叁幢,所有的屬性都是可選的):
- Name---必須的。Blob的名字坪稽。
- Value---含有Blob的默認值曼玩。
- Length---Blob的大小,單位為字節(jié)窒百。
- Ref---引用一個數(shù)據(jù)模型來作為Blob的模板黍判。
- valueType---默認格式的值,hex篙梢,string顷帖,或者literal,默認為string。
- minOccurs---該Blob元素必須發(fā)生變化的最小次數(shù)窟她,默認為1陈症。
- maxOccurs---該Blob元素能夠發(fā)生變化的最大次數(shù),默認為1震糖。
- Token---當(dāng)解析時該元素應(yīng)該作為一個令牌來信任录肯,默認是假。
- lengthType---長度的類型吊说,指定長度论咏。
- Constraint---一個約束的形式表達,用于數(shù)據(jù)破解颁井。
- Mutable---Blob元素是否可變異(是否能被fuzzing)厅贪,默認為真。
(2)子元素:
- Anayzers
(3)例子:
一個簡單的Blob雅宾。這個Blob中养涮,任何類型或長度的數(shù)據(jù)能破解。

1.3眉抬、 Block
與DataModel 類似
Block是DataModel或Block元素的子元素贯吓。Block用于在一個邏輯結(jié)構(gòu)中將一個或者多個數(shù)據(jù)元素(Number或String)組織在一起,它和Datamodel非常相似蜀变,僅有的差異是它們的位置悄谐。DataModel是個頂層元素,Block是DataModel的一個子元素库北,它們都可以作為其他Block或DataModel的模板爬舰。
(1)屬性(除非聲明,所有的屬性都是可選的):
- Name---Block的名字寒瓦。
- Ref---引用一個數(shù)據(jù)模型來作為Block的模板情屹。。
- minOccurs---該Block必須發(fā)生變化的最小次數(shù)孵构。
- maxOccurs--該Block可以發(fā)生變化的最大次數(shù)屁商。
- Mutable---元素是否可變異,默認為真颈墅。
(2)子元素:
Blob蜡镶、 block、 Choice恤筛、 Custom官还、 Fixup、 Flag毒坛、 Flags望伦、 Number林说、 Padding、Placement屯伞、 Relation腿箩、Seek、 String劣摇、 Transformer珠移、 XmlAttribute、 XmlElement末融。
(3)例子:
嵌套的Block钧惧。Block可以根據(jù)需要多層的嵌套,它可以幫助創(chuàng)建邏輯結(jié)構(gòu)而不改變數(shù)據(jù)包含的內(nèi)容勾习。

這個嵌套的Block定義產(chǎn)生的輸出為:1 2 3 4 浓瞪。
引用屬性允許構(gòu)建健壯的模板,如下所示模板的名字為“Key”巧婶,值為“\r\n”乾颁。

使用該模板作為一個引用

輸出為:

兩個關(guān)鍵字符串在這里發(fā)生沖突。當(dāng)解析時艺栈,自定義的Block將代替它的DataModel模板的結(jié)構(gòu)钮孵。添加字符串值“:\r\n”。同時“customized”將覆蓋String元素的“Key”和“Value”的值眼滤,用“Content-Length”和55代替。最終的DataModel將被解析如下:

1.4历涝、 Choice
Choice是DataModel或者Block元素的的子元素之一诅需。Choice元素用于指示任何子元素是有效的,但是只應(yīng)選擇一個荧库,很像編程語言中的switch語句堰塌。
(1)屬性(除非聲明,所有的屬性都是可選的):
- Name---choice元素的名字分衫。
- minOccurs---該Choice必須發(fā)生改變的最小次數(shù)场刑。
- maxOccurs---該Choice能發(fā)生改變的最大次數(shù)。
- Occurs---該choice能發(fā)生改變的迭代次數(shù)蚪战。
(2)子元素:
Block牵现、Choice、String邀桑、Number瞎疼、Blob、Flags壁畸、Fixup贼急、Transformer茅茂、XmlAttribute、XmlElement太抓。
(3)例子:
一個基本的Choice空闲。這個例子將破解或消耗1,2,3類型的數(shù)據(jù),很像一個需要在令牌上做出決定的常規(guī)切換語句走敌。它的前8個字節(jié)是1碴倾,剩下的數(shù)據(jù)被視為一個32位數(shù)字。如果前8位是2悔常,剩下的數(shù)據(jù)被視為一個255字節(jié)的二進制數(shù)據(jù)影斑。如果前8位是3,剩下的數(shù)據(jù)被視為一個8字節(jié)字符串机打。當(dāng)fuzzing時矫户,Peach將選擇其中的1個類型并進行fuzzing,它的輸出為一個8位數(shù)字残邀,后跟相應(yīng)的類型皆辽。Peach將會嘗試所有的3個類型。

一系列的Choice芥挣。第一個例子適合構(gòu)建單個Choice驱闷,但如果有許多Type1 、Type2和Type3塊都是彼此跟隨的空免,該怎么做呢空另?。通過設(shè)置minoccurs蹋砚、maxoccurs或者occurs屬性扼菠,可以指定Choice應(yīng)該被重復(fù)。這個例子嘗試來破解至少3個坝咐,最多6不同的Choice循榆。

1.5、 Flags
Flags定義了一組Flag的大小墨坚。
(1)屬性:
- Name---可選的秧饮。元素的名字。
- Size---必須的泽篮。大小盗尸,以位為單位。
- Mutable---可選的咪辱。元素是否可以變異振劳,默認為真。
(2)子元素:
- Fixup油狂、Flag历恐、Placement寸癌、Relation、Transformer弱贼。
(3)例子

1.6蒸苇、 Number
該元素定義了長度為8,16,24,32,或64位長度的二進制數(shù)吮旅。它是DataModel溪烤、Block或者Choice的子元素。
(1)屬性:
- Name---必須的庇勃。Number的名字檬嘀。
- Size---必須的。Number的大小责嚷,以位為單位鸳兽。有效值為1到64。
- Value---分配給Number的默認值罕拂。
- valueType---可選的揍异。value的表現(xiàn)方式。有效選項為string(字符串)和hex(十進制)爆班。
- Token---當(dāng)解析的時候衷掷,該元素被視為一個令牌,默認值為假柿菩。有效選項為真和假戚嗅。
- Endian---Number的字節(jié)順序。默認為小端枢舶。有效選項為大端渡处、小端和網(wǎng)絡(luò)。網(wǎng)絡(luò)一樣是大端祟辟。
- Signed---Number是否為有符號數(shù)據(jù)。默認為真侣肄。有效選項為真和假旧困。
- Constraint---一個以Python表達式為形式的約束。用于數(shù)據(jù)破解稼锅。
- Mutable---元素是否可改變(fuzzing時是否可變異)吼具,默認為真。有效選項為真和假矩距。
- minOccurs---Number必須發(fā)生改變的最小次數(shù)拗盒,默認為1。有效選項為正整數(shù)值锥债。
- maxOcuurs---Number能夠發(fā)生改變的最大次數(shù)陡蝇,沒有默認值痊臭。有效選項為正整數(shù)值。
(2)有效子元素:
- Anayzers登夫、Fixup广匙、Relation、Transformer恼策、Hint鸦致。
(3)例子:
有符號。為了表明這是一個無符號數(shù)據(jù)元素涣楷,設(shè)置signed屬性等于“false”分唾。默認為真。

Value類型狮斗。值類型定義了怎么解釋Value的屬性绽乔。有效選項為string和hex,默認為string情龄。將值1000分配給Hi5迄汛。

將43981以十六進制形式分配給Hi5。

小端骤视。為了改變Number的字節(jié)順序鞍爱,請設(shè)置endian屬性。

上圖將產(chǎn)生如下字節(jié)順序:AB CD专酗。

上圖將產(chǎn)生如下字節(jié)順序:CD AB睹逃。
1.7、Padding
Padding元素用來填充大小變化的塊或數(shù)據(jù)模型祷肯。
(1)屬性:
- Name---必須的沉填。Number元素的名字。
- Aligned---將父元素對齊到8字節(jié)邊界佑笋,默認為假翼闹。
- Alignment---對齊到這個位邊界,比如(8蒋纬、16等)猎荠,默認為8。
- alignedTo---基于我們要填充的元素名字蜀备。
- Lengthcalc---計算結(jié)果為整數(shù)的腳本表達式关摇。
- Constraint---一個以Python表達式形式的約束。用于數(shù)據(jù)破解碾阁。
- Mutable---元素是否可變異输虱,默認為真,有效選項為真和假脂凶。
(2)有效子元素:
- Fixup宪睹、Relation愁茁、Transformer、Hint横堡。
(3)例子:

1.8埋市、 String
該元素定義了一個單字節(jié)或者雙字節(jié)的字符串,它是DataModel或者Block的子元素命贴。為了指定這是一個數(shù)值的字符串道宅,請用 NumericalString元素。
(1)屬性:
- Name---可選的胸蛛,數(shù)據(jù)模型的名字污茵。
- Length---可選的,字符串的長度葬项。
- lengthType---可選的泞当,Length屬性的單位。
- Type---可選的民珍。字符編碼類型襟士,默認為“ASCII”,有效選項為ASCII嚷量、utf7陋桂、utf8、utf6蝶溶、utf6be嗜历、utf32。
- nullTerminated---可選的抖所。是否為以空字節(jié)結(jié)尾的字符串(真或者假)梨州。
- padCharacter---可選的。根據(jù)length參數(shù)填充字符串的字符田轧,默認為(0x00)暴匠。
- Token---可選的。當(dāng)解析的時候傻粘,該元素應(yīng)該被視為一個令牌巷查,默認為假。
- Constraint---一個腳本表達式形式的約束抹腿。用于數(shù)據(jù)破解。
- Mutable---可選的旭寿。元素是否可變異警绩,默認為真。
- Minoccurs---可選的盅称。這個塊必須發(fā)生改變的最小次數(shù)肩祥,默認為1后室。
- Maxoccurs---可選的。這個塊會發(fā)生改變的最大次數(shù)混狠,默認為1岸霹。
(2)有效子元素:
Analyzer、Fixup将饺、Relation贡避、Transformer、Hint予弧。
(3)NumericalString:

該元素只能用于String來說明它的值是一個數(shù)字刮吧。當(dāng)使用這個提示時,它激活所有的數(shù)字突變以及標準的字符串突變掖蛤。請注意:如果默認情況下一個字符串的值是數(shù)字杀捻,NumericalString元素被自動添加。

1.9蚓庭、 Relation
Peach允許構(gòu)建數(shù)據(jù)間的關(guān)系致讥。關(guān)系是類似這樣的東西“X是Y的大小”、“X是Y的數(shù)量”器赞、或者“X是y的偏移(字節(jié)單位)”垢袱。
(1)大小關(guān)系:

在這個例子中,我們將提供兩個python表達式拳魁,它允許在獲取或設(shè)置size屬性的時候修改它的大小惶桐,有兩個變量可用,分別為self和size潘懊。Self是Number元素的一個引用姚糊,size是一個整數(shù)。獲取操作和設(shè)置操作應(yīng)該是彼此的數(shù)學(xué)逆操作授舟。在破解過程中應(yīng)用獲取操作救恨,在發(fā)布過程中應(yīng)用設(shè)置操作。
expressionGet---該表達式的結(jié)果用于內(nèi)部释树,它確定名字為TheValue的String元素讀取多少字節(jié)肠槽。如果Peach取10,它將在內(nèi)部存儲一個5奢啥,然后Peach將讀取5個字節(jié)到String中秸仙。
ExpressionSet---為 publisher生成一個值。 在以下示例中桩盲,為TheValue存儲的Size的值“5”(TheValue的長度)寂纪,因此Peach通過publisher輸出的值將為“5 * 2”或10。

(2)數(shù)量關(guān)系:
在這個例子中,Number將會說明String列表的數(shù)目。

在這個例子中,我們將提供兩個python表達式碳却,它允許在獲取或設(shè)置size屬性的時候修改它的大小。有兩個變量可用庄涡,分別為self和count。Self是Number元素的一個引用搬设,count是一個整數(shù)穴店。這里的讓count可用與前面的表達式不同。雖然self在表達式對中始終可用焕梅,但其他可用的變量的名字是Relation元素type屬性的值迹鹅。
expressionGet---該表達式的結(jié)果用于內(nèi)部,它確定String元素將擴展到多少項贞言。maxOccurs 是Peach循環(huán)計算中遇到的最大值斜棚,由于maxOccurs = 1024的限制,Peach在CountIndicator元素中破解時遇到的最大值是2048该窗。
ExpressionSet---設(shè)置要生成的值弟蚀。 以下示例中,count根據(jù)讀入的String元素數(shù)目確定酗失。

(3)偏移關(guān)系:
todo
Todo
Fixup
Transformers
Placement