第4章-軟件漏洞_第1頁
第4章-軟件漏洞_第2頁
第4章-軟件漏洞_第3頁
第4章-軟件漏洞_第4頁
第4章-軟件漏洞_第5頁
已閱讀5頁,還剩58頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第四章 軟件漏洞2022/7/11網(wǎng)絡攻防技術2本章主要內容4.1 概述4.2 典型漏洞類型4.3 溢出漏洞利用原理4.4 漏洞利用保護機制4.1 概述漏洞的定義:指信息系統(tǒng)硬件、軟件、操作系統(tǒng)、網(wǎng)絡協(xié)議、數(shù)據(jù)庫等在設計上、實現(xiàn)上出現(xiàn)的可以被攻擊者利用的錯誤、缺陷和疏漏。通俗一點說,漏洞就是可以被攻擊利用的系統(tǒng)弱點。2022/7/11網(wǎng)絡攻防技術34.1 概述漏洞的分類:針對安全操作系統(tǒng)研究而提出的漏洞分類。將安全性漏洞和軟件錯誤結合在一起的漏洞分類。多維度分類。廣義漏洞分類。抽象分類。2022/7/11網(wǎng)絡攻防技術44.1 概述漏洞攻擊通常包含3個步驟,分別是:漏洞發(fā)現(xiàn)(Vulnerabil

2、ity Discovery)、漏洞分析(Vulnerability Analysis)、漏洞利用(Vulnerability Exploit)。從導致的后果來看,漏洞可能會造成:以匿名身份直接獲取系統(tǒng)最高權限;從普通用戶提升為管理員用戶;實施遠程拒絕服務攻擊等。2022/7/11網(wǎng)絡攻防技術54.1 概述漏洞的標準化研究:公共漏洞和暴露(Common Vulnerabilities & Exposures,CVE)通用缺陷枚舉(Common Weakness Enumeration, CWE)2022/7/11網(wǎng)絡攻防技術62022/7/11網(wǎng)絡攻防技術7本章主要內容4.1 概述4.2 典型漏

3、洞類型4.3 溢出漏洞利用原理4.4 漏洞利用保護機制4.2 典型漏洞類型棧溢出(Stack Overflow,CWE-121)堆溢出(Heap Overflow,CWE-122)格式化串(Format String,CWE-134)整型溢出(Integer Overflow,CWE-190)釋放再使用(Use after Free,CWE-416)2022/7/11網(wǎng)絡攻防技術84.2.1 棧溢出棧溢出攻擊的相關概念最早要追述到1972年美國空軍發(fā)表的一份研究報告Computer Security Technology Planning Study。在這份報告中,通過溢出緩沖區(qū)來注入代碼這一

4、想法首次被提了出來。直到1986年才出現(xiàn)了首次真實的攻擊,Morris蠕蟲病毒利用了Unix操作系統(tǒng)中fingerd程序的gets()函數(shù)導致的棧溢出來實現(xiàn)遠程代碼執(zhí)行。1996年,Elias Levy (a.k.a Aleph One)在大名鼎鼎的Phrack雜志上發(fā)表了文章Smashing the Stack for Fun and Profit,從此棧溢出漏洞的利用技術被廣泛知曉。2022/7/11網(wǎng)絡攻防技術94.2.1 棧溢出進程使用的操作系統(tǒng)內存一般可以劃分為4部分,按照內存地址由低到高,依次是:棧(Stack)、堆、數(shù)據(jù)段、文本(代碼)段。棧:由編譯器自動分配釋放,是用戶存放程序

5、臨時創(chuàng)建的局部變量、函數(shù)參數(shù)等數(shù)據(jù)的地方。棧是一個寄存、交換臨時數(shù)據(jù)的內存緩沖區(qū)。堆:一般由程序編寫人員分配釋放,若編寫人員不釋放,程序結束時可能由操作系統(tǒng)回收,分配方式類似于鏈表。數(shù)據(jù)段:用來存放程序中已初始化的全局變量的一塊內存區(qū)域。代碼段:用來存放程序執(zhí)行代碼的一塊內存區(qū)域。這里存放著由處理器直接執(zhí)行的二進制代碼。2022/7/11網(wǎng)絡攻防技術104.2.1 棧溢出每個進程有一個棧,在這個進程中每個函數(shù)被調用時分別從這個棧占用一段區(qū)域,稱為棧幀(Stack Frame)。2022/7/11網(wǎng)絡攻防技術114.2.1 棧溢出2022/7/11網(wǎng)絡攻防技術12main函數(shù)入口棧內存高端內存低

