windbg做爲windows調試的神器。是查看內核某些結構體,挖掘漏洞,調試系統內核,調試驅動等必不可少的工具。可是因爲windbg命令衆多,界面友好程度較差,從而形成新人上手不易,望而卻步。本文拋磚引玉,從基礎入手,講解windbg。但願同做爲新人的咱們一塊兒進步!shell
注意:本文省略部分爲:1.如何加載系統符號。2.如何開啓雙機調試。由於這部分的內容,網絡上太多了。讀者可自行百度。可是請注意:這兩部分也是很重要的。windows
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就是咱們的程序入口點啦。.net
以後咱們輸入bl命令;能夠查看咱們下的斷點。debug
輸入g命令;g就是運行程序的意思。運行程序,程序就會停在咱們的程序入口點了,也就是oep。3d
但這依然不是咱們想要的。這下系統符號表的做用就體現出來了。雖然本程序加載的系統符號表是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系統有所幫助。在安全行業的道路上,但願你們共勉。