




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
典型軟件漏洞分析本講要點1.什么是緩沖區溢出漏洞?2.什么是棧溢出?棧溢出漏洞如何利用?3.什么是堆溢出?堆溢出漏洞如何利用?4.什么是格式化字符串漏洞?該漏洞如何利用?5.針對緩沖區溢出漏洞,Windows平臺設置了哪些保護機制?1.什么是緩沖區溢出漏洞?(1)內存結構Win32系統中,進程使用的內存按功能可以分4個區域堆區棧區代碼區數據區高端內存區域(高地址)低端內存區域(低地址)堆增長方向棧增長方向該區域內存由系統自動分配,用于動態存儲函數之間的調用關系用于存儲全局變量和靜態變量存放程序匯編后的機器代碼和只讀數據該區域內存由進程利用相關函數或運算符動態申請,用完后釋放并歸還給堆區。例如,C語言中用malloc/free函數,C++語言中用new/delete運算符申請的空間就在堆區。1.什么是緩沖區溢出漏洞?(2)緩沖區程序中所使用的緩沖區可以是堆區和棧區,也可以是存放靜態變量的數據區。由于進程中各個區域都有自己的用途,根據緩沖區利用的方法和緩沖區在內存中所屬區域,其可分為棧溢出和堆溢出。1.什么是緩沖區溢出漏洞?(3)緩沖區溢出漏洞緩沖區溢出漏洞就是在向緩沖區寫入數據時,由于沒有做邊界檢查,導致寫入緩沖區的數據超過預先分配的邊界,從而使溢出數據覆蓋在合法數據上而引起系統異常的一種現象。目前,緩沖區溢出漏洞普遍存在于各種操作系統(Windows、Linux、Solaris、FreeBSD、HP-UX以及IBMAIX),以及運行在操作系統上的各類應用程序中。2.什么是棧溢出?棧溢出漏洞如何利用?(1)函數的棧幀在程序設計中,棧通常指的是一種后進先出的數據結構。相對于廣義的棧而言,棧幀是操作系統為進程中的每個函數調用劃分的一個空間,每個棧幀都是一個獨立的棧結構,而系統棧則是這些函數調用棧幀的集合。系統棧由系統自動維護,用于實現高級語言中函數的調用。2.什么是棧溢出?棧溢出漏洞如何利用?(1)函數的棧幀當函數被調用時,系統會為這個函數開辟一個新的棧幀,并把它壓入棧區中,所以正在運行的函數總是在系統棧區的棧頂(本書稱為:當前棧幀)。當函數返回時,系統會彈出該函數所對應的棧幀空間。棧幀的生長方向是從高地址向低地址增長的。main函數棧幀intfunc_B(){......}intfunc_A(){func_B();}intmain(){func_A();}EBPfunc_A函數棧幀func_B函數棧幀未使用的棧區ESP
棧增長方向高地址低地址2.什么是棧溢出?棧溢出漏洞如何利用?(1)函數的棧幀ESP:擴展棧指針(ExtendedStackPointer)寄存器,其存放的指針指向當前棧幀的棧頂。EBP:擴展基址指針(ExtendedBasePointer)寄存器,其存放的指針指向當前棧幀的棧底。顯然,ESP與EBP之間的空間即為當前棧幀空間。main函數棧幀intfunc_B(){......}intfunc_A(){func_B();}intmain(){func_A();}EBPfunc_A函數棧幀func_B函數棧幀未使用的棧區ESP
棧增長方向高地址低地址2.什么是棧溢出?棧溢出漏洞如何利用?(1)函數的棧幀一個函數棧幀中主要包含如下信息。1)前一個棧幀的棧底位置,即前棧幀EBP,用于在函數調用結束后恢復主調函數的棧幀(前棧幀的棧頂可計算得到)。2)該函數的局部變量。3)函數調用的參數。4)函數的返回地址RET,用于保存函數調用前指令的位置,以便函數返回時能恢復到調用前的代碼區中繼續執行指令。2.什么是棧溢出?棧溢出漏洞如何利用?(2)函數調用的步驟1)參數入棧。將被調用函數的實際參數從右到左依次壓入主調函數的函數棧幀中。2)返回地址RET入棧。將當前指令的下一條指令地址壓入主調函數的函數棧幀中。3)代碼區跳轉。CPU從當前代碼區跳轉到被調用函數的入口,EIP指向被調用函數的入口處。4)將當前棧幀調整為被調用函數的棧幀2.什么是棧溢出?棧溢出漏洞如何利用?(2)函數調用的步驟①將主調函數的棧幀底部指針EBP入棧,以便被調用函數返回時恢復主調函數的棧幀。②更新當前棧幀底部:將主調函數的棧幀頂部指針ESP的值賦給EBP,作為新的當前棧幀(即被調用函數的棧幀)底部。③為新棧幀分配空間:ESP減去適當的值,作為新的當前棧幀的棧頂。4)將當前棧幀調整為被調用函數的棧幀2.什么是棧溢出?棧溢出漏洞如何利用?(2)函數調用的步驟①保存返回值。將函數的返回值保存在寄存器EAX中。②彈出當前棧幀,將前一個棧幀(即主調函數棧幀)恢復為當前棧幀返回主調函數的步驟2.什么是棧溢出?棧溢出漏洞如何利用?(2)函數調用的步驟降低棧頂,回收當前棧幀的空間;②彈出當前棧幀,將前一個棧幀(即主調函數棧幀)恢復為當前棧幀彈出當前EBP指向的值(即主調函數的棧幀EBP),并存入EBP寄存器彈出返回地址RET,并存入EIP寄存器,使進程跳轉到新的EIP所指執行指令處(即返回主調函數)。使得EBP指向主調函數棧幀的棧底。2.什么是棧溢出?棧溢出漏洞如何利用?(3)棧溢出漏洞基本原理在函數的棧幀中,局部變量是順序排列的,局部變量下面緊跟著的是前棧幀EBP以及函數返回地址RET。如果這些局部變量為數組,由于存在越界的漏洞,那么越界的數組元素將會覆蓋相鄰的局部變量,甚至覆蓋前棧幀EBP以及函數返回地址RET,從而造成程序的異常。2.什么是棧溢出?棧溢出漏洞如何利用?(3)棧溢出漏洞基本原理1)棧溢出修改相鄰變量由于C語言中沒有數組越界檢查,因此,當用戶輸入的口令超過2個字節時,將會覆蓋緊鄰的password數組。2.什么是棧溢出?棧溢出漏洞如何利用?(3)棧溢出漏洞基本原理1)棧溢出修改相鄰變量如果用戶增加輸入字符串的長度,將會超過password數組的邊界,從而覆蓋前棧幀EBP,甚至是覆蓋返回地址RET。當返回地址RET被覆蓋后,將會造成進程執行跳轉的異常。2.什么是棧溢出?棧溢出漏洞如何利用?(3)棧溢出漏洞基本原理2)棧溢出后修改返回地址RET棧溢出后修改相鄰變量這種漏洞利用對代碼環境的要求比較苛刻。更常用的棧溢出修改的目標往往不是某個變量,而是棧幀中的EBP和函數返回地址RET等值。接下來例3-3演示的是,將一個有效指令地址寫入返回地址區域中,這樣就可以讓CPU跳轉到我們希望執行的指令處,從而達到控制程序執行流程的目的。2.什么是棧溢出?棧溢出漏洞如何利用?(3)棧溢出漏洞基本原理2)棧溢出后修改返回地址RET將password.txt文件中最后4個字節改為Attack()函數的入口地址0x0040100F。函數調用返回時,從棧幀中彈出返回地址,存入EIP中。此時EIP=0x0040100F,CPU按該地址去獲取指令,跳轉到Attack()函數。2.什么是棧溢出?棧溢出漏洞如何利用?(4)棧溢出攻擊實際攻擊中,攻擊者通過緩沖區溢出改寫的目標往往不是某一個變量,而是棧幀高地址的EBP和函數的返回地址等值。通過覆蓋程序中的函數返回地址和函數指針等值,攻擊者可以直接將程序跳轉到其預先設定或已經注入到目標程序的代碼上去執行。棧溢出攻擊是一種利用棧溢出漏洞所進行的攻擊行動,目的在于擾亂具有某些特權運行的程序的功能,使得攻擊者取得程序的控制權,如果該程序具有足夠的權限,那么整個主機就被控制了。2.什么是棧溢出?棧溢出漏洞如何利用?(4)棧溢出攻擊1)JMPESP覆蓋方法在實際的漏洞利用中,由于動態鏈接庫的裝入和卸載等原因,Windows進程的函數棧幀可能發生移位,即Shellcode在內存中的地址是動態變化的,所以上述采用直接賦地址值的簡單方式在以后的運行過程中會出現跳轉異常。可以在覆蓋返回地址的時候用系統動態鏈接庫中某條處于高地址且位置固定的跳轉指令所在的地址進行覆蓋,然后再通過這條跳轉指令指向動態變化的Shellcode地址。這樣便能夠確保程序執行流程在目標系統運行時可以被如期進行。2.什么是棧溢出?棧溢出漏洞如何利用?(4)棧溢出攻擊1)JMPESP覆蓋方法JMPESP覆蓋方法是覆蓋函數返回地址的一種攻擊方式。考慮到函數返回時ESP總是指向函數返回后的下一條指令,根據這一特點,如果用指令JMPESP的地址覆蓋返回地址,則函數也可以跳轉到函數返回后的下一條指令,而從函數返回后的下一條指令開始都已經被Shellcode所覆蓋,那么程序就可以跳轉到該Shellcode上并執行,從而實現了程序流程的控制。2.什么是棧溢出?棧溢出漏洞如何利用?(4)棧溢出攻擊1)SEH覆蓋方法SEH覆蓋方法就是覆蓋異常處理程序地址的一種攻擊方式。由于SHE結構存放在棧中,因此攻擊者可以利用棧溢出漏洞,設計特定的溢出數據,將SEH中異常函數的入口地址覆蓋為Shellcode的起始地址或可以跳轉到Shellcode的跳轉指令地址,從而導致程序發生異常時,Windows異常處理機制執行的不是預設的異常處理函數,而是Shellcode。3.什么是堆溢出?堆溢出漏洞如何利用?(1)堆的基本知識1)堆與棧的區別3.什么是堆溢出?堆溢出漏洞如何利用?(1)堆的基本知識2)堆的結構堆區一開始的堆表區中有一個128項的指針數組,被稱為空表索引(freelistarray)。該數組的每一項包括兩個指針,用于表示一個空表。空表索引的第二項free[1]標識了堆中所有大小為8字節的空閑堆塊,之后每個索引項指示的空閑塊遞增8字節3.什么是堆溢出?堆溢出漏洞如何利用?(2)堆溢出漏洞及利用如果能夠修改鏈表節點的指針,在“卸下”和“鏈入”的過程中就有可能獲得一次讀寫內存的機會。1)DWORDShoot堆溢出利用的精髓就是用精心構造的數據去溢出覆蓋下一個堆塊的塊首,使其改寫塊首中的前向指針(flink)和后向指針(blink),然后在分配、釋放、合并等操作發生時伺機獲得一次向內存任意地址寫入任意數據的機會。攻擊者可以進而劫持進程,運行shellcode。3.什么是堆溢出?堆溢出漏洞如何利用?(2)堆溢出漏洞及利用1)DWORDShootnodefakeblink步驟2:“卸掉”被修改過塊首的結點時,導致目標地址的內容被修改為4字節的惡意數據。步驟1:堆中發生溢出,攻擊者淹沒第二個堆塊的塊首,從而偽造了前向、后向指針的值。fakeflinknodeblinkflinknodeblinkflink偽造后的后向指針(目標內存的地址)偽造后的前向指針(4字節惡意數據)nodefakeblinkfakeflinknodeblinkflinknodeblinkflink偽造后的后向指針(目標內存的地址)偽造后的前向指針(4字節惡意數據)目標內存node->blink->flink=node->flink;3.什么是堆溢出?堆溢出漏洞如何利用?(2)堆溢出漏洞及利用2)HeapSpray棧溢出和堆溢出相結合的一種技術。首先將shellcode放置到堆中,然后在棧溢出時,控制函數執行流程,跳轉到堆中執行shellcode。4.什么是格式化字符串漏洞?如何利用?(1)格式化串漏洞格式化字符串(簡稱格式化串)的漏洞本身并不算緩沖區溢出漏洞,這里作為一類比較典型的系統函數存在的漏洞做一介紹。格式化串漏洞的產生源于數據輸出函數中對輸出格式解析的缺陷,其根源也是C語言中不對數組邊界進行檢查的緩沖區錯誤。4.什么是格式化字符串漏洞?如何利用?(1)格式化串漏洞printf函數進行格式化輸出時,會根據格式化串中的格式化控制符在棧上取相應的參數,然后按照所需格式輸出。如果函數調用給出的輸出數據列表少于格式控制符個數,甚至于沒有給出輸出數據列表,系統仍然會按照格式化串中格式化控制符的個數輸出棧中的數據。4.什么是格式化字符串漏洞?如何利用?(2)格式化串漏洞利用格式化串漏洞的利用可以通過如下方法實現:通過改變格式化串中輸出參數的個數實現修改指定地址的值:可以修改填充字符串長度實現;也可以通過改變輸出的寬度實現,如%8d。通過改變格式化串中格式符的個數,調整格式符對應參數在棧中位置,從而實現對棧中特定位置數據的修改。4.什么是格式化字符串漏洞?如何利用?(2)格式化串漏洞利用格式化串漏洞是一類真實存在、并且是危害較大的漏洞,但是相對于棧溢出等漏洞而言,實際案例并不多。格式化串漏洞的形成原因較為簡單,只要通過靜態掃描等方法,就可以發現這類漏洞。在VisualStudio2005以上版本中的編譯級別對參數進行了檢查,且默認情況下關閉了對%n控制符的使用。5.Windows平臺溢出漏洞保護機制(1)棧溢出檢測選項/GS調用函數時將一個隨機生成的秘密值存放在棧上,當函數返回時,檢查這個堆棧檢測儀的值是否被修改,以此判斷是否發生了棧溢出。5.Windows平臺溢出漏洞保護機制(1)棧溢出檢測選項/GS如果編譯器啟用了/GS選項,那么當程序編譯時,它首先會計算出程序的一個安全Cookie;然后將安全Cookie保存在加載模塊的數據區中,在函數調用之時,這個Cookie被復制到棧中,位于RET返回地址、EBP與局部變量之間;在函數調用結束時,程序會把這個Cookie和事先保存的Cookie進行比較。如果不相等,就說明進程的系統棧被破壞,需要終止程序運行。在典型的緩沖區溢出中,棧上的返回地址會被數據所覆蓋,但在返回地址被覆蓋之前,安全Cookie早已經被覆蓋了,因此在函數調用結束時檢查Cookie會發現異常,并終止程序,這將導致漏洞利用的失效。5.Windows平臺溢出漏洞保護機制(1)棧溢出檢測選項/GS對抗/GS保護:圍繞Cookie值展開的。猜測Cookie值通過同時替換棧中的Cookie和Cookie副本覆蓋SEH繞過Cookie檢查覆蓋父函數的棧數據繞過Cookie檢查5.Windows平臺溢出漏洞保護機制(2)數據執行保護DEP(DataExecutionPrevention)通過使可寫內存不可執行或使可執行內存不可寫來消除類似的威脅。VisualStudio編譯器提供了一個鏈接標志(/NXCOMPAT),可以在生成目標應用程序時使程序啟用DEP保護。5.Windows平臺溢出漏洞保護機制對抗數據執行保護DEP:執行已經加載的模塊中的指令或調用系統函數則不受DEP影響,而棧上的數據只需作為這些函數/指令的參數即可。利用ret-to-libc執行命令或進行API調用,如調用WinExec實現執行程序。將包含Shellcode的內存頁面標記為可執行,然后再跳過去執行。通過分配可執行內存,再將Shellcode復制到內存區域,然后跳過去執行。先嘗試關閉當前進程的DEP保護,然后再運行Shellcode。5.Windows平臺溢出漏洞保護機制(3)地址空間布局隨機化ASLR通過對堆、棧、共享庫映射等線性區域布局的隨機化,增加攻擊者預測目的地址的難度,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 行政組織與社會動態變化的適應性試題及答案
- 網絡架構設計原則試題及答案
- 數據庫中間件應用實例試題及答案
- 測試需求管理與跟蹤試題及答案
- 公路工程施工組織設計試題及答案解析
- 計算機四級軟件測試全景總結試題及答案
- 培訓學校實訓管理制度
- 小學學生考勤管理制度
- 深入探索2025年網絡技術考試試題及答案
- 嵌入式無線通信技術試題及答案
- 王維詩詞課件
- 機械制造業質量管控流程指南
- 反訴狀(業主反訴物業)(供參考)
- 河道景觀設計合同范本
- 海外倉合同范本
- 2024婦科惡性腫瘤抗體偶聯藥物臨床應用指南(完整版)
- 2024-2029全球及中國電氣電子中的CFD行業市場發展分析及前景趨勢與投資發展研究報告
- 中國法律史-第三次平時作業-國開-參考資料
- 懸挑腳手架及卸料平臺監理旁站記錄表
- 神志病中西醫結合臨床診療指南-精神分裂癥
- 人教部編版六年級語文下冊第五單元(教案)
評論
0/150
提交評論