6、端main函數(shù)的數(shù)據(jù)call funcEIP寄存器func函數(shù)入口 004011C4004011CC004011D1return 參數(shù)004011D1buff00401210004011D1棧底棧頂內存方向:由低到高 棧方向:由高到低Main函數(shù)棧底EBP函數(shù)調用與棧4.2.1 棧溢出2022/7/11網(wǎng)絡攻防技術13main函數(shù)入口棧內存高端內存低端main函數(shù)的數(shù)據(jù)call funcfunc函數(shù)入口 return 參數(shù)004011D1buffMain函數(shù)棧底EBP在一次函數(shù)調用中實際會保存在棧中的數(shù)據(jù)包括:調用者參數(shù)、EIP的值(返回地址)、EBP的值函數(shù)調用與棧4.2.1 棧溢出2022

7、/7/11網(wǎng)絡攻防技術14main函數(shù)入口棧內存高端內存低端main函數(shù)的數(shù)據(jù)call funcfunc函數(shù)入口 return 參數(shù)004011D1buffMain函數(shù)棧底EBP如果在棧中發(fā)生緩沖區(qū)溢出,極可能使的棧所保存的EIP指針值被改變。也即程序原有流程被改變。函數(shù)調用與棧4.2.1 棧溢出2022/7/11網(wǎng)絡攻防技術15棧溢出實例4.2.1 棧溢出2022/7/11網(wǎng)絡攻防技術16在拷貝argv1指向的字符串之前,并沒有檢測該字符串的長度,如果該字符串的長度大于16,則復制時就會覆蓋name數(shù)組下方的棧空間4.2.2 堆溢出堆的特點:堆是程序運行時動態(tài)分配的內存。所需分配的內存大小在

8、程序運行時由用戶定義。堆在使用時需要使用專用的函數(shù)進行申請,如C語言中的malloc等函數(shù)、C+中的new函數(shù)等。一般用一個堆指針來使用申請的內存,讀、寫、釋放都是通過這個指針來完成。使用完畢后要通過堆釋放函數(shù)進行回收這片內存,否則會造成內存泄漏。如free、delete等。2022/7/11網(wǎng)絡攻防技術17堆的數(shù)據(jù)結構2022/7/11網(wǎng)絡攻防技術18堆表:堆表一般位于堆區(qū)的起始位置,用于檢索堆區(qū)中所有堆塊的總要信息。堆塊:堆區(qū)內存按不同大小組織成塊,以堆塊為單位進行標識。一個堆塊包括兩個部分:塊首和塊身。塊首用來標識塊的自身的信息,例如,大小、空閑或占用狀態(tài)。塊身是最終分配給用戶使用的數(shù)據(jù)

9、區(qū)。Windows系統(tǒng)的堆表空表2022/7/11網(wǎng)絡攻防技術19Windows系統(tǒng)的堆表快表快表是Windows用來加速分配而采用的一種堆表。這類單向鏈表中不會發(fā)生堆塊合并(其中空閑堆塊塊首被置為占用態(tài)防止堆塊合并)。快表也有128條,組織結構與空表類似,只是堆塊按單鏈表組織,而且每條快表最多只有4個節(jié)點。lookaside62022/7/11網(wǎng)絡攻防技術20堆的操作(1)堆的分配:快表分配、普通空表分配和零號空表(free0)分配??毂矸峙洌簩ふ掖笮∑ヅ涞目臻e堆塊,把它從堆表中卸下,給程序使用。普通空表分配:先尋找最優(yōu)的空閑塊分配,若失敗,則尋找次優(yōu)的空閑塊分配。零號空表分配:按照大小升序

