本文轉自:http://www.freebuf.com/sectool/92279.htmlhtml
0×1 概述python
在Fuzzing過程當中,必需要監控程序的執行狀態,若程序發生異常,當即保存測試用例,以便未來對其進行重現。監控器的做用就是監控程序的執行,若是程序有異常時通知給Fuzzing主線程。git
目前Fuzzing工具各類各樣,監控器也有不少種,但大多都是以調試器的方式實現。一個簡單的監控器是這樣實現的:github
(一)以調試模式啓動進程,爲目標進程開啓調試端口,可以使用參數DEBUG_ONLY_THIS_PROCESS,意爲只調試本進程,更多說明請參照MSDN。編程
(二)等待調試事件,當進程內部發生調試事件時,經過調試端口向調試器發送事件。調試事件不只僅指異常事件,建立進程、線程、加載庫這些都是調試事件,異常事件是EXCEPTION_DEBUG_EVENT。app
(三)處理調試事件,對應不一樣的調試事件,可做不一樣處理,若不感興趣,可經過ContinueDebugEvent來忽略。調試器可對目標進程的操做具備較高的權限,可自由讀取、修改目標進程的寄存器、內存信息,咱們所使用最多的調試器,像Windbg、VCDebugger、OllyDbg等,也是從這些簡單的函數實現而成的。框架
一個簡單的HelloWorld例子位於codeproject,對這方面不太瞭解的朋友能夠下載看看。函數
0×2 不一樣的調試器接口工具
固然,在實際工程中,咱們不必都從hello world開始寫起,有不少的調試器接口已經被完善,方便咱們直接調用,接下來隨便舉幾個常見調試器的例子。測試
(1)ImmLib
一個集成在Immunity Debugger的Python庫,但僅能在Immunity Debugger中調用。若寫Immunity Debugger的插件時,將是不錯的選擇。
(2)vtrace
Vtrace是一款支持不一樣平臺的調試器,一樣也是使用Python編寫而成。
(3)OllyPython
OllyPython使用Python編寫而成,是OllyDbg的插件,也僅能在OD內使用。
(4)PyDbg
你們對PyDbg應該都很熟悉,在python灰帽子裏有大幅的介紹與應用,但僅能用兼容Python2.4和2.5。
(5)PyDbgEng
PyDbgEng與Windbg集成實現而成,且支持強大的內核調試功能。
(6)WinAppDbg
功能比較強大的調試器,與PydbgEng類似,但採用純原生Win32 API實現而成,不依賴於任何調試器。
(7)PyDbgExt
與PyDbgEng相反,PyDbgEng是經過Python實例化調試器引擎,而它是在調試器中添加Python解釋器,在Windbg中使用。
(8)pygdb
Pygdb是一個簡單的GNU調試器的封裝,提供GTK的接口,可在Linux與OSX下運行。
(9)PyKd
PyKd有點像將PyDbgEng與PyDbgExt混合到一塊兒,可在調試器中調用,也可獨立使用,有較大潛力的調試器。
(10)PyMem
PyMem是使用Python編寫的Windows上的一個內存插裝庫。
(11)python-ptrace
python-ptrace調用ptrace實現而成,僅能在POSIX系統上運行,如BSD、Linux。
(12)PythonGdb
PythonGdb 是一個嵌入到GDB中的一個Python解釋器。
(13)Radare
Radare是一個控制檯程序,支持多平臺的反彙編、調試框架。
(14)Universal Hooker (uhooker)
Uhooker實現了函數Hook的Python庫,但較長時間未更新。
0×三、實現本身的調試監控器
介紹了這麼多的調試器接口,有輕量級的、有支持內核調試的、有支持Linux的、有內嵌到調試器中的,總有一款適合你的實際須要。使用它們也很是簡單,只須要基本的編程知識便可。通常實現過程都是實例化一個調試器,而後啓動目標進程,並開啓事件來監聽,若是發生異常,事件被激活,處理調試事件便可。
給我印象比較深入的是Peach的監控器,它經過Pit的配置後,啓動一個本地或遠程的Agent的,而後由Agent來監控目標進程的異常狀況。當發生異常後,除了保存樣本操做外,還會生成StackTrace,記錄寄存器、調用棧,調用MSEC生成可利用性的報告,並根據exploitable提供的信息命名、分類、去重。基本上對後期分析有點價值的信息都被記錄了,是一種比較好的方案。理所固然,重用它的代碼就行。
Peach的結構很簡單,經過Peach.py調用engine.run,在run中進行一系列初始化後,調用_runTest開始測試。建立了一個agent的實例用來監控目標程序,建立了一個watcher的實例用來記錄異常信息。
Debugger.py中包含了兩個調試器接口類,一個是WindowsDebugEngine,用來與Windbg交互,支持Windows操做系統,另外一個是UnixDebugger,使用Vtrace實現而成,支持POSIX系統。POSIX系統暫時不感興趣,把這部分代碼先刪除掉。
WindowsDebugEngine的構造函數中,首先對從pit文件中傳進來的參數進行解析,這部分代碼也不須要,刪除修改。而後調用_StartDebugger來啓動調試器,開啓WindowsDebugEngineProcess_run的線程,調用PyDbgEng.ProcessCreator或PyDbgEng.ProcessAttacher來啓動或附着到目標進程上,並註冊調試事件處理器_DbgEventHandler,當異常事件發生後,在_DbgEventHandler中輸出寄存器、調用棧、exploitable信息。
對這個流程理解後,修改它就只是簡單的工程了,添加了一個新類DebuggerMonitor做爲代理,來處理用戶的參數與DebugEngine之間的交互。
使用起來很簡單,這是一個簡單例子:
運行結果以下,看到了很舒服的命名方式:
StackTrace中保存的內容以下:
DebuggerMonitor類的構造函數接受兩個參數,分別是啓動程序的命令行,及保存異常信息的目錄。經過調用getLogDir來獲得當前異常信息保存的目錄,方便用戶保存測試用例。
在使用前須要四個依賴模塊,分別是psutils、comtypes、pywin3二、pydbgengine。
下一步工做:還須要添加PageHeap的支持、添加服務、內核等監控接口,讀者若須要可自行添加。