1. 程式人生 > 實用技巧 >堆疊緩衝區溢位實驗

堆疊緩衝區溢位實驗

實驗二 堆疊緩衝區溢位實驗

一、 實驗目的
 瞭解堆疊緩衝區溢位原理
 掌握vc++6.0使用方法
 熟悉堆疊緩衝區溢位防範常用的方法
二、 實驗原理

  1. 堆疊的概念
    堆疊是一個在電腦科學中經常使用的抽象資料型別。堆疊中的物體具有一個特性:最後一個放入堆疊中的物體總是被最先拿出來,這個特性通常稱為後進先處(LIFO)佇列。堆疊中定義了一些操作,兩個最重要的是PUSH和POP。PUSH操作在堆疊的頂部加入一個元素。POP操作相反,在堆疊頂部移去一個元素,並將堆疊的大小減一。
  2. 堆疊緩衝區溢位原理
    函式呼叫時,返回地址存放在堆疊中,區域性變數也存放在堆疊中;如果區域性變數中有一個字元陣列,並且該程式使用了危險的函式來操縱該字元陣列,那麼就可以通過向該程式傳遞超長的字串來使得該字元陣列“溢位”,從而達到覆蓋返回地址、執行惡意程式碼的目的。
  3. 防範措施:
    引入新的安全的函式,取代舊的、有缺陷的函式。較新的c庫中都帶有 strncpy ,fgets , sscanf 等函式。
    插入保護碼,這些保護碼被稱為“金絲雀”。某些程式包可以與編譯器配套使用,在返回地址與區域性變數之間插入一些保護碼,導致入侵者在覆蓋返回地址的時候,首先覆蓋了保護程式碼。程式執行時會檢測這些保護碼,如果這些程式碼被改變,程式就會馬上終止。檢測保護碼的程式碼是編譯器加進去的,程式設計師無需為此操心。
    真正有威脅的攻擊來自shell2 code,但shell2code通常要求在堆疊中植入一段代 碼並執行,這就需要堆疊是可執行的。一些作業系統 (如新版的Solaris)可以將堆疊設定為不可執行的。Intel 的 Itanium 處理器採用了一種與眾不同的途徑來避免基於堆疊的緩衝區溢位攻擊,即為返回地址設定了一個暫存器,使返回地址不再放到堆疊中,所以無論如何溢位,也不會影響返回地址的值。
    三、 實驗環境
  4. 作業系統
    操作機:Windows_7
    操作機預設使用者名稱:administrator,密碼:123456
  5. 實驗工具
    Microsoft Visual C++ 6.0
    Microsoft Visual C++,(簡稱Visual C++、MSVC、VC++或VC)是Microsoft公司推出的以C++語言為基礎的開發Windows環境程式,面向物件的視覺化整合程式設計系統。它不但具有程式框架自動生成、靈活方便的類管理、程式碼編寫和介面設計整合互動操作、可開發多種程式等優點,而且通過的設定就可使其生成的程式框架支援資料庫介面、OLE2.0,WinSock網路。
    四、 實驗步驟及內容
    1.1開啟目錄D:\2、網路攻防\2、網路入侵\30系統漏洞攻擊\2.堆疊緩衝區溢位實驗\工具包,解壓vc安裝包,安裝vc6。

1.2預設安裝完成,桌面出現VC+ +6.0的圖示


2.1開啟實驗所用c程式

2.2新建文字檔案,原始碼的拷貝程式如下:

#include <stdio.h>
#include "string.h"
#include <windows.h>

int fun(char *szIn, int nTest)
{
    int a=1, b=2, c=0;
    char szBuf[8];
    memcpy(szBuf, szIn, strlen(szIn));
    c = a + b;
    return c;
}

int main()
{
    int i = 0, j = 0;
    printf("按1臨近變數覆蓋,按2為返回值覆蓋!");
    scanf("%d", &i);

    if (i== 1){
        char sz_In2[] = "1234567890s";
        j = fun(sz_In2, 888);
    }else if (i == 2){
        char sz_In3[] = "123456789abcdefghijklmnopqrstuvwxyz";
        i = fun(sz_In3, 888);
    }else{
        char sz_In1[] = "123";
        j = fun(sz_In1, 888);
    }
    return 0;
}

2.3儲存為.c的檔案,點選“組建”選項卡下的"編譯”,編譯檔案遇到詢問是否需要建立一個活動的專案工作區,點選“是"

2.4在程式中設定斷點,進行除錯。按F9進行設定,設定內容如下

2.5按F5開始除錯。詢問是否建立exe檔案, 點選“是"

3.1進入斷點除錯按1的時候程式的中間變數變化情況.點Run to Cursor .將程式凋至fun函式的memcpy位置。
3.2第二個斷點的結果顯示

根據上圖可知申請的個八個區域的陣列由於給他賦值為十塊的內容,導致了變數溢位從而覆蓋了c的值。
3.3 ( 淹沒返回地址改變程式流程)退出程式,按F5重新執行。按2鍵進行返回值覆蓋 ,回車。按下F5執行到c=a+b處,檢視a,b,c三值發生了資料溢位。

3.4得知,b,c的值金部被改變了,按F5繼續執行程式碼彈出如下錯誤。

上圖說明子函式的返回地址被覆蓋掉了,無法正常退出。
五、 實驗總結
通過本次實驗,瞭解了堆疊緩衝區溢位漏洞的原理以及防範的方法,掌握了vc++6.0使用方法,收穫很大。