在通過了基本的測試程序后,開始分析其原理。
本問的內容還是主要參考http://blog.csdn.net/linyt/article/details/43315429
先回顧下一些基礎:
匯編程序快速入門(32位): http://www.cnblogs.com/YukiJohnson/archive/2012/10/27/2741836.html
程序內存空間分配: http://blog.csdn.net/ljianhui/article/details/21666327
函數幀結構
現代高級語言C/C++,程序里每個函數對應一個函數幀結構(在棧中),在調用一個函數前,會在棧中保存一些數據,在跳轉到新的函數時,新的函數首先建立自己的幀結構,接着計算完成后注銷自己的幀結構,並恢復前一個函數的幀結構。
其中用到的最主要的(上面“匯編程序快速入門”中有詳細介紹)就是函數調用時程序的棧中的數據變換,如下圖所示。
針對如下代碼:
1 #include <stdio.h> 2 3 void f(int a, int b) 4 { 5 printf("%d\n", a + b); 6 } 7 8 int main() 9 { 10 int a = 1; 11 int b = 1; 12 f(a, b); 13 return 0; 14 }
其棧中的結構如下圖所示,當然這是針對32位程序的~
1) main函數在調用f函數前,首先將參入的參數壓入棧中;
2)接着,將當前程序執行的下一個的位置EIP加入棧中,后面f函數返回時用;
3)進入f函數,f函數首先將當前的EBP壓入棧中,接着mov esp, ebp(將EBP指向當前的棧頂),接着以EBP為基礎構建自己的函數幀結構。
函數幀結構中包含當前函數的局部變量(攻擊的示例程序的buffer變量及在這里面)
4)在f函數執行完成后,會將棧中的EBP值彈出,恢復到EBP寄存器中,還原ESP寄存器,接着彈出EIP變量,程序根據EIP變量指向的位置接着執行main函數后面的程序部分。
示例程序的棧結構
上一節stack1中的main函數調用f函數的棧結構如下圖所示:
對buf進行數據拷貝,得到的結果如下圖所示:
當0xffffd710覆蓋了原來EIP的位置時,f函數在返回時就會將0xffffd710彈出來給EIP,程序根據EIP的地址尋找下面執行的程序。
小結
本節介紹了緩沖區溢出漏洞攻擊的原理,主要是修改棧中EIP的值。
參考:
http://blog.csdn.net/linyt/article/details/43315429