什么是模糊測試 模糊測試(Fuzzing),是一種通過(guò)向目標系統提供非預期的輸入并監視異常結果來(lái)發(fā)現軟件漏洞的方法。測試的基本思想就是通過(guò)向程序中輸入大量的隨機數據,然后觀(guān)察輸入這些數據之后程序的情況,記錄下使程序發(fā)生異常的數據,從而判斷程序是在那些地方發(fā)生了異常。 模糊測試的實(shí)現是一個(gè)非常簡(jiǎn)單的過(guò)程: 1. 準備一份插入程序中的正確的文件。 2. 用隨機數據替換該文件的某些部分。 3. 用程序打開(kāi)文件。 4. 觀(guān)察破壞了什么。 Peachfuzzer Peachfuzzer 是一款先進(jìn)的且可擴展的安全測試平臺,這款軟件適用于軟件測試人員企業(yè)的安全保證團隊,以及測試實(shí)驗室用來(lái)自動(dòng)的發(fā)現軟件的脆弱性和軟件的突變的應對方法。
Peachfuzzer is an advanced and extensible security testing platform. This software enables software testers, enterprise quality assurance teams, and testing labs to find vulnerabilities in software using automated generative and mutational methods. Peach-pit Peach所使用的Peach Pit文件包含了以下5個(gè)模塊: GeneralConf DataModel StateModel Agents and Monitors Test and Run Configuration 下面分別介紹這5個(gè)模塊的定義方法,并完成一個(gè)簡(jiǎn)單的HelloWorld程序。 題外話(huà):在這之前,我們需要準備一個(gè)好用的XML文件編輯器,Visual Studio,Open XML Editor或者Notepad++都是不錯的選擇。這里我使用的是Notepad++,它集成了數十種語(yǔ)言的語(yǔ)法著(zhù)色方案,并且,它安裝完后只有10MB左右。 首先,我們先搭好一個(gè)XML框架,下面要寫(xiě)的所有元素都要被包含在根元素<Peach>里。
其中,Peach元素的各個(gè)屬性基本是固定的,不要輕易改動(dòng)。 (1)GeneralConf GeneralConf是Peach Pit文件的第一部分,用來(lái)定義基本配置信息。具體來(lái)說(shuō),包括以下三種元素。 Include:要包含的其他Peach Pit文件。 Import:要導入的python庫。 PythonPath:要添加的python庫的路徑。 要注意的是,所有的Peach Pit文件都要包含default.xml這個(gè)文件。 在HelloWorld中,GerneralConf部分只需寫(xiě)入如下內容。
(2)DataModel DataModel元素用來(lái)定義數據模型,包括數據結構和數據關(guān)系等。一個(gè)Peach Pit文件中需要包含一個(gè)或者多個(gè)數據模型。DataModel可以定義的幾種常用的數據類(lèi)型如下。 String:字符串型。 Number:數據型。 Blob:無(wú)具體數據類(lèi)型。 Block:用于對數據進(jìn)行分組。 比如:
要注意的是,size的單位是bit。上面的例子中,”ID”的”size”為32,表示”ID”的長(cháng)度為4字節(1 byte = 8 bits),剛好它的值”RIFF”也是4個(gè)字節。 在HelloWorld程序中,僅定義一個(gè)值為”Hello World!”的String類(lèi)型數據。
(3)StateModel StateModel元素用于描述如何向目標程序發(fā)送/接收數據。StateModel由至少一個(gè)State組成,并且用initialState指定第一個(gè)State;每個(gè)State由至少一個(gè)Action組成,Action用于定義StateModel中的各種動(dòng)作,動(dòng)作類(lèi)型由type來(lái)指定。Action支持的動(dòng)作類(lèi)型包括start、stop、open、close、input、output、call等。下面是一個(gè)例子:
上例中,第一個(gè)Action描述了一個(gè)輸入型動(dòng)作,表示按照數據模型InputModel產(chǎn)生數據并作為輸入數據;第二個(gè)Action描述了一個(gè)輸出型動(dòng)作,表示按照數據模型SomeDataMode產(chǎn)生數據并輸出到文件sample.bin中;第三個(gè)Action描述了一個(gè)調用動(dòng)作,表示調用函數DoStuff,并且將按照數據模型Param1DataModel產(chǎn)生的數據作為函數DoStuff的參數;第四個(gè)Action描述了一個(gè)關(guān)閉程序的動(dòng)作。 當代碼中存在多個(gè)Action時(shí),則從上至下依次執行。 在HelloWorld程序中,我們只需要接收數據模型”HelloWorldTemplate“中的數據,所以寫(xiě)出如下的StateModel。
(4)Agent Agent元素用于定義代理和監視器,可以用來(lái)調用WinDbg等調試器來(lái)監控程序運行的錯誤信息等。一個(gè)Peach Pit文件可以定義多個(gè)Agent,每個(gè)Agent下可以定義多個(gè)Monitor。下面是一個(gè)例子:
上例中,第一個(gè)Monitor類(lèi)型為debugger.WindowsDebugEngine,是調用WinDbg來(lái)執行下面的”notepad.exe filename”命令的。第二個(gè)Monitor類(lèi)型為process.PageHeap,意思是為notepad.exe開(kāi)啟頁(yè)堆調試(Page Heap Debug),這在大多數Windows Fuzzing中都是很有用的。 在HelloWorld程序中,我們不需要啟用WinDbg調試,所以無(wú)需配置Agent。 (5)Test and Run configuration 在Peach Pit文件中,Test and Run configuration 包括 Test 和 Run 兩個(gè)元素。 Test元素用來(lái)定義一個(gè)測試的配置,包括一個(gè)StateModel和一個(gè)Publisher,以及includeing/excluding、Agent信息等。其中StateModel和Publisher是必須定義的,其他是可選定義的。下面是一個(gè)Test配置的例子。
先對Publisher做一下介紹。Publisher用來(lái)定義Peach的IO連接,可以構造網(wǎng)絡(luò )數據流(如TCP,UDP,HTTP)和文件流(如FileWriter,FileReader)等。上例中的Publisher定義表示將生成的畸形數據寫(xiě)到FuzzedFile文件中。 在HelloWorld程序中,需要做的僅僅是把生成的畸形數據顯示到命令行,所以Publisher用的是標準輸出stdout.Stdout。
現在到了最后一步,Run的配置。Run元素用來(lái)定義要運行哪些測試,包含一個(gè)或多個(gè)Test,另外還可以通過(guò)Logger元素配置日志來(lái)捕獲運行結果。當然,Logger也是可選的。
上例表示程序運行”TheTest”這個(gè)測試,并且把運行日志記錄到C:\peach\logtest目錄下。 在HelloWorld程序中,只需要在Run配置中放入之前定義好的HelloWorldTest就可以了。
示例測試過(guò)程 下面我們就最簡(jiǎn)單的測試程序為例,來(lái)講解一下用peach進(jìn)行模糊測試的基本過(guò)程。 我們所用的peach-pit文件是helloworld.xml文件,它在打印輸出helloworld字符串之后會(huì )自動(dòng)的生成很多的變種字符串,包括超長(cháng)串和null缺失的非法串等,幾乎只要是可以造成程序出錯的串都會(huì )涉及到。 以下是完整的代碼:
然后運行以上pit文件。
|
||||||||||||
原文轉自:http://www.uml.org.cn/Test/201910303.asp