Windbg入門講解
- WinDbg
- 計算機
- 核心態除錯工具
- windows
目錄
windbg作為windows除錯的神器。是檢視核心某些結構體,挖掘漏洞,除錯系統核心,除錯驅動等必不可少的工具。但是由於windbg命令眾多,介面友好程度較差,從而造成新人上手不易,望而卻步。本文拋磚引玉,從基礎入手,講解windbg。希望同作為新人的我們一起進步!
注意:本文省略部分為:1.如何載入系統符號。2.如何開啟雙機除錯。因為這部分的內容,網路上太多了。讀者可自行百度。但是請注意:這兩部分也是很重要的。
0×1 程式程式碼
為了整體掌握windbg的除錯流程。本文例項採用自己編寫。好處是可以更為主動的熟悉windbg的除錯命令,更加直觀的檢視windbg的顯示結果。
0×2 windbg除錯入口
開啟windbg,點選:File->Open Executable,選中編譯好的exe檔案。Windbg會自動給程式下一個斷點。但是我們不知道這個斷點是否屬於我們程式的區域。所以,我們先要看下,斷點是斷在了什麼地方。我們在windbg命令中輸入!address 斷點地址。如下圖所示:
圖中不僅僅顯示了斷點所在的“領空區域”,還顯示了一些檔案的其他屬性。由於此時的斷點不再我們需要的領空,所以下面要使用上文提過的偽暫存器了。我們在windbg中輸入:bp $exentry。也可以輸入bp @$exentry。@的作用是讓windbg不再去尋找系統符號,從而加快了執行速度。Bp呢,我們依舊可以看下windbg的幫助文件。從中,我們可以知道,bp就是給地址下一個斷點。好讓程式中斷下來。那$exentry又是什麼呢?我們可以在Help->Content點選索引,輸入:pseudo檢視。$exentry就是我們的程式入口點啦。
之後我們輸入bl命令;可以檢視我們下的斷點。
輸入g命令;g就是執行程式的意思。執行程式,程式就會停在我們的程式入口點了,也就是oep。
但這依然不是我們想要的。這下系統符號表的作用就體現出來了。雖然本程式載入的系統符號表是vs2015debug時候自動生成的,但是這個系統符號表與從微軟下載的系統符號表的作用是一樣的。
我們在windbg中輸入:bp main;就這麼簡單。注意:這個符號表是利用的本地符號表。輸入g命令;windbg會自動給我們斷在main函式中。
G命令結束後,這裡我們需要注意一下:點選windbg工具條的Source mode off。當Souce mode on的時候,debug的單步命令會直接按照函式的步驟執行,而不是從真正單步彙編命令,這點上大家可以嘗試切換不同的開關。具體執行如下圖所示:
0×3重點命令
1) 棧內容檢視
這裡很重要的一點是:本程式是為了體會windbg的流程和指令。所以,不會迴避原始碼的顯示問題。我們單步到程式的第一個call函式中,可以用F8或者F11步入其中。輸入命令:kv。或者點選View->Call Stack檢視。此時,我們可以看到棧中的資訊是一樣的。從中,我們也可以看出kv就是顯示堆疊詳細資訊的命令啦。k命令在windows漏洞挖掘,瞭解windows執行過程中是非常有用的命令之一。
從下圖中,我們也可以看到kv命令後,001218a7正是第一個call函式的返回地址。00000001和00000002正是傳遞給f_add的引數。在CVE漏洞號碼驗證的程式中,經常看到大神門檢視棧資訊就是如此。而ChildEBP資訊是什麼呢?如下圖所示,通過圖所示看到:ChildEBP原來就是子函式棧基址的指標地址啦。RetAddr 就是返回的函式地址,Args to Child 就是顯示的引數啦。
2)字串的檢視
繼續F10,執行完第一個call函式後,windbg顯示了一個‘string’的字元。那麼想要知道這個字元是什麼呢?怎麼檢視呢?我們這裡使用了db命令,就是以byte的形式顯示記憶體資料。Dd命令就沒有後面的字串啦,比較單調,讀者可以自己嘗試。
我們執行到四個引數的f_add函式中去,kb檢視棧的資訊,此時,發現Args to child只能顯示3個引數,如果有多個引數怎麼辦呢?可以使用kp或者kP命令,他們的結果是一樣的,知識換行與否。結果如下圖所示:
3)結構檢視
假如我們不知道st_m的結構,想要產看一下st_m的結構是什麼,可以使用 dt st_m;可以看到如下結果。3個int型別,每個佔用4位元組。
有了這些知識,我們就可以簡單的進行一些windows的除錯;不信,看下面的例子。
0×4 Windows雙機除錯(實戰)
此次利用的漏洞來源:www.exploit-db.com 屬於SEH Buffer Overflow型別。
執行前:
執行後:
1)尋找指定程式和附加
開啟wavtomp3這個軟體。我們通過.process 0 0命令,檢視XP中執行的程式。然後找到指定程式後,通過.process /i 程式地址。切換到實際需要的程式中去。切換後;記得‘g’執行下。
2)尋找適合的斷點
合適的斷點在許多的除錯中很重要,斷點需要經驗的積累和技術的積累。沒有一招吃遍天下的斷點。本文因為是SHE的緩衝區溢位。並且在使用者層觸發異常,所以這裡我們直接可以下斷:bp RtlpExecuteHandlerForException。也可以求穩一點;給ReadFile函式下斷點: bp ReadFile 。但是請注意:一定要.reload /f下函式的符號表。否則斷點不一定成功。下斷後如下圖所示:
3)分析程式碼
執行程式後;可以斷在RtlDisPatchException部分函式內。通過r命令,檢視暫存器,通過db檢視記憶體位元組。例如想檢視esp暫存器的值,只需要:dd esp即可。如下圖所示:
圖中dex的數值是shellcode文字的長度。Eip已經已經指向了異常部分。Esp指向的是棧頂。通過db esp-100 L200檢視了從esp這個地址從上往下的
0×200單位的位元組。
單步執行下去(F10)。遇到第一個call;圖中跟入如下圖:
上圖中,executehandler2()函式傳遞了5個引數。而shellcode執行就在executehandler2()中的call ecx。我們利用命令觀看:dd 0104fb24地址中的第一個引數就是我們要的執行函式的地址。也是_EXCEPTION_REGISTRATION_RECORD結構的Handler回撥函式地址 。
見下圖: 圖中通過!exchain檢視了異常的地址。通過!slist $teb _EXCEPTION_REGISTRATION_RECORD檢視了當前異常鏈的內容。從下圖也能證明,異常鏈的Handler是回撥函式。
繼續單步跟入(F8),我們發現這裡其實要彈出一個Messagebox的異常對話方塊的。內容如下:
繼續單步,就會jmp到shellcode的內容了。或者我們可以用通過一種結構來觀察。此時在windbg中,輸入!teb;可以看到目前的teb結構目前的值。Dt _NT_TIB又可以觀察到nt_tib內部結構。
通過上下圖對比,可以看到圖中我們的shellcode:0x909006eb和0x004043a4就是覆蓋了fs:[0],分別指向了下一個異常塊和本次的回撥函式。所以上文有一個call ecx,其實是call 0x004043a4。已經指向了我們想要的東西。
下面這個圖;已經是我們想要執行的指令的程式碼了。三個部分的程式碼都是一樣的。
4)結束語
本文主要強調對windbg的除錯操作命令做說明。對日後如何除錯windows系統有所幫助。在安全行業的道路上,希望大家共勉。
相關文章
- Flutter中的Image入門講解Flutter
- webpack技術講解及入門Web
- 格鬥遊戲新手入門 - 術語講解遊戲
- .NET高階除錯系列-Windbg除錯入門篇高階除錯
- docker 入門講解 - 構建本地環境Docker
- 【LaTeX入門】02、CJK環境講解
- Spring入門(七):Spring Profile使用講解Spring
- web前端開發教程,最全JavaScript入門講解Web前端JavaScript
- webpack4.x最詳細入門講解Web
- VUE_入門講義Vue
- Redis 入門 - 安裝最全講解(Windows、Linux、Docker)RedisWindowsLinuxDocker
- 單例模式入門講解C++和Qt5單例模式C++QT
- 千鋒長沙Java培訓:鴻蒙系統入門講解Java鴻蒙
- XGBoost入門系列第一講
- Promise入門到精通(初級篇)-附程式碼詳細講解Promise
- Java教程學習入門影片原始碼課件:JVM調優講解Java原始碼JVM
- 【目標檢測從放棄到入門】SSD / RCNN / YOLO通俗講解CNNYOLO
- 雲端計算教程學習入門影片課件:Load Balance講解
- C# 入門深度學習:萬字長文講解微積分和梯度下降C#深度學習梯度
- 學渣講爬蟲之Python爬蟲從入門到出門(第三講)爬蟲Python
- 演算法講堂一:博弈論入門演算法
- 詳細講述Oracle RAC入門和提高Oracle
- windbg分析dump-解決mscorwks不匹配
- PHP 安全問題入門:10 個常見安全問題 + 例項講解PHP
- 入門 | Tensorflow實戰講解神經網路搭建詳細過程神經網路
- Maven例項講解教程,從零開始學Maven,帶你快速入門!Maven
- 一看就明白的爬蟲入門講解:基礎理論篇爬蟲
- 詳解HDFS入門
- Maven入門詳解Maven
- 原創:spring入門介紹第一講Spring
- 大資料工程師分散式思維入門與面試真題講解大資料工程師分散式面試
- Python廖雪峰13個案例講解分析帶你全面入門人工智慧Python人工智慧
- 一看就明白的爬蟲入門講解:基礎理論篇(上篇)爬蟲
- 一看就明白的爬蟲入門講解:基礎理論篇(下篇)爬蟲
- WinDbg 解決Font.ToLogFont AccessViolationExcetion
- 漸進式載入 - 基礎講解
- jQuery心得1--jQuery入門知識串講1jQuery
- jQuery心得3--jQuery入門知識串講2jQuery