實驗二 堆疊緩沖區溢位實驗
一、 實驗目的
? 了解堆疊緩沖區溢位原理
? 掌握vc++6.0使用方法
? 熟悉堆疊緩沖區溢位防范常用的方法
二、 實驗原理
- 堆疊的概念
堆疊是一個在計算機科學中經常使用的抽象資料型別,堆疊中的物體具有一個特性:最后一個放入堆疊中的物體總是被最先拿出來,這個特性通常稱為后進先處(LIFO)佇列,堆疊中定義了一些操作,兩個最重要的是PUSH和POP,PUSH操作在堆疊的頂部加入一個元素,POP操作相反,在堆疊頂部移去一個元素,并將堆疊的大小減一, - 堆疊緩沖區溢位原理
函式呼叫時,回傳地址存放在堆疊中,區域變數也存放在堆疊中;如果區域變數中有一個字符陣列,并且該程式使用了危險的函式來操縱該字符陣列,那么就可以通過向該程式傳遞超長的字串來使得該字符陣列“溢位”,從而達到覆寫回傳地址、執行惡意代碼的目的, - 防范措施:
引入新的安全的函式,取代舊的、有缺陷的函式,較新的c庫中都帶有 strncpy ,fgets , sscanf 等函式,
插入保護碼,這些保護碼被稱為“金絲雀”,某些程式包可以與編譯器配套使用,在回傳地址與區域變數之間插入一些保護碼,導致入侵者在覆寫回傳地址的時候,首先覆寫了保護代碼,程式運行時會檢測這些保護碼,如果這些代碼被改變,程式就會馬上終止,檢測保護碼的代碼是編譯器加進去的,程式員無需為此操心,
真正有威脅的攻擊來自shell2 code,但shell2code通常要求在堆疊中植入一段代 碼并執行,這就需要堆疊是可執行的,一些作業系統 (如新版的Solaris)可以將堆疊設定為不可執行的,Intel 的 Itanium 處理器采用了一種與眾不同的途徑來避免基于堆疊的緩沖區溢位攻擊,即為回傳地址設定了一個暫存器,使回傳地址不再放到堆疊中,所以無論如何溢位,也不會影響回傳地址的值,
三、 實驗環境 - 作業系統
操作機:Windows_7
操作機默認用戶名:administrator,密碼:123456 - 實驗工具
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使用方法,識訓很大,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/212698.html
標籤:其他
