Windbg入門講解

天府雲創發表於2017-08-14
Windbg是在windows平臺下,強大的使用者態和核心態除錯工具。相比較於Visual Studio,它是一個輕量級的除錯工具,所謂輕量級指的是它的安裝檔案大小較小,但是其除錯功能,卻比VS更為強大。它的另外一個用途是可以用來分析dump資料。
外文名
WinDbg
性    質
計算機
類    別
核心態除錯工具
平    臺
windows

目錄

主要功能

編輯
Windbg是Microsoft公司免費偵錯程式除錯集合中的GUI的偵錯程式,支援Source和Assembly兩種模式的除錯。Windbg不僅可以除錯應用程式,還可以進行Kernel Debug。結合Microsoft的Symbol Server,可以獲取系統符號檔案,便於應用程式和核心的除錯。Windbg支援的平臺包括X86、IA64、AMD64。
雖然windbg也提供圖形介面操作,但它最強大的地方還是有著強大的除錯命令,一般情況會結合GUI和命令列進行操作,常用的檢視有:區域性變數、全域性變數、呼叫棧、執行緒、命令、暫存器、白板等。其中“命令”檢視是預設開啟的。

常用命令

編輯
初學者可以通過熟悉一些常用的除錯命令開始[1-2]  ,下面簡單介紹常用的命令:
檢視版本資訊:version、vertarget
檢視模組資訊:lm、!dlls、!lmvi等
呼叫棧:用k命令顯示呼叫棧,用.frames命令切換棧幀
記憶體操作:讀記憶體用d命令,寫記憶體用e命令
自動分析:!analyze、!owner等
符號命令:.reload載入符號, .sympath設定符號路徑, !sym設定符號選項
程式執行緒:!process顯示程式資訊; .process顯示當前程式,或用.process /i 切換當前程式;!peb顯示程式環境塊內容;~命令顯示執行緒列表,用~s可切換當前執行緒,n表示執行緒號;.thread顯示當前執行緒。

windbg作為windows除錯的神器。是檢視核心某些結構體,挖掘漏洞,除錯系統核心,除錯驅動等必不可少的工具。但是由於windbg命令眾多,介面友好程度較差,從而造成新人上手不易,望而卻步。本文拋磚引玉,從基礎入手,講解windbg。希望同作為新人的我們一起進步!

注意:本文省略部分為:1.如何載入系統符號。2.如何開啟雙機除錯。因為這部分的內容,網路上太多了。讀者可自行百度。但是請注意:這兩部分也是很重要的。

0×1 程式程式碼

為了整體掌握windbg的除錯流程。本文例項採用自己編寫。好處是可以更為主動的熟悉windbg的除錯命令,更加直觀的檢視windbg的顯示結果。

Windbg入門實戰講解

0×2 windbg除錯入口

開啟windbg,點選:File->Open Executable,選中編譯好的exe檔案。Windbg會自動給程式下一個斷點。但是我們不知道這個斷點是否屬於我們程式的區域。所以,我們先要看下,斷點是斷在了什麼地方。我們在windbg命令中輸入!address 斷點地址。如下圖所示:

Windbg入門實戰講解

圖中不僅僅顯示了斷點所在的“領空區域”,還顯示了一些檔案的其他屬性。由於此時的斷點不再我們需要的領空,所以下面要使用上文提過的偽暫存器了。我們在windbg中輸入:bp $exentry。也可以輸入bp @$exentry。@的作用是讓windbg不再去尋找系統符號,從而加快了執行速度。Bp呢,我們依舊可以看下windbg的幫助文件。從中,我們可以知道,bp就是給地址下一個斷點。好讓程式中斷下來。那$exentry又是什麼呢?我們可以在Help->Content點選索引,輸入:pseudo檢視。$exentry就是我們的程式入口點啦。

Windbg入門實戰講解

之後我們輸入bl命令;可以檢視我們下的斷點。

Windbg入門實戰講解

輸入g命令;g就是執行程式的意思。執行程式,程式就會停在我們的程式入口點了,也就是oep。

但這依然不是我們想要的。這下系統符號表的作用就體現出來了。雖然本程式載入的系統符號表是vs2015debug時候自動生成的,但是這個系統符號表與從微軟下載的系統符號表的作用是一樣的。

我們在windbg中輸入:bp main;就這麼簡單。注意:這個符號表是利用的本地符號表。輸入g命令;windbg會自動給我們斷在main函式中。

Windbg入門實戰講解

Windbg入門實戰講解

G命令結束後,這裡我們需要注意一下:點選windbg工具條的Source mode off。當Souce mode on的時候,debug的單步命令會直接按照函式的步驟執行,而不是從真正單步彙編命令,這點上大家可以嘗試切換不同的開關。具體執行如下圖所示:

0×3重點命令

1)   棧內容檢視

這裡很重要的一點是:本程式是為了體會windbg的流程和指令。所以,不會迴避原始碼的顯示問題。我們單步到程式的第一個call函式中,可以用F8或者F11步入其中。輸入命令:kv。或者點選View->Call Stack檢視。此時,我們可以看到棧中的資訊是一樣的。從中,我們也可以看出kv就是顯示堆疊詳細資訊的命令啦。k命令在windows漏洞挖掘,瞭解windows執行過程中是非常有用的命令之一。

