打造簡單的偵錯程式

2022-07-18 23:54:11 字數 3759 閱讀 6370

本文**:

0×1 概述

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

目前fuzzing工具各種各樣,監控器也有很多種,但大多都是以偵錯程式的方式實現。乙個簡單的監控器是這樣實現的:

(一)以除錯模式啟動程序,為目標程序開啟除錯埠,可使用引數debug_only_this_process,意為只除錯本程序,更多說明請參照msdn。

(二)等待除錯事件,當程序內部發生除錯事件時,通過除錯埠向偵錯程式傳送事件。除錯事件不僅僅指異常事件,建立程序、執行緒、載入庫這些都是除錯事件,異常事件是exception_debug_event。

(三)處理除錯事件,對應不同的除錯事件,可作不同處理,若不感興趣,可通過continuedebugevent來忽略。偵錯程式可對目標程序的操作具有較高的許可權,可自由讀取、修改目標程序的暫存器、記憶體資訊,我們所使用最多的偵錯程式,像windbg、vcdebugger、ollydbg等,也是從這些簡單的函式實現而成的。

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整合實現而成,且支援強大的核心除錯功能。

功能比較強大的偵錯程式,與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。

python的偵錯程式 Python 偵錯程式入門

python 生態系統包含豐富的工具和庫,可以讓開發人員更加舒適。例如,我們之前已經介紹了如何使用互動式 shell 增強 python。本文重點介紹另一種可以節省時間並提高 python 技能的工具 python 偵錯程式。python 偵錯程式 python 標準庫提供了乙個名為 pdb 的偵錯...

常見偵錯程式

工欲善其事,必先利其器 在進行軟體除錯或者逆向工程時,我們需要很多輔助工具,其中偵錯程式是最重要的工具之一。根據除錯物件偵錯程式分類為使用者態和核心態。使用者態偵錯程式只能除錯環3 ring3 許可權的應用程式,大多數應用程式均屬於此類程式。核心態偵錯程式能除錯環0 ring0 許可權的應用程式,驅...

GDB偵錯程式

偵錯程式gdb 一 啟動和退出gdb gdb除錯的物件是可執行檔案,而不是程式的源 如果要使乙個可執行檔案可以被gdb除錯,那麼在使用編譯器gcc編譯程式時需要加入 g選項。gdb除錯乙個程式的命令格式是 gdb 程式檔名 也可以在linux提示符下,直接輸入gdb,然後使用file命令裝入要除錯的...