電子商務(wù)網(wǎng)站建設(shè)的技術(shù)綜述論文優(yōu)化排名 生客seo
內(nèi)存結(jié)構(gòu)
?緩沖區(qū)溢出漏洞
????????緩沖區(qū)溢出漏洞就是在向緩沖區(qū)寫(xiě)入數(shù)據(jù)時(shí),由于沒(méi)有做邊界檢查,導(dǎo)致寫(xiě)入緩沖區(qū)的數(shù)據(jù)超過(guò)預(yù)先分配的邊界,從而使溢出數(shù)據(jù)覆蓋在合法數(shù)據(jù)上而引起系統(tǒng)異常的一種現(xiàn)象。
ESP、EPB
????????ESP:擴(kuò)展棧指針(Extended Stack Pointer)寄存器,其存放的指針指向當(dāng)前棧幀的棧頂。
????????EBP:擴(kuò)展基址指針(Extended Base Pointer)寄存器,其存放的指針指向當(dāng)前棧幀的棧底。
????????EIP:控制了進(jìn)程的執(zhí)行流程,EIP指向哪里,CPU就會(huì)執(zhí)行哪里的指令!
一個(gè)函數(shù)棧幀中主要包含如下信息:
????????1)前一個(gè)棧幀的棧底位置,即前棧幀EBP,用于在函數(shù)調(diào)用結(jié)束后恢復(fù)主調(diào)函數(shù)的棧幀(前棧幀的棧頂可計(jì)算得到)。
????????2)該函數(shù)的局部變量。
????????3)函數(shù)調(diào)用的參數(shù)。
????????4)函數(shù)的返回地址RET,用于保存函數(shù)調(diào)用前指令的位置,以便函數(shù)返回時(shí)能恢復(fù)到調(diào)用前的代碼區(qū)中繼續(xù)執(zhí)行指令。?
棧溢出攻擊
????????棧溢出攻擊是一種利用棧溢出漏洞所進(jìn)行的攻擊行動(dòng),目的在于擾亂具有某些特權(quán)運(yùn)行的程序的功能,使得攻擊者取得程序的控制權(quán)。
JMP ESP覆蓋方法
????????在實(shí)際的漏洞利用中,由于動(dòng)態(tài)鏈接庫(kù)的裝入和卸載等原因,Windows進(jìn)程的函數(shù)棧幀可能發(fā)生移位,即Shellcode在內(nèi)存中的地址是動(dòng)態(tài)變化的,所以上述采用直接賦地址值的簡(jiǎn)單方式在以后的運(yùn)行過(guò)程中會(huì)出現(xiàn)跳轉(zhuǎn)異常。
????????JMP ESP覆蓋方法是覆蓋函數(shù)返回地址的一種攻擊方式??紤]到函數(shù)返回時(shí)ESP總是指向函數(shù)返回后的下一條指令,根據(jù)這一特點(diǎn),如果用指令JMP ESP的地址覆蓋返回地址,則函數(shù)也可以跳轉(zhuǎn)到函數(shù)返回后的下一條指令,而從函數(shù)返回后的下一條指令開(kāi)始都已經(jīng)被Shellcode所覆蓋,那么程序就可以跳轉(zhuǎn)到該Shellcode上并執(zhí)行,從而實(shí)現(xiàn)了程序流程的控制。
SEH覆蓋方法
????????SEH覆蓋方法就是覆蓋異常處理程序地址的一種攻擊方式。由于SHE結(jié)構(gòu)存放在棧中,因此攻擊者可以利用棧溢出漏洞,設(shè)計(jì)特定的溢出數(shù)據(jù),將SEH中異常函數(shù)的入口地址覆蓋為Shellcode的起始地址或可以跳轉(zhuǎn)到Shellcode的跳轉(zhuǎn)指令地址,從而導(dǎo)致程序發(fā)生異常時(shí),Windows異常處理機(jī)制執(zhí)行的不是預(yù)設(shè)的異常處理函數(shù),而是Shellcode。
堆溢出漏洞及利用?
????????如果能夠修改鏈表節(jié)點(diǎn)的指針,在“卸下”和“鏈入”的過(guò)程中就有可能獲得一次讀寫(xiě)內(nèi)存的機(jī)會(huì)。
DWORD Shoot
????????堆溢出利用的精髓就是用精心構(gòu)造的數(shù)據(jù)去溢出覆蓋下一個(gè)堆塊的塊首,使其改寫(xiě)塊首中的前向指針(flink)和后向指針(blink),然后在分配、釋放、合并等操作發(fā)生時(shí)伺機(jī)獲得一次向內(nèi)存任意地址寫(xiě)入任意數(shù)據(jù)的機(jī)會(huì)。 攻擊者可以進(jìn)而劫持進(jìn)程,運(yùn)行shellcode。
Heap Spray
????????首先將shellcode放置到堆中,然后在棧溢出時(shí),控制函數(shù)執(zhí)行流程,跳轉(zhuǎn)到堆中執(zhí)行shellcode。
格式化串漏洞
????????格式化串漏洞的產(chǎn)生源于數(shù)據(jù)輸出函數(shù)中對(duì)輸出格式解析的缺陷,其根源也是C語(yǔ)言中不對(duì)數(shù)組邊界進(jìn)行檢查的緩沖區(qū)錯(cuò)誤。
????????printf函數(shù)進(jìn)行格式化輸出時(shí),會(huì)根據(jù)格式化串中的格式化控制符在棧上取相應(yīng)的參數(shù),然后按照所需格式輸出。 如果函數(shù)調(diào)用給出的輸出數(shù)據(jù)列表少于格式控制符個(gè)數(shù),甚至于沒(méi)有給出輸出數(shù)據(jù)列表,系統(tǒng)仍然會(huì)按照格式化串中格式化控制符的個(gè)數(shù)輸出棧中的數(shù)據(jù)。
格式化串漏洞利用
格式化串漏洞的利用可以通過(guò)如下方法實(shí)現(xiàn):
????????通過(guò)改變格式化串中輸出參數(shù)的個(gè)數(shù)實(shí)現(xiàn)修改指定地址的值:可以修改填充字符串長(zhǎng)度實(shí)現(xiàn);也可以通過(guò)改變輸出的寬度實(shí)現(xiàn),如%8d。
???????? 通過(guò)改變格式化串中格式符的個(gè)數(shù),調(diào)整格式符對(duì)應(yīng)參數(shù)在棧中位置,從而實(shí)現(xiàn)對(duì)棧中特定位置數(shù)據(jù)的修改。
Windows平臺(tái)溢出漏洞保護(hù)機(jī)制
棧溢出檢測(cè)選項(xiàng)/GS
????????調(diào)用函數(shù)時(shí)將一個(gè)隨機(jī)生成的秘密值存放在棧上,當(dāng)函數(shù)返回時(shí),檢查這個(gè)堆棧檢測(cè)儀的值是否被修改,以此判斷是否發(fā)生了棧溢出。
對(duì)抗/GS保護(hù)
- 猜測(cè)Cookie值
- 通過(guò)同時(shí)替換棧中的Cookie和Cookie副本
- 覆蓋SEH繞過(guò)Cookie檢查
- 覆蓋父函數(shù)的棧數(shù)據(jù)繞過(guò)Cookie檢查
數(shù)據(jù)執(zhí)行保護(hù)DEP
????????通過(guò)使可寫(xiě)內(nèi)存不可執(zhí)行或使可執(zhí)行內(nèi)存不可寫(xiě)來(lái)消除類(lèi)似的威脅。
????????執(zhí)行已經(jīng)加載的模塊中的指令或調(diào)用系統(tǒng)函數(shù)則不受DEP影響,而棧上的數(shù)據(jù)只需作為這些函數(shù)/指令的參數(shù)即可。
對(duì)抗數(shù)據(jù)執(zhí)行保護(hù)DEP
- 利用ret-to-libc執(zhí)行命令或進(jìn)行API調(diào)用,如調(diào)用WinExec實(shí)現(xiàn)執(zhí)行程序。
- 將包含Shellcode的內(nèi)存頁(yè)面標(biāo)記為可執(zhí)行,然后再跳過(guò)去執(zhí)行。
- 通過(guò)分配可執(zhí)行內(nèi)存,再將Shellcode復(fù)制到內(nèi)存區(qū)域,然后跳過(guò)去執(zhí)行。
- 先嘗試關(guān)閉當(dāng)前進(jìn)程的DEP保護(hù),然后再運(yùn)行Shellcode。?
地址空間布局隨機(jī)化ASLR?
????????通過(guò)對(duì)堆、棧、共享庫(kù)映射等線(xiàn)性區(qū)域布局的隨機(jī)化,增加攻擊者預(yù)測(cè)目的地址的難度,防止攻擊者直接定位攻擊代碼位置,達(dá)到阻止漏洞利用的目的。
ASLR機(jī)制的缺陷和繞過(guò)方法?
- 對(duì)本地攻擊者無(wú)能為力
- 造成內(nèi)存碎片的增多
- 利用沒(méi)有采用/DYNAMICBASE選項(xiàng)保護(hù)的模塊做跳板???
安全結(jié)構(gòu)化異常處理SafeSEH?
????????SafeSEH保護(hù)機(jī)制的作用是防止覆蓋和使用存儲(chǔ)棧上的SEH結(jié)構(gòu)。
????????其實(shí)現(xiàn)原理是,編譯器在鏈接生成二進(jìn)制IMAGE時(shí),把所有合法的異常處理函數(shù)的地址解析出來(lái)制成一張安全的SEH表,保存在程序的IMAGE數(shù)據(jù)塊里面,當(dāng)程序調(diào)用異常處理函數(shù)時(shí)會(huì)將函數(shù)地址與安全SEH表中的地址進(jìn)行匹配,檢查調(diào)用的異常處理函數(shù)是否位于該表中。
????????微軟在.Net編譯器中加入了/safeSEH連接選項(xiàng)。
對(duì)抗SafeSEH機(jī)制的方法
- 利用未啟用SafeSEH的模塊作為跳板進(jìn)行繞過(guò)
- 利用加載模塊之外的地址進(jìn)行繞過(guò)
增強(qiáng)緩解體驗(yàn)工具包EMET
- 增強(qiáng)型DEP
- SafeSEH的升級(jí)版——SEHOP
- 強(qiáng)制性ASLR
- HeapSpray防護(hù)