Windbg入門實戰講解

從下圖中,我們也可以看到kv命令後,001218a7正是第一個call函式的返回地址。00000001和00000002正是傳遞給f_add的引數。在CVE漏洞號碼驗證的程式中,經常看到大神門檢視棧資訊就是如此。而ChildEBP資訊是什麼呢?如下圖所示,通過圖所示看到:ChildEBP原來就是子函式棧基址的指標地址啦。RetAddr 就是返回的函式地址,Args to Child 就是顯示的引數啦。

Windbg入門實戰講解

Windbg入門實戰講解

2)字串的檢視

繼續F10,執行完第一個call函式後,windbg顯示了一個‘string’的字元。那麼想要知道這個字元是什麼呢?怎麼檢視呢?我們這裡使用了db命令,就是以byte的形式顯示記憶體資料。Dd命令就沒有後面的字串啦,比較單調,讀者可以自己嘗試。

Windbg入門實戰講解

我們執行到四個引數的f_add函式中去,kb檢視棧的資訊,此時,發現Args to child只能顯示3個引數,如果有多個引數怎麼辦呢?可以使用kp或者kP命令,他們的結果是一樣的,知識換行與否。結果如下圖所示:

Windbg入門實戰講解

3)結構檢視

假如我們不知道st_m的結構,想要產看一下st_m的結構是什麼,可以使用 dt st_m;可以看到如下結果。3個int型別,每個佔用4位元組。

Windbg入門實戰講解

有了這些知識,我們就可以簡單的進行一些windows的除錯;不信,看下面的例子。

0×4 Windows雙機除錯(實戰)

此次利用的漏洞來源:www.exploit-db.com 屬於SEH Buffer Overflow型別。

執行前:

Windbg入門實戰講解

執行後:

Windbg入門實戰講解

1)尋找指定程式和附加

開啟wavtomp3這個軟體。我們通過.process 0 0命令,檢視XP中執行的程式。然後找到指定程式後,通過.process /i 程式地址。切換到實際需要的程式中去。切換後;記得‘g’執行下。

Windbg入門實戰講解

2)尋找適合的斷點

合適的斷點在許多的除錯中很重要,斷點需要經驗的積累和技術的積累。沒有一招吃遍天下的斷點。本文因為是SHE的緩衝區溢位。並且在使用者層觸發異常,所以這裡我們直接可以下斷:bp RtlpExecuteHandlerForException。也可以求穩一點;給ReadFile函式下斷點: bp ReadFile 。但是請注意:一定要.reload /f下函式的符號表。否則斷點不一定成功。下斷後如下圖所示:

Windbg入門實戰講解

3)分析程式碼

執行程式後;可以斷在RtlDisPatchException部分函式內。通過r命令,檢視暫存器,通過db檢視記憶體位元組。例如想檢視esp暫存器的值,只需要:dd esp即可。如下圖所示:

圖中dex的數值是shellcode文字的長度。Eip已經已經指向了異常部分。Esp指向的是棧頂。通過db esp-100 L200檢視了從esp這個地址從上往下的

0×200單位的位元組。

Windbg入門實戰講解

單步執行下去(F10)。遇到第一個call;圖中跟入如下圖:

Windbg入門實戰講解

上圖中,executehandler2()函式傳遞了5個引數。而shellcode執行就在executehandler2()中的call ecx。我們利用命令觀看:dd 0104fb24地址中的第一個引數就是我們要的執行函式的地址。也是_EXCEPTION_REGISTRATION_RECORD結構的Handler回撥函式地址 。

見下圖: 圖中通過!exchain檢視了異常的地址。通過!slist $teb _EXCEPTION_REGISTRATION_RECORD檢視了當前異常鏈的內容。從下圖也能證明,異常鏈的Handler是回撥函式。

Windbg入門實戰講解

繼續單步跟入(F8),我們發現這裡其實要彈出一個Messagebox的異常對話方塊的。內容如下:

Windbg入門實戰講解

繼續單步,就會jmp到shellcode的內容了。或者我們可以用通過一種結構來觀察。此時在windbg中,輸入!teb;可以看到目前的teb結構目前的值。Dt  _NT_TIB又可以觀察到nt_tib內部結構。

Windbg入門實戰講解

Windbg入門實戰講解

通過上下圖對比,可以看到圖中我們的shellcode:0x909006eb和0x004043a4就是覆蓋了fs:[0],分別指向了下一個異常塊和本次的回撥函式。所以上文有一個call ecx,其實是call 0x004043a4。已經指向了我們想要的東西。

Windbg入門實戰講解

下面這個圖;已經是我們想要執行的指令的程式碼了。三個部分的程式碼都是一樣的。

Windbg入門實戰講解

4)結束語

本文主要強調對windbg的除錯操作命令做說明。對日後如何除錯windows系統有所幫助。在安全行業的道路上,希望大家共勉。



相關文章