網絡攻防原理與技術課件版第10章緩沖區溢出攻擊_第1頁
網絡攻防原理與技術課件版第10章緩沖區溢出攻擊_第2頁
網絡攻防原理與技術課件版第10章緩沖區溢出攻擊_第3頁
網絡攻防原理與技術課件版第10章緩沖區溢出攻擊_第4頁
網絡攻防原理與技術課件版第10章緩沖區溢出攻擊_第5頁
已閱讀5頁,還剩122頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第 十 章 緩沖區溢出攻擊第 十 章 緩沖區溢出攻擊內容提要緩沖區溢出概述1緩沖區溢出攻擊原理2緩沖區溢出攻擊防御措施3內容提要緩沖區溢出概述1緩沖區溢出攻擊原理2緩沖區溢出攻擊防概念緩沖區或緩存 (Buffer):用戶為程序運行時在計算機中申請得的一段連續的內存,它保存了給定類型的數據。緩沖區溢出(Buffer Overflow):計算機程序向緩沖區內填充的數據位數超過了緩沖區本身的容量,溢出的數據覆蓋在合法數據上。緩沖區溢出攻擊:(一般情況下,緩沖區溢出引起程序運行錯誤,但是在攻擊者的設計下)向程序的緩沖區寫入超出其長度的內容,造成緩沖區的溢出,從而破壞程序的正常執行流程,使程序轉而執行其

2、他的指令,以達到攻擊的目的。概念緩沖區或緩存 (Buffer):用戶為程序運行時在計算機緩沖區溢出的根源溢出的根源在于編程:如果緩沖區被寫滿,而程序沒有去檢查緩沖區邊界,也沒有停止接收數據,這時緩沖區溢出就會發生。Unix和MS Windows系統由于要實現更好的性能和功能,往往在數據段中動態地放入可執行的代碼。C/C+語言問題:對數組下標訪問邊界不做檢查或者少做檢查。程序員的編程習慣:忽略對輸入數據進行嚴格的邊界檢查。緩沖區溢出的根源溢出的根源在于編程:如果緩沖區被寫滿,而程序發展歷史1988年,Morris蠕蟲攻擊VAX 和 Sun機器,使當時Internet的大約10%崩潰。1996年,

3、Elias Levy發表文章“Smashing the stack for fun and profit”,顯示了很多程序都存在緩沖區溢出的危險。緩沖區溢出攻擊被廣泛關注。1999年,Dark spyrit AKA Barnaby jack提出使用系統核心dll中的“jmp esp”指令完成shellcode跳轉的想法,開創了Win32平臺下緩沖區溢出的新思路,大量windows平臺下緩沖區溢出漏洞被利用。2001年8月,“紅色代碼”利用微軟IIS漏洞產生緩沖區存溢出,成為攻擊企業網絡的“罪魁禍首”。 發展歷史1988年,Morris蠕蟲攻擊VAX 和 Sun機發展歷史2003年1月,Slam

4、mer蠕蟲利用微軟SQL漏洞產生緩沖區溢出對全球互聯網產生沖擊。同年,“沖擊波”蠕蟲病毒利用微軟RPC遠程調用存在的緩沖區漏洞對Windows 2000/XP、Windows Server 2003進行攻擊,波及全球網絡2004年5月爆發的“振蕩波”利用了Windows系統的活動目錄服務緩沖區溢出漏洞。2005年8月利用Windows即插即用緩沖區溢出漏洞的“狙擊波”被稱為史上最快利用微軟漏洞進行攻擊的惡意代碼2008年底至2009年的Conficker蠕蟲利用的是Windows處理遠程RPC請求時的漏洞(MS08-067) 。發展歷史2003年1月,Slammer蠕蟲利用微軟SQL漏洞危害性

5、和普遍性緩沖區溢出漏洞可以使一個匿名的Internet用戶有機會獲得一臺主機的部分或全部的控制權。緩沖區溢出攻擊占了遠程網絡攻擊的絕大多數,操作系統中超過50%的安全漏洞都是由內存溢出引起的。 任何平臺、任何程序都可能存在緩沖區溢出的漏洞。1998年Lincoln實驗室用來評估入侵檢測的的5種遠程攻擊中,有2種是緩沖區溢出。而在1998年CERT的13份建議中,有9份是是與緩沖區溢出有關的,在1999年,至少有半數的建議是和緩沖區溢出有關的。危害性和普遍性緩沖區溢出漏洞可以使一個匿名的Internet危害性和普遍性普遍性1999年,CERT安全建議中50%以上同它有關。嚴重性獲得系統最高權限。

