緩沖區溢出實戰教程系列(三):利用OllyDbg了解程序運行機制
想要進行緩沖區溢出的分析與利用,當然就要懂得程序運行的機制。今天我們就用動態分析神器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了解程序運行機制