打造一款簡單的調試監控器

jopen 8年前發布 | 33K 次閱讀 Python 操作系統

0×1 概述

在Fuzzing過程中,必須要監控程序的執行狀態,若程序發生異常,立即保存測試用例,以便將來對其進行重現。監控器的作用就是監控程序的執行,如果程序有異常時通知給Fuzzing主線程。

目前Fuzzing工具各種各樣,監控器也有很多種,但大多都是以調試器的方式實現。一個簡單的監控器是這樣實現的:

(一)以調試模式啟動進程,為目標進程開啟調試端口,可使用參數DEBUG_ONLY_THIS_PROCESS,意為只調試本進程,更多說明請參照MSDN。

(二)等待調試事件,當進程內部發生調試事件時,通過調試端口向調試器發送事件。調試事件不僅僅指異常事件,創建進程、線程、加載庫這些都是調試事件,異常事件是EXCEPTION_DEBUG_EVENT。

(三)處理調試事件,對應不同的調試事件,可作不同處理,若不感興趣,可通過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×3、實現自己的調試監控器

介紹了這么多的調試器接口,有輕量級的、有支持內核調試的、有支持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、pywin32、pydbgengine。

下一步工作:還需要添加PageHeap的支持、添加服務、內核等監控接口,讀者若需要可自行添加。

源碼鏈接: http://pan.baidu.com/s/1dEtSSq1 密碼: 22mx

*作者:MJX(CNNVD),轉載請注明來自FreeBuf黑客與極客(FreeBuf.COM)

來自: http://www.freebuf.com/tools/92279.html

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!