6、沒有有效預防措施C語言問題程序員編程習慣,安全意識薄弱危害性和普遍性普遍性1999年,CERT安全建議中50%以安全漏洞數量(CERT)危害性和普遍性安全漏洞數量(CERT)危害性和普遍性近年來,雖然緩沖區溢出漏洞的數量占比有所減少,但仍然是一類危害性極大的、數量眾多的安全漏洞危害性和普遍性近年來,雖然緩沖區溢出漏洞的數量占比有所減少,但仍然是一類危內容提要緩沖區溢出概述1緩沖區溢出攻擊原理2緩沖區溢出攻擊防御措施3內容提要緩沖區溢出概述1緩沖區溢出攻擊原理2緩沖區溢出攻擊防三種內存分配模式(1)靜態分配:在進程創建時由系統一次性分配的整塊靜態內存,這塊空間在進程運行期間保持不變。包括:正文(

7、 TEXT)段:指令數據( DATA)段:初始化的全局靜態數據BSS段:未初始化的全局數據棧空間三種內存分配模式(1)靜態分配:在進程創建時由系統一次性分配三種內存分配模式(2)堆棧(Stack)分配:調用程序的地址信息,函數參數的內存分配。整個堆棧空間已在進程創建時分配好。進程剛啟動時,堆棧空間是空的,里面無實體。 在進程運行期間,對實體的堆棧分配是進程自行生成(壓棧)和釋放(彈出)實體,系統并不參與。 只要壓入的實體的總長度不超過堆棧空間大小,堆棧分配就與系統無關。若超過,就會引發堆棧溢出錯誤。三種內存分配模式(2)堆棧(Stack)分配:調用程序的地址三種內存分配模式(3)堆(Heap)

8、分配:當進程需要生成實體時,向系統申請分配空間;不再需要該實體時,可以向系統申請回收這塊空間。堆分配使用特定的函數:malloc();new()。 堆分配的空間利用率最高。三種內存分配模式(3)堆(Heap)分配:當進程需要生成實體三種內存分配模式比較靜態分配 棧分配 堆分配 空間的生成 進程創建時進程創建時用一點分配一點 實體生成時間 進程創建時 進程運行時 進程運行時 實體生成者 操作系統 進程 進程申請/系統實施 生命期 永久 臨時 完全可控 訪問方式標識標識指針三種內存分配模式比較靜態分配 棧分配 堆分配 空間的生成 進內存布局16內存布局16內存布局不同區域: 堆棧保存調用程序的地址

9、信息,所需要的變量,其它幀指針等: HEAP動態內存分配,本地變量: BSS符號塊起始地址 :未初始化全局數據段,即:int foo; float baz;: DATA初始化全局靜態數據,即:int shit=9,char head=”ugh”;: TEXT機器指令 = 操作碼 + 操作數;read-only編譯時分配執行時分配內存布局不同區域: 堆棧保存調用程序的地址信息,所需內存布局ArgumentsVariablesenvironmentstackHeapBSSDatatext(code)Adresses hautesAdresses bassesuserstackframe代碼區數據區

10、棧堆內存布局ArgumentsstackHeapBSSDatat緩沖區溢出攻擊原理緩沖區溢出的目的在于擾亂具有某些特權的運行程序的執行流程,讓攻擊者取得程序的控制權,兩個步驟:(1)在程序的地址空間(堆棧、堆、BSS段等)里植 入攻擊代碼,或植入攻擊代碼所需的攻擊參數(如果攻擊代碼已存在于目標程序中);()改變程序的執行流程,轉去執行攻擊代碼緩沖區溢出攻擊原理緩沖區溢出的目的在于擾亂具有某些特權的運行緩沖區溢出攻擊原理代碼注入攻擊攻擊者向緩沖區寫入的數據包含了攻擊代碼(可執行的二進制代碼,通常稱為“shellcode”),當發生緩沖區溢出時,溢出的數據覆蓋掉一個可執行程序的入口地址(如函數的返

11、回地址,函數指針變量等等),使得該地址指向shellcode,從而當程序試圖通過該入口地址執行代碼時,就會執行攻擊者的shellcode緩沖區溢出攻擊原理代碼注入攻擊緩沖區溢出攻擊原理ROP 攻擊 攻擊代碼已經在被攻擊的程序中了(通常是一些系統函數,如system(), exec()等),攻擊者所要做的只是為攻擊代碼傳遞它所需要的參數,然后用一個系統函數的地址覆蓋可執行代碼的入口地址,通過巧妙的構造可以使程序用預設的參數調用系統函數,比如用“cmd”作為參數調用system()函數,也稱為ret2libc(Return-to-libc)緩沖區溢出攻擊原理ROP 攻擊 主要分為:堆棧溢出堆溢出B

