




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
6.1緩沖區溢出基本概念
緩沖區是程序運行的時候機器內存中用于存放數據的臨時內存空間,它的長度事先已經被程序或操作系統定義好。緩沖區在系統中的表現形式是多樣的,高級語言定義的變量、數組、結構體等在運行時可以說都是保存在緩沖區內的,因此所謂緩沖區可以更抽象地理解為一段可讀寫的內存區域。高等學校電子信息類“十三五”規劃教材應用型網絡與信息安全工程技術人才培養系列教材高等學校電子信息類“十三五”規劃教材應用型網絡與信息安全工程技術人才培養系列教材6.2緩沖區溢出攻擊方式目前的緩沖區溢出攻擊,可以按照以下方法進行分類:(1)按照溢出位置分類:棧溢出、堆溢出和BSS段溢出。(2)按照攻擊者欲達到的目標分類:在程序的地址空間里植入適當的代碼以及通過適當地初始化寄存器和存儲器從而控制程序轉移到攻擊者安排的地址空間去執行。(3)按照攻擊目標分類:攻擊棧中的返回地址、攻擊棧中保存的舊框架指針、攻擊堆或BSS段中的局部變量或參數、攻擊堆或BSS段中的長跳轉緩沖區。6.2.1棧溢出攻擊原理
棧是一種數據結構,是一種先進后出的數據表。在Windows平臺下,寄存器“EBP”和“ESP”分別指向當前棧幀的棧底和棧頂。函數調用時,一般需要經過以下步驟:
1)參數入棧:參數按一定的順序壓入系統棧,在StdCall約定的情況下,從右到左的順序壓入系統棧。
2)返回地址入棧:將當前代碼區調用指令的下一條指令存入棧中,函數返回時,繼續執行。。
高等學校電子信息類“十三五”規劃教材應用型網絡與信息安全工程技術人才培養系列教材3)指令代碼跳轉:中央處理器從當前的代碼區跳轉到被調用函數的入口處。在示例代碼中,就是跳轉到function函數的入口。示例代碼voidfunction(char*p){charout[10];strcpy(out,p);}/*主函數*/main(){chara[]=”AAAABBBBCC”;function(a);}4)棧楨調整:首先保存當前棧楨,也就是將前棧楨壓入棧,將當前棧楨切換到新棧楨,為新的函數棧楨分配存儲空間。被調用函數執行完之后,返回到調用函數繼續執行,包括以下步驟:
保存返回值:通常將函數的返回值傳給EAX寄存器。
恢復棧頂:在堆棧平衡的基礎上,彈出原先保存的EBP值,并修改ESP值,使調用函數的棧楨成為系統當前棧楨。
指令地址返回:將先前保存的函數返回地址傳給指令指針寄存器。高等學校電子信息類“十三五”規劃教材應用型網絡與信息安全工程技術人才培養系列教材函數調用時棧楨變化圖高等學校電子信息類“十三五”規劃教材應用型網絡與信息安全工程技術人才培養系列教材6.2.2堆溢出攻擊原理
所謂堆,就是由應用程序動態分配的內存區。操作系統中,大部分的內存區是在內核一級被動態分配的,但段是由應用程序來分配的,它在編譯的時候被初始化。非初始化的數據段用于存放程序的靜態變量,這部分內存都是被初始化為零的。在大部分的系統包括系統中,段是向上增長的,向高地址方向增長。堆管理系統主要有三類操作:堆塊分配,堆塊釋放和堆塊合。堆溢出時單鏈表在刪除節點堆溢出攻擊主要有為以下幾類。(1)內存變量:修改能夠影響程序執行的重要標志變量,例如更改身份驗證函數的返回值就可以直接通過認證。(2)代碼邏輯:修改代碼段重要函數的關鍵邏輯,有時可以達到一定的攻擊效果。(3)函數返回地址:通過修改函數的返回地址能夠改變程序執行流程,堆溢出可以利用ArbitraryDwordReset更改函數返回地址。(4)異常處理機制:當程序產生異常時,Windows執行流程會轉入異常處理例程。(5)函數指針:系統有時會使用函數指針,例如C++中的虛函數、動態鏈接庫中的導出函數等。修改這些函數指針后,函數調用時,就可以成功地劫持進程。高等學校電子信息類“十三五”規劃教材應用型網絡與信息安全工程技術人才培養系列教材高等學校電子信息類“十三五”規劃教材應用型網絡與信息安全工程技術人才培養系列教材6.2.3流程跳轉技術
緩沖區溢出的一個非常關鍵的步驟就是要實現進程執行流程跳轉,這也正是緩沖區溢出攻擊的首要目的。只有實現了流程的跳轉,才能在被攻擊的主機上執行所植入的代碼,實現控制被攻擊主機的目的。要實現執行流程跳轉,攻擊者可以通過緩沖區溢出漏洞修改有關執行流程的管理信息,如返回地址。緩沖區溢出攻擊示意圖6.3緩沖區溢出攻擊步驟高等學校電子信息類“十三五”規劃教材應用型網絡與信息安全工程技術人才培養系列教材6.3.1獲取漏洞信息緩沖區溢出漏洞信息的獲取,主要有兩種途徑,一是自己挖掘,二是從漏洞公告中獲得。當前,公布漏洞信息的權威機構主要有公共漏洞公告(CommonVulnerabilitiesandExposures,CVE)和計算機應急響應小組(ComputerEmergencyResponseTeam,CERT)中獲取漏洞信息,如圖所示。高等學校電子信息類“十三五”規劃教材應用型網絡與信息安全工程技術人才培養系列教材6.3.2定位漏洞位置
漏洞位置定位是指確定緩沖區溢出漏洞中發生溢出的指令地址(通常稱為溢出點),并可以在跟蹤調試環境中查看與溢出點相關的代碼區和數據區的詳細情況,根據此信息,精心構造注入的數據。具體來說,通常使用以下三種方法。1)如果受影響程序有源代碼,那么通過調試程序、確定漏洞所在位置,修改源程序就可修復漏洞。2)如果存在緩沖區溢出漏洞的程序,沒有源代碼,則一般采用反匯編法和探測法定位漏洞。3)如果能夠獲得廠商提供的漏洞補丁程序,那么一個有效的辦法是使用補丁比較法。6.3.3更改控制流程高等學校電子信息類“十三五”規劃教材應用型網絡與信息安全工程技術人才培養系列教材
更改控制流程是將系統從正常的控制流程轉向到攻擊者設計的執行流程,其實質就是要執行剛剛注入的SHELLCODE代碼。因為程序執行完函數后會返回到EIP所指向的地址繼續執行,因此覆蓋返回地址可以控制程序的執行流程。該方法是緩沖區溢出漏洞利用時用得最多的一種方法。其它的還有改寫函數指針和改寫異常處理指針。(1)改寫函數指針。(2)改寫異常處理指針。高等學校電子信息類“十三五”規劃教材應用型網絡與信息安全工程技術人才培養系列教材6.4緩沖區溢出攻擊的防范方法
目前有三種基本的方法保護緩沖區免受緩沖區溢出的攻擊和影:強制寫正確的代碼的方法基于探測方法的防御對緩沖區溢出漏洞檢測研究主要分為如下的三類:1)基于源代碼的靜態檢測技術2)基于目標代碼的檢瀏技術3)基于源代碼的動態檢測技術基于操作系統底層的防御1)庫函數的保護2)操作系統內核補丁保護(a)NOEXEC技術(b)ASLR(AddressSpaceLayoutRandomization,地址空間結構隨機化)1.實驗環境WindowsXPSP332-bitVisualC++6.0OllyDbg高等學校電子信息類“十三五”規劃教材應用型網絡與信息安全工程技術人才培養系列教材6.5緩沖區攻擊實驗高等學校電子信息類“十三五”規劃教材應用型網絡與信息安全工程技術人才培養系列教材2.實驗步驟編寫具有緩沖區溢出的程序,程序代碼如下:#include<stdio.h>#include<string.h>#include<windows.h>#defineTEMP_BUFF_LEN8intbof(constchar*buf){ chartemp[TEMP_BUFF_LEN]; strcpy(temp,buf); return0;}
intmain(){ charbuff[]="1234567"; MessageBox(NULL,"SampleBOFTest","SampleBOF",MB_OK); bof(buff); printf("SampleBOFEnd\n"); return0;}編譯上述代碼,生成可執行文件。在OllyDbg中打開程序,如圖所示。高等學校電子信息類“十三五”規劃教材應用型網絡與信息安全工程技術人才培養系列教材
上圖中標注了每個窗口的用途,向下移動“反匯編窗口”可以看到程序的主入口函數“main”函數,以及調用的“bof”函數,如圖所示。高等學校電子信息類“十三五”規劃教材應用型網絡與信息安全工程技術人才培養系列教材高等學校電子信息類“十三五”規劃教材應用型網絡與信息安全工程技術人才培養系列教材
通過“F2”快捷鍵在“main”和“bof”所在行下斷點,利用快捷鍵“F9”執行到斷點處,“F8”單步執行,如圖所示。高等學校電子信息類“十三五”規劃教材應用型網絡與信息安全工程技術人才培養系列教材
在“MessageBox”后下斷點,如下圖所示,程序在為調用“bof”函數準備必要參數,并壓入棧中。高等學校電子信息類“十三五”規劃教材應用型網絡與信息安全工程技術人才培養系列教材
接下來,仔細分析“bof”函數的調用過程,該函數的全部匯編代碼如下圖所示。
從匯編代碼可以看到,函數“bof”首先將“EBP”入棧保存,緊接著將“ESP”賦值給“EBP”。在調用“bof”函數時,程序將參數的地址壓棧保存,而在進入“bof”函數之后,程序為了保存上一個棧的基址,又進行了一次壓棧操作,因此“bof”函數的參數的地址應該位于“ebp+8”的位置處(注意在windows平臺棧是向下生長的)。為了調用“strcpy”函數,程序首先取得“buf”參數的地址并壓棧,接著獲取“temp”變量的地址并壓棧保存,所有參數準備完全,就可以執行“strcpy”函數的調用了。在調用“strcpy”函數之后,程序就執行必要的清理工作然后返回,這就是上面示例代碼所做的工作。在調用“strcpy”函數時,我們并沒有檢查“temp”變量是否有足夠的空間來保存“buf”中的內容,若“buf”中的內容超出“temp”變量的大小,在“buf”內容超過“temp”變量的空間時所引發的錯誤。通常情況下,這類錯誤會導致程序的異常退出。緩沖區溢出利用的實驗代碼如下:#include<stdio.h>#include<string.h>#include<windows.h>#defineTEMP_BUFF_LEN8intbof(constchar*buf){ chartemp[TEMP_BUFF_LEN]; strcpy(temp,buf); return0;}intsbofa(){ MessageBox(NULL, "Congratulations!Youhavethebasicprinciplesofbufferoverflow.", "SampleBOF", MB_OK); return0;}intmain(){ MessageBox(NULL,"SampleBOFTest","SampleBOF",MB_OK); charbuff[]="1234567"; bof(buff); printf("SampleBOFEnd\n"); return0;}
函數地址上述代碼在原有代碼的基礎上只增加了一個“sbofa”函數,注意到我們并沒有調用該函數,而我們需要做的就是通過修改“main”中“buff”的值,使得程序執行“sbofa”函數。同樣,使用“OllyDbg”打開程序,找到程序的入口函數及“sbofa”和“bof”函數。如下圖所示:
從圖中可以看到,函數在調用時,通常是由調用者負責保存返回地址,然后被調用者負責保存調用者的棧幀(EBP),接下來就是函數的臨時變量空間。因此,只要被復制的內容長度大過12,就會覆蓋掉返回地址。知道如何覆蓋返回地址,接下來就只需要知道“sbofa”函數的地址就可以了。程序棧結構如下所示修改“buff”的內容,編譯運行。思考1.從函數地址圖中可以看到“sbofa”函數的地址為“0040100F”,為什么“buff”的內容卻被修改為"123456781234\x0f\x10\x40"?2.程序棧圖中返回地址之上的內容是什么?3.經過上面修改后,能夠執行“sbofa”函數,但是程序依然異常退出,這是為什么?高等學校電子信息類“十三五”規劃教材應用型網絡與信息安全工程技術人才培養系列教材4.利用緩沖區溢出原理
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 電力節能培訓課件
- 電力安全警教育課件
- 提升你的能力2024年模具設計師資格認證考試試題及答案
- 2024年籃球裁判員考試的準備策略與試題與答案
- 2024年云南省公務員考試行測歷年真題試題試卷答案解析
- 建立穩定信心2024年體育經紀人試題及答案
- 2024年6月16日河北省保定市事業單位綜合類《公共基礎知識》和《職業能力測試》試題真題試卷答案解析
- 深化理解2024年農作物種子繁育員考試常識試題及答案
- 中心城區供水提升工程項目可行性研究報告
- 探索2024年游泳救生員資格考試試題
- golf高爾夫介紹課件
- 中國古代文學史(二)正式課件
- 物業管理服務品質檢查表
- 六年級下冊第五單元16表里的生物-表里的生物-學習任務單
- 高中美術《匠心之用-雕塑藝術》“紀念與象征-空間中的實體藝術”課件
- 動火安全作業票填寫模板2022年更新
- 2021年12月英語六級聽力試題、原文及答案 兩套
- 北師版七年級下冊數學 第1章 1.6.2 目標三 整式的化簡求值 習題課件
- 《貿易商務英語》課件Unit 4 Change
- TCWAN 0027-2022 TCEEIA 584-2022 新能源汽車鋁合金電池托盤焊接制造規范
- 煤礦井下絞車房管理制度
評論
0/150
提交評論