1. 程式人生 > >緩沖區溢出實戰教程系列(三):利用OllyDbg了解程序運行機制

緩沖區溢出實戰教程系列(三):利用OllyDbg了解程序運行機制

成了 代碼段 下界 urn 方便 htm oca 相差 14.

想要進行緩沖區溢出的分析與利用,當然就要懂得程序運行的機制。今天我們就用動態分析神器ollydbg來了解一下在windows下程序是如何運行的。

戳這裏看之前發布的文章:

緩沖區溢出實戰教程系列(一):第一個緩沖區溢出小程序:https://www.freebuf.com/articles/system/195614.html

緩沖區溢出實戰教程系列(二):dev c++編譯匯編代碼:https://www.freebuf.com/articles/system/197116.html

0×00 OD基本介紹及用法

1. OD界面

我們將程序拖入OD中,會出現如下界面,在這裏我分為四個主要區塊,分別是匯編代碼窗口、寄存器窗口、二進制窗口、堆棧窗口。當然也有分為五個區塊的,但沒有太大區別。接下來我給大家講講有個基本概念。等下在程序分析裏給大家具體做講解。

技術分享圖片

2. OD常用操作

F2:設置斷點

F4與F9:F4是運行到光標位置,F9是運行到斷點處

F7與F8:F7是單步步入,F8是單步步進

Ctrl+F9:是從F7步入的代碼段中返回之前代碼段

0×01 尋找程序入口

1. 程序介紹

今天拿MessageBox的代碼為例,先貼出代碼:

#include<windows.h>
int main()
{
	MessageBox(0,"You have been hacked","warning",0);
	return 0;
}

技術分享圖片

可以看出這是一個非常簡單的彈出提示框的代碼,只有5行代碼。但麻雀雖小五臟俱全,通過一個小程序我們更容易理解程序的基本運行原理。

2. OD分析程序起點

將程序拖入到OD:

技術分享圖片

我們會看到程序停在了0x004014E0的位置,但這不是程序真正的入口。通常用OllyDBG打開一個程序之後,並沒有直接跳到程序主函數入口地址,而是在進行一些初始化工作。這個我們暫時不用管我們這裏只要找到主程序入口就好。

一般用OllyDBG打開程序的時候,並不是直接定位到程序入口,而是還要先進行一系列的初始化工作,但做這些工作的反匯編代碼我們是不需要的,所以我們要快速跳 過,直接到程序入口。

3. 程序真正入口點

找程序入口呢一個是憑經驗一路F8,還有一個就是借助工具,今天跟大家說一下利用IDA找程序入口。

在IDA中打開程序,在左側欄中找到_main,點擊右側代碼欄第一行,看底下的地址就好了。我們記住入口地址就好。

main函數地址是0×00401500。

技術分享圖片

我們回到OD,右鍵goto-expression跳轉到main函數所在位置。

技術分享圖片

技術分享圖片

我們按F2在這設個斷點,接下來我們要用到。

0×03 主函數運行過程

我們在0×401500處下好斷點,按F9運行到斷點處。當我們看見地址的字成紅色背景變為黑色時,就說明程序已經運行到我們的斷點處了。

技術分享圖片

找到主函數我們今天的任務就完成一半了,我們先分析一下主函數運行的過程,其實主函數運行過程也是壓棧彈棧的過程,只是這個過程與我們直接調用MassageBox的堆棧調用略有不同,為了方便理解先看一下下面的小知識點。

棧頂(esp):棧的低址,就是棧空間地址小的一端

棧頂(ebp):棧的高址,就是棧空間地址較大的一端

棧空間的增長:由高地址向低地址增長(ebp—>esp)

好讓我們繼續,先F8運行到0x40150B。

技術分享圖片

這時我們要觀察一下現在棧頂和棧底的情況這時候esp棧頂是0x28FEB8,ebp棧底是0x28FF88。

技術分享圖片

繼續F8兩次,這裏就出現了與調用函數不同的地方,這裏指令SUB ESP,14是讓esp直接減14的意思,我們現在的esp是0x28FEB4。

技術分享圖片

技術分享圖片

果斷打開計算器0x28FEB4-0×14=0x28FEA0,那說明我執行完這個指令過後esp的值就應該是0x28FEA0。

技術分享圖片

讓我們F8驗證一下,果然不出所料,目前棧頂的位置就是 0x28FEA0。

技術分享圖片

記住這裏都是16進制的運算所以0×14是10進制的20,而每個地址相差4,也就是棧頂到棧底一下子多了5個地址,但沒有賦值,這裏也就是跟我們平時說的壓棧的方式不一樣的地方。一般而言壓棧是一個一個從高址向低址入棧。這裏我先把它稱為開辟棧空間然後賦值吧。

技術分享圖片

繼續F8,不過這時我們要觀察開辟出的5個地址值得變化,我們先截圖記錄一下:

技術分享圖片

當我們運行過CALL 00401EA0時發現這五個地址的值沒有變化。

當我們運行過MOV DWORD PTR SS:[LOCAL.4],0時我們發現0x28FEAC的值變成了0。

技術分享圖片

接著運行MOV DWORD PTR SS:[LOCAL.5],OFFSET 0×404000 ,這時0x28FEA8的值變成了0×404000。

技術分享圖片

接著運行 MOV DWORD PTR SS:[LOCAL.6],OFFSET 0×404008,這時0x28FEA4的值變成了0×404008。

技術分享圖片

接著運行 MOV DWORD PTR SS:[LOCAL.7],0 ,這時我們的esp變成了0。

技術分享圖片

這些就是主函數中在運行MassageBox之前棧中的變化,只不過這裏是利用esp-14的方法先開辟了個空間然後再入棧。

這裏再補充一下0×404000和0×404008 是什麽,其實在截圖裏我們已經看到OD已經給出了,它們分別代表warning和You have been hacked。那它們是怎麽來的呢?其實我們在程序編譯的時候已經把這些變量集中放到了數據段,這涉及到PE結構了,大家目前理解為變量值集中存放的地方。好我們驗證一下,在左下角二進制窗口依次右鍵—>go to—>expression接著在彈出窗口中輸入404000,查找,我們看下結果:

技術分享圖片

我們在看一下warning在線通過工具轉換成ASC碼的結果,剛好與上圖前七個字節對上。

技術分享圖片

以上說明0×404000和 0×404008這樣的地址就類似高級語言裏的變量,我們把真正的值賦給變量,然後我們只操作變量就好了。

以上就是今天講的內容,大家跟著步驟仔細操作一下,要不然後邊的就會越聽越迷糊。下篇文章就要真正講到調用MassageBox時棧的變化了,也就是真正棧的知識了,希望大家能夠打好基礎。

緩沖區溢出實戰教程系列(三):利用OllyDbg了解程序運行機制