12、SS段溢出格式化字符串溢出攻擊緩沖區溢出攻擊分類主要分為:緩沖區溢出攻擊分類一、堆棧溢出一、堆棧溢出堆棧的相關概念SP:堆棧指針,指向堆棧的頂部;堆棧的增長方向:向下增長(向內存低地址)FP:幀指針,指向堆棧的幀頭。 堆棧的相關概念SP:堆棧指針,指向堆棧的頂部;堆棧布局堆棧的相關概念堆棧布局堆棧的相關概念函數調用過程Func函數中的局部變量調用Func函數前的EBP退出Func函數后的返回地址傳遞給Func的實參內存低地址內存高地址最先壓入棧最后壓入棧函數調用過程Func函數中的局部變量調用Func函數前的EB函數調用時堆棧處理規定函數調用過程C語言默認方法函數調用時堆棧處理規定函數調用過程

13、C語言默認方法函數調用的棧幀變化假設過程P調用過程Q:Q的參數放在P的棧幀中;當P調用Q時,P中的返回地址被壓入棧中,形成P的棧幀的末尾;返回地址就是當程序從Q返回時應繼續執行的地方;Q的棧幀從保存的幀指針的值開始,后面是保存的其他寄存器的值。函數調用的棧幀變化假設過程P調用過程Q:假設有一個程序,其函數調用順序如下: main() - func_1() - func_2() - func_3() 棧布局假設有一個程序,其函數調用順序如下: 棧布局C語言函數調用例子void function(int a, int b, int c) char buffer15; char buffer210;