10、鏈著大小不同的空閑塊,找最優(yōu)結果。當空表中找不到最優(yōu)的堆塊時,會發(fā)生次優(yōu)分配,即從大塊按照請求的大小精確割出一塊進行分配,然后給剩下部分重新標注塊首,鏈入空表。2022/7/11網(wǎng)絡攻防技術21堆的操作(2)堆塊釋放將堆塊狀態(tài)改為空閑,鏈入相應的堆表。所有的釋放塊都鏈入堆表的末尾。(3)堆塊合并堆塊合并發(fā)生于空表。經過反復的申請與釋放,堆區(qū)產生很多內存碎片。幾個注意點:快表空閑堆塊被置為占用態(tài),所以不會發(fā)生堆塊合并操作。快表只有精確分配時才會分配。分配優(yōu)先使用快表,失敗時才使用空表。2022/7/11網(wǎng)絡攻防技術22堆溢出示例1#define BUFFSIZE 322int main(int

11、argc, char* argv )3char *buf1;4buf1 = (char *)malloc(BUFFSIZE);/malloc a block of memory5 strcpy(buf1,argv1); /copy parameter to buf16printf(%sn,buf1);/print the buf17free(buf1);/free buf18return 0;9拷貝字符串之前沒有對字符串的長度進行檢查,所以會產生溢出,覆蓋緩沖區(qū)后面的內容,也就是覆蓋下一個堆塊的塊首,造成堆管理結構混亂。4.2.3 格式化串所謂格式化串,就是在*printf()系列函數(shù)中按照一

12、定的格式對數(shù)據(jù)進行輸出,可以輸出到標準輸出,即printf(),也可以輸出到文件句柄,字符串等。對應的函數(shù)有fprintf,sprintf,snprintf,vprintf,vfprintf,vsprintf,vsnprintf等。 2022/7/11網(wǎng)絡攻防技術24格式化串的棧結構2022/7/11網(wǎng)絡攻防技術25 printf(“a=%d,b=%dn ” ,a,b);格式化串溢出棧布局2022/7/11網(wǎng)絡攻防技術26 因為參數(shù)的不固定,可能導致棧中數(shù)據(jù)泄露4.2.4 整型溢出一個整數(shù)是一個固定的長度 (32位或64位),它能存儲的最大值是固定的,當嘗試去存儲一個大于這個固定的最大值時,將

