freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

com組件棧緩沖區(qū)溢出漏洞檢測(cè)技術(shù)研究-碩士學(xué)位論文-資料下載頁

2025-06-28 08:21本頁面
  

【正文】 行測(cè)試。Fuzz 是可定制的,用戶可以通過設(shè)置不同的選項(xiàng)來對(duì)軟件進(jìn)行不同類型的測(cè)試。即可用它來發(fā)現(xiàn)SQL注入、格式串、緩沖區(qū)溢出、目錄遍歷和其它漏洞。這種工具可以發(fā)現(xiàn)一些軟件中的緩沖區(qū)溢出漏洞,但是這種對(duì)潛在漏洞的搜索19華 中 科 技 大 學(xué) 碩 士 學(xué) 位 論 文是強(qiáng)力性和無策略的,而執(zhí)行路徑一般不可能完全估計(jì)到,因此存在潛在漏洞的可能性。另外,F(xiàn)uzz 執(zhí)行時(shí)間很難估計(jì),而且該工具給出的結(jié)果僅僅是一種判斷,漏洞在源碼中的具體位置不能確定。 現(xiàn)有緩沖區(qū)溢出檢測(cè)技術(shù)總結(jié)靜態(tài)檢測(cè)技術(shù)(1)由于在靜態(tài)環(huán)境下很難獲得精確的棧的使用情況和遞歸調(diào)用的次數(shù),而且靜態(tài)工具也難以分析多線程環(huán)境,所以靜態(tài)工具只能檢測(cè)部分棧溢出漏洞;(2)靜態(tài)分析工具的分析結(jié)果通常會(huì)包含大量的錯(cuò)誤信息,由此帶來很多額外的人工檢查工作;(3)相對(duì)動(dòng)態(tài)檢測(cè)技術(shù)而言,靜態(tài)檢測(cè)技術(shù)不需要實(shí)際發(fā)生棧溢出,而動(dòng)態(tài)檢測(cè)技術(shù)只有在棧溢出發(fā)生時(shí)才能檢測(cè)到,由于測(cè)試代碼不太可能對(duì)所有的程序進(jìn)行完全的覆蓋測(cè)試,因此動(dòng)態(tài)情況下有些棧溢出的代碼實(shí)際上不能被觸發(fā),而靜態(tài)分析工具有時(shí)能夠檢測(cè)出這樣的一些棧溢出情況。所以靜態(tài)檢測(cè)技術(shù)不能作為檢測(cè)棧緩沖區(qū)溢出的主要手段,但作為其他方法的補(bǔ)充還是很有價(jià)值的。動(dòng)態(tài)檢測(cè)技術(shù)(1)基于源碼的動(dòng)態(tài)檢測(cè)技術(shù)必須依賴源代碼 [45]。目前主要有兩種實(shí)現(xiàn)方法:擴(kuò)展編譯器的方法,實(shí)現(xiàn)難度比較高,需要重新編譯源代碼,但是能夠提供比較完整的棧操作的信息和函數(shù)的信息;直接修改源碼的方法,實(shí)現(xiàn)難度低,但可能會(huì)帶來一些誤操作,而且需要大量的人力。(2)基于二進(jìn)制碼的動(dòng)態(tài)檢測(cè)技術(shù)主要有三種實(shí)現(xiàn)方法:靜態(tài)修改二進(jìn)制碼的方法,基于反匯編的修改方法容易出現(xiàn)反匯編的錯(cuò)誤,導(dǎo)致檢測(cè)效果大打折扣,甚至可能造成代碼的運(yùn)行不正常,基于調(diào)試信息的修改方法實(shí)際上還是要依賴于源代碼;動(dòng)態(tài)修改二進(jìn)制碼的方法,libverify 不能檢測(cè)出靜態(tài)鏈接代碼的棧溢出錯(cuò)誤,而函數(shù)出入口替換技術(shù)目前只能用在特殊編譯模式下的代碼。(3)動(dòng)態(tài)檢測(cè)技術(shù)在檢測(cè)到溢出時(shí),通常是終止程序的執(zhí)行,這雖然防范了攻20華 中 科 技 大 學(xué) 碩 士 學(xué) 位 論 文擊,但同時(shí)帶來了拒絕服務(wù)攻擊;(4)動(dòng)態(tài)檢測(cè)技術(shù)最主要的缺點(diǎn)是只能檢測(cè)出真正發(fā)生動(dòng)態(tài)溢出的代碼,而實(shí)際中只有極少量的測(cè)試用例可以觸發(fā)棧溢出,因此動(dòng)態(tài)檢測(cè)技術(shù)并不能檢測(cè)出所有可能的棧溢出。所以,動(dòng)態(tài)檢測(cè)技術(shù)作為棧緩沖區(qū)溢出檢測(cè)的主流技術(shù),已經(jīng)可以檢測(cè)出大量的棧溢出漏洞,而且自動(dòng)化程度高,但仍不能全面的檢測(cè)出漏洞。因此軟件開發(fā)人員應(yīng)同時(shí)運(yùn)用靜態(tài)檢測(cè)技術(shù)和動(dòng)態(tài)檢測(cè)技術(shù),在軟件編碼和運(yùn)行階段分別開展檢測(cè),從而提高對(duì)棧溢出漏洞的檢測(cè)效果。 小結(jié)本章首先介紹了 COM 組件,然后對(duì)緩沖區(qū)溢出的機(jī)理做了分析。重點(diǎn)介紹了棧緩沖區(qū)溢出的原因和分類,同時(shí)比較分析了現(xiàn)有的棧緩沖區(qū)溢出檢測(cè)技術(shù)和工具。下一章將介紹 COM 組件棧緩沖區(qū)溢出漏洞檢測(cè)技術(shù)。21華 中 科 技 大 學(xué) 碩 士 學(xué) 位 論 文3 COM 組件棧緩沖區(qū)溢出漏洞檢測(cè)技術(shù)造成緩沖區(qū)溢出的根本原因是非類型安全語言(如 C++/C)沒有對(duì)內(nèi)存訪問進(jìn)行邊界檢查。換言之,出現(xiàn)緩沖區(qū)溢出問題的程序大都是 C++/C 語言編寫的程序。因此論文中研究的 COM 組件棧緩沖區(qū)溢出漏洞檢測(cè)技術(shù)的研究對(duì)象默認(rèn)是借助Visual C++ 的 ATL(Active Template Library)開發(fā)得來的。鑒于 COM 組件是符合特定規(guī)范的 C++程序,對(duì) COM 組件緩沖區(qū)溢出漏洞的檢測(cè)可以建立在對(duì)普通程序(C/C++程序)緩沖區(qū)溢出漏洞檢測(cè)的基礎(chǔ)上,再結(jié)合COM 組件的特性,達(dá)到預(yù)期的研究目標(biāo)。論文中提出的檢測(cè)技術(shù)和目前已有的基于二進(jìn)制代碼的靜態(tài)檢測(cè)技術(shù)的不同點(diǎn)在于:對(duì)象不同基于二進(jìn)制代碼的靜態(tài)檢測(cè)技術(shù)的研究對(duì)象是一般意義的 C/C++程序,但論文中的檢測(cè)技術(shù)是針對(duì)源碼未知的 COM 組件。雖然 COM 組件在實(shí)際應(yīng)用中大部分是通過 C++開發(fā)的,但是因?yàn)槠渥裱?COM 規(guī)范,所以在結(jié)構(gòu)和特性上與一般的C/C++程序差別很大,這也就造成了檢測(cè)技術(shù)的不同。危險(xiǎn)函數(shù)庫不同一般的 C/C++程序中使用的是 C 類型字符串,以‘\0’截?cái)喾麡?biāo)識(shí)字符串的結(jié)束,這類型字符串的操作函數(shù)都是常規(guī)的字符串操作函數(shù),如 strcpy,strcat 等,它們中的一些可能導(dǎo)致緩沖區(qū)溢出問題的操作函數(shù)構(gòu)成危險(xiǎn)函數(shù)庫。但是 COM 組件使用的是混合類型字符串,這就導(dǎo)致了常規(guī)字符串操作函數(shù)的失效,需要根據(jù) COM 組件的字符串操作函數(shù)建立特殊的危險(xiǎn)函數(shù)庫。這是進(jìn)行緩沖區(qū)溢出檢測(cè)的首要工作。核心算法不同論文中提出的系統(tǒng),是基于 IDA 的 IDC 腳本語言開發(fā)的。通過對(duì)組件的接口分析,獲取組件接口函數(shù)的線性地址,根據(jù)該線性地址準(zhǔn)確定位至待測(cè)的組件函數(shù)。在檢測(cè)范圍內(nèi)定位危險(xiǎn)函數(shù),識(shí)別危險(xiǎn)函數(shù)的參數(shù)類型,根據(jù)不同類型獲取參數(shù)賦值操作從而計(jì)算參數(shù)代表的緩沖區(qū)的分配長度和使用長度,進(jìn)而進(jìn)行溢出漏洞判斷。22華 中 科 技 大 學(xué) 碩 士 學(xué) 位 論 文同時(shí)提取函數(shù)依賴關(guān)系圖,將以上信息以 XML 的格式輸出,為 COM 組件的后續(xù)分析提供良好的輸入信息。識(shí)別匯編代碼中與棧溢出相關(guān)的語法成分和建立適用 COM 組件的危險(xiǎn)函數(shù)庫是論文檢測(cè)的關(guān)鍵技術(shù)。本章將研究如何從匯編代碼中識(shí)別高級(jí)語言的關(guān)鍵結(jié)構(gòu)和建立 COM 組件危險(xiǎn)函數(shù)庫。 函數(shù)的識(shí)別 一般函數(shù)的識(shí)別函數(shù)是過程設(shè)計(jì)語言與面向?qū)ο笤O(shè)計(jì)語言的主要結(jié)構(gòu)單元,因而,對(duì)匯編代碼的分析通常是從識(shí)別函數(shù)以及傳遞給它們的參數(shù)開始 [46]。在絕大多數(shù)情況下,編譯器都使用 CALL 和 RET 專用機(jī)器指令來調(diào)用函數(shù)與返回到調(diào)用位置。CALL 指令將緊接在它之后的指令的地址壓入堆棧的頂部,而 RET指令則將該地址彈出來,并把控制傳遞給它。如果被調(diào)函數(shù)平衡堆棧,那么被調(diào)函數(shù)通過 RET n 指令結(jié)束調(diào)用,其中,n 是在函數(shù)返回時(shí)從堆棧彈出的字節(jié)數(shù)。如果調(diào)用函數(shù)平衡堆棧,那么被調(diào)用函數(shù)通過RET 指令結(jié)束調(diào)用。在下文中,除非特別聲明,否則都認(rèn)為函數(shù)通過 RET 指令結(jié)束調(diào)用。絕大多數(shù)非優(yōu)化編譯器會(huì)在函數(shù)的開頭放入稱為起始標(biāo)志的代碼,起始標(biāo)志如圖 所示。p u s h e b pm o v e b p , e s ps u b e s p , x x圖 匯編代碼中函數(shù)的起始標(biāo)志當(dāng)打開被調(diào)用函數(shù)的棧幀時(shí),首先保存前棧幀的 EBP,然后棧頂指針寄存器(ESP )的當(dāng)前值復(fù)制到 EBP 之中,即打開堆棧頁面,并且 ESP 的值會(huì)隨著為該局部變量分配的內(nèi)存塊大小而不斷減少,最后為函數(shù)局部變量分配內(nèi)存空間。(PUSH EBP) (MOV EBP,ESP) (SUB ESP,XX)序列可用于找到分析?23華 中 科 技 大 學(xué) 碩 士 學(xué) 位 論 文文件中的所有函數(shù),包括那些沒有對(duì)它們進(jìn)行直接引用的函數(shù)。但是對(duì)于優(yōu)化編譯器,不需要分配一個(gè)專用的寄存器(EBP)進(jìn)行局部變量的尋址,通過使用 ESP 寄存器就可實(shí)現(xiàn)對(duì)局部變量進(jìn)行尋址。在這種情況下,優(yōu)化函數(shù)的起始標(biāo)志僅僅含有一條 SUB ESP,XXX 指令,在這種情況下函數(shù)起始序列太短而不能當(dāng)作辨認(rèn)函數(shù)的標(biāo)記。在“生命”的結(jié)束時(shí)期,函數(shù)通過向下(高端地址)移動(dòng)堆棧指針而關(guān)閉堆棧頁面,然后恢復(fù) EBP 的先前值(僅當(dāng)編譯器通過 EBP 進(jìn)行尋址時(shí)) 。函數(shù)的結(jié)束標(biāo)志如圖 所示。m o v e s p , e b pp o p e b pr e t圖 匯編代碼中函數(shù)的結(jié)束標(biāo)志(MOV ESP,EBP )和( POP EBP)指令不需要緊接在一起,它們之間可以用其他指令進(jìn)行分隔。因而,使用上下文搜索對(duì)于尋找結(jié)束標(biāo)志是不合適的。但是不管函數(shù)遵循何種調(diào)用約定,函數(shù)均通過 RET 指令或 RET n 指令終止調(diào)用。所以 RET 對(duì)于表示函數(shù)的結(jié)束是足夠的,但并不是任何結(jié)束標(biāo)志都是函數(shù)的結(jié)束,如果函數(shù)體內(nèi)有多個(gè) RET 操作符(一般情況就是這樣的) ,編譯器通常為每個(gè) RET操作符生成一個(gè)結(jié)束標(biāo)志,所以需要檢查在結(jié)束標(biāo)志之后是否有新的結(jié)束標(biāo)志,或者是否后面還有舊函數(shù)的代碼。識(shí)別函數(shù)就是把匯編代碼中出現(xiàn)的函數(shù)代碼范圍識(shí)別出來。在匯編代碼中,函數(shù)的起始地址可以通過起始標(biāo)志確定或通過 CALL 指令的操作數(shù)直接或間接定位。而函數(shù)最后都是以“ret”的形式返回的,但并不是出現(xiàn) ret 的地方就是函數(shù)結(jié)束的地方。所以根據(jù)程序本身的流程,可以得到函數(shù)代碼段識(shí)別算法 。24華 中 科 技 大 學(xué) 碩 士 學(xué) 位 論 文算法 函數(shù)代碼段識(shí)別算法輸入:函數(shù)模塊的起始地址 addr_start輸出:函數(shù)模塊的結(jié)束地址 addr_end算法:addr_scan=addr_start;Begin:確定從 addr_scan 開始的第一條 ret 指令的地址 addr_end;if(addr_start 到 addr_end 之間不存在跳轉(zhuǎn)指令)return addr_end;取出 addr_start 到 addr_end 之間所有跳轉(zhuǎn)地址的最大值 addr_jmp;if(addr_jmp=addr_end)return addr_end。addr_scan=addr_jmp;goto Begin。該算法的時(shí)間復(fù)雜度為 O(n),其中 n 代表函數(shù)匯編代碼的規(guī)模。 庫函數(shù)的識(shí)別成熟的軟件開發(fā)中會(huì)大量使用標(biāo)準(zhǔn)庫函數(shù),以增強(qiáng)軟件的健壯性。但對(duì)于庫函數(shù)的識(shí)別核心是識(shí)別庫函數(shù)名以明確其功能。對(duì)于一些標(biāo)準(zhǔn)庫函數(shù),可通過一些成熟的反匯編工具實(shí)現(xiàn)快速自動(dòng)識(shí)別。IDA的一項(xiàng)革命性的工作是庫文件快速識(shí)別與鑒定技術(shù)(Fast Library Identification and Recognition Technology,簡稱 FLIRT) 。這項(xiàng)技術(shù)使 IDA 能在一系列編譯器的標(biāo)準(zhǔn)庫文件里自動(dòng)找出調(diào)用的函數(shù),使反匯編清單清晰明了。但 IDA 一般情況下不能識(shí)別出所有的庫函數(shù)。而庫函數(shù)的識(shí)別對(duì)于逆向工作的質(zhì)量和效率都有很大的影響。這時(shí),可以考慮通過用庫函數(shù)的機(jī)器碼匹配靜態(tài)庫文25華 中 科 技 大 學(xué) 碩 士 學(xué) 位 論 文件的機(jī)器碼的方法來識(shí)別庫函數(shù) [47,48],如圖 所示。分析識(shí)別編譯器識(shí)別出執(zhí)行程序?qū)?yīng)的源碼所用的編譯器,這是能否正確識(shí)別靜態(tài)庫的前提??梢越柚幾g器編譯所產(chǎn)生的其他特殊信息,可以很好的達(dá)到識(shí)別執(zhí)行程序所用編譯器的目的。P E 文 件匯 編 代 碼 識(shí) 別 編 譯 器識(shí) 別 函 數(shù) 模 塊 建 立 函 數(shù) 庫識(shí) 別 庫 函 數(shù)匹 配 算 法反 匯 編 分 析 識(shí) 別圖 通過機(jī)器碼匹配識(shí)別庫函數(shù)的方法流程建立函數(shù)庫當(dāng)根據(jù) PE 文件識(shí)別出該 PE 文件所用的編譯器時(shí),選取該編譯器常用的 lib 文件。由于這些庫文件都是 COFF 結(jié)構(gòu)形式的,所以可以通過分析 COFF 文件格式得到庫文件中的所有函數(shù)的函數(shù)名、函數(shù)代碼等信息??梢圆捎?Visual C++ 自帶的工具 dumpbin 獲取上述信息,如圖 所示,是從 中獲取的 printf 函數(shù)的匯編代碼。因?yàn)榫幾g器在編譯時(shí)會(huì)采取重定位操作,并且函數(shù)的參數(shù)會(huì)有變動(dòng),所以匯編指令的操作數(shù)會(huì)改變,但這不影響函數(shù)模塊的匹配。26華 中 科 技 大 學(xué) 碩 士 學(xué) 位 論 文圖 從 中獲取的 printf 函數(shù)的匯編代碼匹配算法該匹配算法就是從靜態(tài)庫建立起來的函數(shù)庫中找出一個(gè)函數(shù)與識(shí)別出的函數(shù)代碼的操作碼序列相等,關(guān)于該算法,已有比較成熟的研究,詳看參考文獻(xiàn)[49]中所提到的算法。對(duì)于最后的匹配結(jié)果,可能有多個(gè)函數(shù)結(jié)果集滿足要求,通過實(shí)際的反編譯過程發(fā)現(xiàn),這種比例只占整個(gè)靜態(tài)庫中 1%3%左右,可以基本上滿足需求。 參數(shù)的識(shí)別區(qū)分函數(shù)的參數(shù)是對(duì)程序的反匯編結(jié)果進(jìn)行分析的關(guān)鍵步驟。給函數(shù)傳遞參數(shù)的方式有三種:利用堆棧傳遞參數(shù)、利用寄存器傳遞參數(shù)以及通過全局變量進(jìn)行隱含參數(shù)的傳遞。參數(shù)的正確識(shí)別取決于函數(shù)調(diào)用約定(Calling Convention)的判斷。調(diào)用約定決定以下內(nèi)容:函數(shù)參數(shù)的壓棧順序;由調(diào)用者還是被調(diào)用者把參數(shù)彈出棧;產(chǎn)生函數(shù)修飾名的方法。函數(shù)調(diào)用有多種機(jī)制,每種機(jī)制都有自己的優(yōu)點(diǎn)和不足,并且它與使用的編程語言有關(guān)。本論文主要是針對(duì) C/C++程序的逆向分析,最常見的 C++程序的調(diào)用約定有__cdecl、 __stdcall、thiscall 和__fastcall,如表 所示。27華 中 科 技 大 學(xué) 碩 士 學(xué) 位 論 文論文中僅考慮參數(shù)通過堆棧傳遞,通過 IDA 的高效輔助,可以較準(zhǔn)確的識(shí)別函數(shù)參數(shù)。但這同時(shí)也是本文實(shí)現(xiàn)的原型系統(tǒng)需要改進(jìn)的地方。 函數(shù)的返回值函數(shù)的返回值通常是由 return 操作符返回的一個(gè)值。從匯編角度來看,主要有五種形式:使用 return 操作符從函數(shù)返回值(通過寄存器或者協(xié)處理器堆棧) ;通過參數(shù)按引用方式返回函數(shù)值;通過全局變量返回函數(shù)值;通過處理器標(biāo)志返回函數(shù)值;通過堆從函數(shù)返回值。論文僅討論第一種情形。根據(jù)有關(guān)規(guī)范的規(guī)定,由 return 操作符返回的值放在EAX 寄存器(在 16 位模式下是 AX 寄存器)之中。如果函數(shù)的處理結(jié)果超出了這個(gè)寄存器的位容量,那么該操作數(shù)的高 32 位會(huì)加載到 EDX 寄存器中(在 16 位模式下,高位字會(huì)加載到 DX 寄存器里面) 。在大多數(shù)情況下,浮點(diǎn)型(float)結(jié)果是通過協(xié)處理器堆棧來返回的,這種值也可以通過 EDX:EAX 寄存器進(jìn)行傳遞(在
點(diǎn)擊復(fù)制文檔內(nèi)容
研究報(bào)告相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1