14、 void main() function(1,2,3); C語言函數調用例子void function(int a, C語言函數調用過程按c、b、a的順序將參數壓棧;把指令指針(IP)壓棧,IP也稱為返回地址(RET);把FP壓棧,被保存的FP稱為SFP;將當前的SP復制到FP,成為新的幀指針;將SP的值減小,為局部變量保留空間。C語言函數調用過程按c、b、a的順序將參數壓棧;C語言函數調用過程buffer1cbaretsfpbuffer2堆棧頂部(內存低端)堆棧底部(內存高端)C語言函數調用過程buffer1cbaretsfpbuffe緩沖區溢出攻擊的原理攻擊的原理:通過往程序緩沖區寫入超

15、過其邊界的內容,造成緩沖區溢出,使得程序轉而執行攻擊者指定的代碼,通常是為攻擊者打開遠程連接的ShellCode。關鍵點:存在能夠被攻擊的數據緩存要有被執行的攻擊代碼緩沖區溢出攻擊的原理攻擊的原理:堆棧溢出原理堆棧溢出原理堆棧溢出代碼1/ 函數定義void function(char *str) char buffer16;strcpy(buffer,str);/ 主函數void main() char large_string256;int i;for( i = 0; i 1) copy(argv1); 堆棧溢出示例代碼2copy (char* msg)堆棧溢出示例代碼2buffer0buf

16、fer511previous fpReturn addressargv1spfpattackcodeStack growthMemory growth堆棧溢出示例代碼2buffer0previous fpR改變函數指針變量堆棧溢出示例代碼3改變函數指針變量堆棧溢出示例代碼3堆棧溢出示例代碼3int good (const char* str) copy(char* msg) int (*fptr)(const char* str); char buffer512; fptr = (int(*)(const char* str)good; strcpy(buffer, msg); (void)(

17、*fptr)(buffer);main(int argc, char* argv)if(argc1) copy(argv1);堆棧溢出示例代碼3int good (const char*堆棧溢出示例代碼3buffer0buffer511fptrprevious fpReturn addressargv1spfpattackcodeStack growthMemory growth堆棧溢出示例代碼3buffer0fptrpreviousShell Code改變程序流程后希望得到Shell首先把想要執行的代碼放到我們想使其溢出的緩沖區里;然后覆蓋函數的返回地址, 使其指向這個緩沖區(希望執行的代碼

18、,通常是shell Code)Shell Code改變程序流程后希望得到ShellShell Codevoid main() char *str2=”/bin/sh”,0; exec (“/bin/sh”,str,0); char shellcode=“xebx2ax5ex89x76x08xc6x46x07x00 xc7x46x0cx00 x00 x00”“x00 xb8x0bx00 x00 x00 x89xf3x8dx4ex08x8dx56x0cxcdx80”“xb8x01x00 x00 x00 xbbx00 x00 x00 x00 xcdx80 xe8xdlxffxff”“xffx2fx6

19、2x69x6ex2fx73x68x00 x89xecx5dxc3”; 編譯后反編譯Shell Codevoid main()char shel堆棧溢出過程分析示例網絡攻防原理與技術課件最新版第10章緩沖區溢出攻擊示例環境:操作系統:Windows 7 Professional Service Pack 1編譯器:VC+ 6.0目的:掌握動態調試方法,理解函數調用過程中堆棧和關鍵寄存器的變化以及堆棧溢出原理堆棧溢出分析示例示例環境:堆棧溢出分析示例源代碼:堆棧溢出分析示例運行結果是什么?源代碼:堆棧溢出分析示例運行結果是什么?溢出過程分析堆棧溢出分析示例溢出過程分析堆棧溢出分析示例溢出過程分析堆

20、棧溢出分析示例溢出過程分析堆棧溢出分析示例堆棧變化過程堆棧溢出分析示例堆棧變化過程堆棧溢出分析示例溢出過程分析堆棧溢出分析示例溢出過程分析堆棧溢出分析示例堆棧變化過程堆棧溢出分析示例堆棧變化過程堆棧溢出分析示例溢出過程分析堆棧溢出分析示例溢出過程分析堆棧溢出分析示例溢出過程分析堆棧溢出分析示例溢出過程分析堆棧溢出分析示例溢出過程分析堆棧溢出分析示例溢出過程分析堆棧溢出分析示例堆棧變化過程堆棧溢出分析示例堆棧變化過程堆棧溢出分析示例溢出過程分析堆棧溢出分析示例溢出過程分析堆棧溢出分析示例堆棧變化過程堆棧溢出分析示例堆棧變化過程堆棧溢出分析示例堆棧變化過程堆棧溢出分析示例堆棧變化過程堆棧溢出分析示

21、例堆棧變化過程堆棧溢出分析示例堆棧變化過程堆棧溢出分析示例溢出過程分析堆棧溢出分析示例溢出過程分析堆棧溢出分析示例堆棧變化過程堆棧溢出分析示例堆棧變化過程堆棧溢出分析示例溢出過程分析堆棧溢出分析示例溢出過程分析堆棧溢出分析示例堆棧變化過程堆棧溢出分析示例堆棧變化過程堆棧溢出分析示例溢出過程分析堆棧溢出分析示例溢出過程分析堆棧溢出分析示例堆棧變化過程堆棧溢出分析示例堆棧變化過程堆棧溢出分析示例溢出過程分析堆棧溢出分析示例溢出過程分析堆棧溢出分析示例堆棧變化過程堆棧溢出分析示例堆棧變化過程堆棧溢出分析示例溢出過程分析堆棧溢出分析示例溢出過程分析堆棧溢出分析示例堆棧變化過程堆棧溢出分析示例堆棧變化過

22、程堆棧溢出分析示例二、堆溢出二、堆溢出堆溢出當我們需要較大的緩沖區或在寫代碼時不知道包含在緩沖區中對象的大小,常常要使用堆。 堆沒有壓棧和入棧操作,而是分配和回收內存。C語言中使用malloc()和free()函數實現內存的動態分配和回收,C+語言使用new()和delete()函數來實現相同的功能。 堆溢出當我們需要較大的緩沖區或在寫代碼時不知道包含在緩沖區中堆的特點堆的增長方向:從底到高(與棧相反)堆的分配和釋放可以由用戶自由控制堆的空間不一定連續堆申請函數返回指向堆內存的指針,后續對于內存的讀寫等操作需要通過此指針進行不同的系統有著不同的堆管理機制Heap堆的特點HeapLinux堆Li

23、nux堆Linux堆Linux堆堆表用來索引堆塊,表中包含索引堆塊的大小、位置、狀態等信息位于堆區的起始位置,堆表分為兩種空閑雙向鏈表Freelist(空表 128條)和快速單向鏈表Lookaside(快表最多只有四項)堆表堆表用來索引堆塊,表中包含索引堆塊的大小、位置、狀態等信息堆堆塊分配可以分為三類:快表分配、普通空表分配和零號空表(free0分配)堆塊分配堆塊分配可以分為三類:快表分配、普通空表分配和零號空表(fr釋放堆塊的操作包括將堆塊狀態改為空閑,鏈入相應的堆表。堆塊釋放釋放堆塊的操作包括將堆塊狀態改為空閑,鏈入相應的堆表。堆塊釋當堆管理系統發現兩個空閑堆塊相鄰時,就會進行堆塊合并操

24、作,包括,將堆塊從鏈表中卸下、合并、調整新堆塊塊首信息、重新鏈入空表堆塊合并當堆管理系統發現兩個空閑堆塊相鄰時,就會進行堆塊合并操作,包堆溢出是指程序向某個堆塊中寫入的字節數超過了堆塊本身可使用的字節數(之所以是可使用而不是用戶申請的字節數,是因為堆管理器會對用戶所申請的字節數進行調整,這也導致可利用的字節數都不小于用戶申請的字節數),因而導致了數據溢出,并覆蓋到物理相鄰的高地址的下一個堆塊堆溢出堆溢出是指程序向某個堆塊中寫入的字節數超過了堆塊本身可使用的前提條件:程序向堆上寫入數據寫入的數據大小沒有被良好地控制利用策略覆蓋與其物理相鄰的下一個 chunk 的內容利用堆中的機制(如 unlin

25、k 等 )來實現任意地址寫入( Write-Anything-Anywhere)或控制堆塊中的內容等效果,從而來控制程序的執行流堆溢出前提條件:堆溢出用精心構造的數據去溢出下一個塊的塊首,改寫塊首中的前向指針和后向指針,這種能夠向內存任意位置寫入任意數據的機會叫DWORD SHOOT堆溢出- DWORD SHOOT用精心構造的數據去溢出下一個塊的塊首,改寫塊首中的前向指針和int remove (ListNode * node) node - blink - flink = node - flink; node - flink - blink = node - blink; 堆溢出- DWOR

26、D SHOOTint remove (ListNode * node)堆溢堆溢出- DWORD SHOOT堆溢出- DWORD SHOOT觸發unlink繞過系統保護堆溢出利用觸發unlink堆溢出利用堆溢出實例# include # include # include # include # define BUFFER-SIZE 16# define OVERLAYSIZE 8 /* 將覆蓋buf2 的前OVERLAYSIZE 個字節 */int main()u-long diff ;char * buf1 = (char * )malloc (BUFFER-SIZE) ;char * bu

27、f2 = (char * )malloc (BUFFER-SIZE) ;diff = (u-long) buf2 - (u-long) buf1 ;printf (buf1 = %p, buf2 = %p, diff = 0 x %x ( %d) bytes n, buf1, buf2, diff, diff) ;/* 將buf2 用a填充 */memset (buf2, a, BUFFER-SIZE - 1); buf2BUFFER-SIZE - 1 = 0;printf (before overflow: buf2 = %s n, buf2) ;/* 用diff + OVERLAYSIZE

28、 個b填充buf1 */memset (buf1, b, (u-int) (diff + OVERLAYSIZE) ) ;printf (after overflow: buf2 = %s n, buf2) ;return 0 ; 堆溢出實例# include 堆溢出實例運行結果: buf1 = 0 x8049858 , buf2 = 0 x8049870 , diff = 0 x18 (24) bytes before overflow: buf2 = aaaaaaaaaaaaaaa after overflow: buf2 = bbbbbbbbaaaaaaabuf2的前8個字節被覆蓋了,這

29、是因為往buf1中填寫的數據超出了它的邊界進入了buf2的范圍。由于buf2的數據仍然在有效的Heap區內,程序仍可正常結束。 堆溢出實例運行結果:堆溢出實例雖然buf1和buf2是相繼分配的,但它們并不是緊挨著的,而是有8個字節的間距。這是因為,使用malloc()動態分配內存時,系統向用戶返回一個內存地址,實際上在這個地址前面通常還有8字節的內部結構,用來記錄分配的塊長度、上一個堆的字節數以及一些標志等。這個間距可能隨不同的系統環境而不同。buf1溢出后,buf2的前8字節也被改寫為bbbbbbbb,buf2內部的部分內容也被修改為b。 堆溢出實例雖然buf1和buf2是相繼分配的,但它們

30、并不是緊堆溢出實例示意圖:堆溢出實例示意圖:堆溢出堆溢出不如棧溢出流行,原因在于:比棧溢出難度更大需要結合其他的技術對于內存中變量的組織方式有一定的要求堆溢出堆溢出不如棧溢出流行,原因在于:堆溢出堆溢出三、BSS段溢出三、BSS段溢出BSS溢出BSS段存放全局和靜態的未初始化變量,變量與變量之間是連續存放的,沒有保留空間。這樣定義的兩個字符數組即是位于BSS段: static char buf116,buf216;如果事先向buf2中寫入16個字符A,之后再往buf1中寫入24個B,由于變量之間是連續存放的,靜態字符數組buf1溢出后,就會覆蓋其相鄰區域字符數組buf2的值。利用這一點,攻擊者

31、可以通過改寫BSS中的指針或函數指針等方式,改變程序原先的執行流程,使指針跳轉到特定的內存地址并執行指定操作。 BSS溢出BSS段存放全局和靜態的未初始化變量,變量與變量之四、格式化字符串溢出四、格式化字符串溢出格式化串溢出與前面三種溢出不同的是,這種溢出漏洞是利用了編程語言自身存在的安全問題。格式化串溢出源自*printf()類函數的參數格式問題(如printf、fprintf、sprintf等)。int printf (const char *format, arg1, arg2, ); 它們將根據format的內容(%s,%d,%p,%x,%n,),將數據格式化后輸出。問題在于:*pri

32、ntf()函數并不能確定數據參數arg1,arg2,究竟在什么地方結束,即函數本身不知道參數的個數,而只會根據format中打印格式的數目依次打印堆棧中參數format后面地址的內容。 格式化串溢出與前面三種溢出不同的是,這種溢出漏洞是利用了編程格式化串溢出實例/*程序說明:%#x:按16進制輸出,并在前面加上0 x%.20d:按10進制輸出,輸出20位,并在前面補0%n:將顯示內容的長度輸出到一個變量中去*/# include main()int num= 0 x61616161 ;printf (Before : num = %#x n, num) ;printf (%.20d %n n,

33、 num, &num) ;printf (After : num = %#x n, num) ; 格式化串溢出實例/*程序說明:格式化串溢出實例當程序執行第2個printf語句時,參數壓棧之后的內存布局如下:格式化串溢出實例當程序執行第2個printf語句時,參數壓棧格式化串溢出實例根據C函數調用約定,參數從右向左依次壓棧,所以參數&num比參數num先壓入棧中。也就是說,程序中將&num (num的地址)壓入棧作為printf()的第三個參數,而使用打印格式%n會將打印總長度保存到對應參數(&num)的地址中去,從而改變了num的值。 整個程序的輸出結果為: Before : num = 0

34、 x6161616100000000001633771873 After : num = 0 x14變量num的值已經變成了0 x14(20)。格式化串溢出實例根據C函數調用約定,參數從右向左依次壓棧,所格式化串溢出實例如果將第二個printf語句修改為: printf (%.20d %n n, num) ; /注意,這里沒有壓num的地址入棧 則運行的結果為: Before : num= 0 x61616161 Segmentation fault (core dumped) /執行第二個printf()時發生段錯誤了原因:printf()將堆棧中main()函數的變量num當作了%n所對應

35、的參數,因此會將0 x14保存到地址0 x61616161中去,而0 x61616161是不能訪問的地址,因此系統提示發生段錯誤。如果可以控制num的內容,那么就意味著可以修改任意地址(當然是允許寫入的地址)的內容。格式化串溢出實例如果將第二個printf語句修改為:格式化串溢出實際應用中,如果程序將用戶的輸入錯誤地放在格式化串的位置,就會造成溢出攻擊。如果攻擊者可以事先構造好可以攻擊的代碼shellcode,如果可以將返回地址覆蓋成shellcode的起始地址,當緩沖區溢出發生后,程序就會跳到精心設計好的shellcode處執行,達到攻擊的目的。 格式化串溢出實際應用中,如果程序將用戶的輸入

36、錯誤地放在格式化五、整數溢出(擴展)五、整數溢出(擴展)整數溢出:當一個整數值大于或者小于其范圍時,就會產生“回繞”,即溢出。整數:有符號整數(最高位用0表示正數,1表示負數)和無符號整數當使用可能會發生溢出的整數變量來分配內存、限制字符串操作范圍或作為指向緩沖區的指針時,可能會發生緩沖區溢出整數溢出整數溢出:當一個整數值大于或者小于其范圍時,就會產生“回繞”示例:下面的程序運行結果是什么?整數溢出上溢示例:下面的程序運行結果是什么?整數溢出上溢示例:下面的程序運行結果是什么?整數溢出下溢示例:下面的程序運行結果是什么?整數溢出下溢示例:下面的程序運行結果是什么?整數溢出截斷示例:下面的程序運

37、行結果是什么?整數溢出截斷示例:當Len是一個負數時會發生什么?整數溢出符號問題示例:當Len是一個負數時會發生什么?整數溢出符號問題內容提要緩沖區溢出概述1緩沖區溢出攻擊原理2緩沖區溢出攻擊防御措施3內容提要緩沖區溢出概述1緩沖區溢出攻擊原理2緩沖區溢出攻擊防防御策略系統管理上的防御策略關閉不需要的特權程序及時給程序漏洞打補丁程序開發中的防御策略編寫正確的代碼非執行的緩沖區數組邊界檢查程序指針完整性檢查其它方法防御策略系統管理上的防御策略1、關閉不需要的特權程序緩沖區溢出只有在獲得更高的特權時才有意義;關閉一些不必要的特權程序就可以降低被攻擊的風險。1、關閉不需要的特權程序緩沖區溢出只有在獲

38、得更高的特權時才有2、及時給程序漏洞打補丁大部分的入侵是利用一些已被公布的漏洞達成的;如能及時補上這些漏洞,無疑極大的增強了系統抵抗攻擊的能力。2、及時給程序漏洞打補丁大部分的入侵是利用一些已被公布的漏洞3、編寫正確的代碼在所有拷貝數據的地方進行數據長度和有效性的檢查,確保目標緩沖區中數據不越界并有效;很多不安全程序的出現是由于調用了一些不安全的庫函數。這些函數有strcpy()、sprintf()、strcat()等,用更安全的函數代替,比如用strncpy()替換strcpy() ;漏洞探測。利用一些工具,人為隨機地產生一些緩沖區溢出來尋找代碼的安全漏洞。已有這方面的一些高級的查錯工具,如

39、fault injection等。3、編寫正確的代碼在所有拷貝數據的地方進行數據長度和有效性的4、非執行的緩沖區通過使被攻擊程序的數據段地址空間不可執行,從而使得攻擊者不可能執行被植入被攻擊程序輸入緩沖區的代碼,稱為非執行的緩沖區技術。信號傳遞:Linux通過向進程堆棧釋放代碼后引發中斷來執行堆棧中的代碼來實現向進程發送Unix信號。GCC的在線重用:gcc在堆棧區里放置了可執行的代碼作為在線重用之用,關閉該功能不產生任何問題。非執行堆棧保護可有效地對付把代碼植入自動變量的溢出攻擊,而對于其他形式的攻擊則沒有效果。4、非執行的緩沖區通過使被攻擊程序的數據段地址空間不可執行,5、數組邊界檢查數組邊界檢查能防止所有的緩沖區溢出的產生和攻擊。方法包括:C的數組邊界檢查(Jones & Kelly );內存存取檢查(Purify 工具):使用“目標代碼插入”技術來檢查所有的內存存取;類型-安全語言:Java,C#等。5、數組邊界檢查數組邊界檢查能防止所有的緩沖區溢出的產生和攻6、指針完整性檢查程序指針完整性檢查:阻止由于函數返回地址或函數指針的改變而導致的程序執行流程的改變。原理:在每次在程序指針被引用之前先檢測該指針是否已被惡意改動過,如果發現被改動,程序就拒絕執行。因此即使一個攻擊者成功地改變程序的指針,由于系統事先檢測到了指針改變,因

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論