想要進行緩衝區溢出的分析與利用,固然就要懂得程序運行的機制。今天咱們就用動態分析神器ollydbg來了解一下在windows下程序是如何運行的。html
戳這裏看以前發佈的文章:c++
緩衝區溢出實戰教程系列(一):第一個緩衝區溢出小程序:https://www.freebuf.com/articles/system/195614.htmlexpress
緩衝區溢出實戰教程系列(二):dev c++編譯彙編代碼:https://www.freebuf.com/articles/system/197116.html小程序
0×00 OD基本介紹及用法windows
咱們將程序拖入OD中,會出現以下界面,在這裏我分爲四個主要區塊,分別是彙編代碼窗口、寄存器窗口、二進制窗口、堆棧窗口。固然也有分爲五個區塊的,但沒有太大區別。接下來我給你們講講有個基本概念。等下在程序分析裏給你們具體作講解。ide
2. OD經常使用操做函數
F2:設置斷點工具
F4與F9:F4是運行到光標位置,F9是運行到斷點處spa
F7與F8:F7是單步步入,F8是單步步進.net
Ctrl+F9:是從F7步入的代碼段中返回以前代碼段
今天拿MessageBox的代碼爲例,先貼出代碼:
#include<windows.h> int main() { MessageBox(0,"You have been hacked","warning",0); return 0; }
能夠看出這是一個很是簡單的彈出提示框的代碼,只有5行代碼。但麻雀雖小五臟俱全,經過一個小程序咱們更容易理解程序的基本運行原理。
將程序拖入到OD:
咱們會看到程序停在了0x004014E0的位置,但這不是程序真正的入口。一般用OllyDBG打開一個程序以後,並無直接跳到程序主函數入口地址,而是在進行一些初始化工做。這個咱們暫時不用管咱們這裏只要找到主程序入口就好。
通常用OllyDBG打開程序的時候,並非直接定位到程序入口,而是還要先進行一系列的初始化工做,但作這些工做的反彙編代碼咱們是不須要的,因此咱們要快速跳 過,直接到程序入口。
找程序入口呢一個是憑經驗一路F8,還有一個就是藉助工具,今天跟你們說一下利用IDA找程序入口。
在IDA中打開程序,在左側欄中找到_main,點擊右側代碼欄第一行,看底下的地址就行了。咱們記住入口地址就好。
main函數地址是0×00401500。
咱們回到OD,右鍵goto-expression跳轉到main函數所在位置。
咱們按F2在這設個斷點,接下來咱們要用到。
咱們在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時棧的變化了,也就是真正棧的知識了,但願你們可以打好基礎。