13、會導致一個整型溢出。存儲溢出運算溢出符號溢出2022/7/11網(wǎng)絡攻防技術27存儲溢出長整型賦值給短整型int len1 = 0 x10000;short len2 = len1; /len2=0 x0000短整型賦值給長整型 int len1= -1; short len2 =1; len1=len2; /len1=0 xff ff ff ff/len2=0 x0001/len1=0 xffff0001= -132022/7/11網(wǎng)絡攻防技術28運算溢出bool func(char *userdata, short datalength) char *buff; . if(datalengt

14、h != strlen(userdata) return false; datalength = datalength*2; buff = malloc(datalength); strncpy(buff, userdata, datalength) . 2022/7/11網(wǎng)絡攻防技術29運算溢出bool func(char *userdata, short datalength)/datalength=0 x8000char *buff;.if(datalength != strlen(userdata)return false;datalength = datalength*2; /dat

15、alength=0 x10000buff = malloc(datalength);strncpy(buff, userdata, datalength).2022/7/11網(wǎng)絡攻防技術30符號溢出整型數(shù)是分為有符號整型數(shù)和無符號整型數(shù)的。一般對長度變量都要求使用無符號整型數(shù),如果程序員忽略了符號的話,在進行安全檢查判斷的時候就可能出現(xiàn)錯誤。2022/7/11網(wǎng)絡攻防技術31符號溢出Apache Web Server分塊(chunked)編碼遠程溢出漏洞出于安全考慮,在將分塊數(shù)據(jù)拷貝到緩沖區(qū)之前,Apache會對分塊長度進行檢查。如果分塊長度小緩沖區(qū),Apache將最多只拷貝緩沖區(qū)長度的數(shù)據(jù)。

16、然而在進行上述檢查時,沒有將分塊長度轉換為無符號型進行比較。因此,如果攻擊者將分塊長度設置成一個負值,就會 繞過上述安全檢查,Apache會將一個超長的分塊數(shù)據(jù)拷貝到緩沖區(qū)中,這會造成緩沖區(qū)溢出。2022/7/11網(wǎng)絡攻防技術324.2.5 釋放再引用釋放重引用漏洞(Use after Free, UAF),就是使用到已被釋放的內存,最終導致內存崩潰或任意代碼執(zhí)行的漏洞。UAF漏洞在瀏覽器中是最為常見的,比如IE、Chrome、Firefox等。2005年12月,第一個UAF漏洞CVE-2005-4360被發(fā)現(xiàn)。當時并沒有直接命名為“Use After Free”,僅以遠程拒絕服務歸類。CVE

17、數(shù)據(jù)庫所記錄的UAF漏洞的條目,自2008年開始以超過每年翻一番的速度增長。2022/7/11網(wǎng)絡攻防技術33如果指針所指向的對象被釋放或者回收,但是對該指針沒有作任何修改,以至于該指針仍舊指向已經回收的內存地址,此情況下該指針便稱為懸垂指針。懸垂指針指向的內存空間被回收后會被添加進空閑堆表或位于棧頂之上,操作系統(tǒng)按需操作和使用這些內存空間。如果操作系統(tǒng)將這部分已經釋放的內存重新分配給另一個指針,而原來懸垂指針因為沒及時置空而被再次引用,其后果是難以預期的。2022/7/11網(wǎng)絡攻防技術34懸垂指針懸垂指針棧#include#include using namespace std;int *p

18、=NULL;void fun() int i=10; p=&i;void main() fun(); cout*p= *pendl; /輸出*p=10,因為p依然指向變量i的內存空間 Sleep(1000); cout*p= *pendl;/此時,fun函數(shù)執(zhí)行后1秒,fun函數(shù)中的i變量的??臻g被釋放,輸出*p的值將不可預測2022/7/11網(wǎng)絡攻防技術35懸垂指針堆#include#include using namespace std;void main() int i=10; int *p=(int *)malloc(sizeof(int); *p=i; cout*p= *pendl;

19、 /輸出*p=10 free(p); Sleep(1000); cout“*p= ”*pendl;/此時,fun函數(shù)執(zhí)行后1秒,指針p分配的堆塊被回收,輸出*p的值將不可預測2022/7/11網(wǎng)絡攻防技術36釋放重引用原理生成懸垂指針使用懸垂指針2022/7/11網(wǎng)絡攻防技術37#define size 32int main(int argc, char *argv) char *buf1; char *buf2; buf1 = (char*) malloc(size); printf(“buf1: 0 x%pn”, buf1); free(buf1); /釋放buf1,使得buf1成為懸掛指

20、針 buf2 = (char *) malloc(size); /分配buf2“占坑”buf1的內存位置 printf(“buf2: 0 x%pnn”, buf2); memset(buf2, 0, size); /對buf2進行內存清零 printf(“buf2: %dn”, *buf2);/重引用已釋放的buf1指針,但卻導致buf2值被篡改 printf(“= Use After Free =n”); strncpy(buf1, “hack”, 5); printf(“buf2: %snn”, buf2); free(buf2);UAF漏洞實例2022/7/11網(wǎng)絡攻防技術382022/

21、7/11網(wǎng)絡攻防技術39本章主要內容4.1 概述4.2 典型漏洞類型4.3 溢出漏洞利用原理4.4 漏洞利用保護機制4.3 溢出漏洞利用原理溢出攻擊的基本流程溢出利用的關鍵技術2022/7/11網(wǎng)絡攻防技術404.3.1 溢出攻擊的基本流程2022/7/11網(wǎng)絡攻防技術41(1)在哪里注入“溢出”數(shù)據(jù)?(2)數(shù)據(jù)要多長才能覆蓋返回地址?(3)使用什么內容覆蓋返回地址?(4)執(zhí)行什么樣的攻擊代碼?注入惡意數(shù)據(jù)溢出緩沖區(qū)控制流重定向執(zhí)行有效載荷4.3.2 溢出利用的關鍵技術溢出點定位覆蓋執(zhí)行控制地址覆蓋異常處理結構跳轉地址的確定Shellcode定位和跳轉2022/7/11網(wǎng)絡攻防技術42一、溢出

22、點定位技術 如何確定溢出點位置?探測法反匯編分析?2022/7/11網(wǎng)絡攻防技術43一、溢出點定位技術探測法構造數(shù)據(jù),根據(jù)出錯的情況來判斷。如輸入字符串:2022/7/11網(wǎng)絡攻防技術44探測法int main(int argc, char* argv)char name16;strcpy(name,argv1);printf(“%sn”,name);return 0;例1,棧溢出示例如果輸入:01234567890123456789AAAABBBBCCCCDDDD2022/7/11網(wǎng)絡攻防技術45反匯編分析反匯編分析strcpy(name, (const char*)argv1);00411

23、3C8 mov eax,dword ptr ebp+0Ch 004113CB mov ecx,dword ptr eax+4 004113CE push ecx 004113CF lea edx,ebp-10h 004113D2 push edx 004113D3 call ILT+165(_strcpy) (4110AAh) 2022/7/11網(wǎng)絡攻防技術46二、覆蓋執(zhí)行控制地址執(zhí)行控制地址可包括:覆蓋返回地址覆蓋函數(shù)指針變量覆蓋異常處理結構2022/7/11網(wǎng)絡攻防技術47三、覆蓋異常處理結構異常處理是一種對程序異常的處理機制,它把錯誤處理代碼與正常情況下所執(zhí)行的代碼分開。當程序發(fā)生異常時

24、,系統(tǒng)中斷當前線程,將控制權交給異常處理程序Windows的異常處理機制稱為結構化異常處理(Structured Exception Handling )2022/7/11網(wǎng)絡攻防技術48結構化異常處理與SEH通過異常處理結構鏈(SEH)管理SEH處于棧空間的單向鏈表局部變量異常處理結點EBP (基址指針)EIP(返回地址)Function arguments(參數(shù))內存低端內存高端2022/7/11網(wǎng)絡攻防技術49 異常處理結構鏈TEB(fs:0)EXCEPTION_REGISTRATION下一個回調函數(shù)b的地址0 xFFFFFFFFTop level函數(shù)的地址2022/7/11網(wǎng)絡攻防技術

25、50結構化異常處理與SEH通過異常處理結構鏈(SEH)管理SEH處于??臻g的單向鏈表加入新函數(shù)時采用頭插法2022/7/11網(wǎng)絡攻防技術51何時需要覆蓋異常處理結構由于溢出時破壞了棧結構,可能在函數(shù)返回之前會產生錯誤,此時系統(tǒng)將控制權交給SEH2022/7/11網(wǎng)絡攻防技術52覆蓋異常處理結構TEB(fs:0)EXCEPTION_REGISTRATION從這里開始覆蓋我們可以控制的地址下一個回調函數(shù)2的地址0 xFFFFFFFFTop level函數(shù)的地址shellcode2022/7/11網(wǎng)絡攻防技術53四、跳轉地址的確定跳轉指令的選取jmp esp、call ebx、call ecx等。跳

26、轉指令的搜索范圍用戶空間的任意地址、系統(tǒng)dll、進程代碼段、PEB、TEB跳轉指令地址的選擇規(guī)律2022/7/11網(wǎng)絡攻防技術54五、Shellcode的定位和跳轉2022/7/11網(wǎng)絡攻防技術55Nop Sled:類NOP指令填充,可以是NOP,也可以是inc eax等無副作用指令。Decoder:解碼部分,對Real_Shellcode解碼。Real_Shellcode:真正有意義的shellcode部分,但是經過了編碼處理。Shellcode的基本構成調用者的棧調用參數(shù)Return addressEBP局部變量ShellcodeRNNNNNNNNEBPESPESPESPESPJMP ESPSSSS內存高端五、Shellcode的定位和跳轉2022/7/11網(wǎng)絡攻防技術562022/7/11網(wǎng)絡攻防技術57本章主要內容4.1 概述4.2 典型漏洞類型4.3 溢出漏洞利用原理4.4 漏洞利用保護機制4.3 溢出利用保護機制GS編譯保護機制SafeSEH機制DEP機制ASLR機制2022/7/11網(wǎng)絡攻防技術58GS編譯保護機制StackGuard:修改C編譯器gcc,編譯時,在函數(shù)返回地址之前插入一個隨

溫馨提示

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

最新文檔

評論

0/150

提交評論