緩沖區溢出攻擊-入門例子原理分析


  在通過了基本的測試程序后,開始分析其原理。

  本問的內容還是主要參考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 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM