软件漏洞分析技术
3 開發(fā)shellcode的藝術(shù)
3.1 shellcode概述
shellcode這個專用術(shù)語通稱緩沖區(qū)溢出攻擊中植入進程的代碼。shellcode往往需要用匯編語言編寫,并轉(zhuǎn)換成二進制機器碼,其內(nèi)容和長度經(jīng)常還會受到很多苛刻限制,故開發(fā)和調(diào)試的難度很高。
植入代碼之前需要做大量的調(diào)試工作,
這個代碼植入的過程就是漏洞利用,也就是exploit。
exploit一般以一段代碼的形式出現(xiàn),用于生成攻擊性的網(wǎng)絡(luò)數(shù)據(jù)包或者其他形式的攻擊性輸入。exploit的核心是淹沒返回地址,劫持進程的控制權(quán),之后跳轉(zhuǎn)去執(zhí)行shellcode。
3.2 定位shellcode
在實際的漏洞利用過程中,由于動態(tài)鏈接庫的裝入和卸載等原因,Windows進程的函數(shù)棧幀有可能產(chǎn)生移位,即shellcode在內(nèi)存中的地址是會動態(tài)變化的。將返回地址簡單地覆蓋成一個定值的做法往往不能讓exploit奏效。必須想出一種方法在程序運行時動態(tài)定位棧中的shellcode。
由于ESP寄存器在函數(shù)返回后不被溢出數(shù)據(jù)干擾,且始終指向返回地址之后的位置,可以
1)用內(nèi)存中任意一個jmp esp 指令的地址覆蓋函數(shù)返回地址,而不是原來用手工查出的shellcode起始地址直接覆蓋;
2)函數(shù)返回后被重定向去執(zhí)行內(nèi)存中的這條jmp esp指令,而不是直接開始執(zhí)行shellcode。
3)由于esp在函數(shù)返回時仍指向棧區(qū)(函數(shù)返回地址之后),jmp esp 指令被執(zhí)行后,處理器會到棧區(qū)函數(shù)返回地址之后的地方取指令執(zhí)行;
4)重新布置shellcode。在淹沒函數(shù)返回地址后,繼續(xù)淹沒一片棧空間。將緩沖區(qū)前邊一段地方用任意數(shù)據(jù)填充,把shellcode恰好擺放在函數(shù)返回地址之后。這樣,jmp esp 指令執(zhí)行過后會恰好跳進shellcode。
5 堆溢出利用
5.3 堆溢出利用 DWORD SHOOT
5.3.1 鏈表拆卸中的問題堆管理系統(tǒng)的三類操作:堆塊分配、堆塊釋放和堆塊合并歸根結(jié)底都是對鏈表的修改。分配就是將堆塊從空表中卸下;釋放是把堆塊鏈入空表;合并,把若干個堆塊先從空表中卸下,修改塊首信息,之后把更新后的新塊鏈入空表。
如果我們能偽造鏈表結(jié)點的指針,在卸下和鏈入的過程中就有可能獲得一次讀寫內(nèi)存的機會。
堆溢出利用的精髓就是用精心構(gòu)造的數(shù)據(jù)去溢出下一個堆塊的塊首,改寫塊首中的前向指針flink和后向指針blink,然后在分配、釋放、合并等操作發(fā)生時伺機獲得一次向內(nèi)存任意地址寫入任意數(shù)據(jù)的機會。
不但可以控制射擊的目標(任意地址),還可以選用適當?shù)淖訌?#xff08;4字節(jié)惡意數(shù)據(jù))。
點射目標:棧幀中的函數(shù)返回地址;棧幀中的SEH句柄;重要函數(shù)調(diào)用地址;
子彈:shellcode起始地址
10 棧中的守護天使:GS
10.1 GS 安全編譯選項的保護原理
針對緩沖區(qū)溢出時覆蓋函數(shù)返回地址這一特征,微軟在編譯程序時使用了安全編譯選項-GS。在VS2003(VS 7.0)及以后版本的Visual Studio中默認啟用了這個編譯選項。
VS2008(VS 9.0)中,可以通過菜單中的Project-project Properties-Configuration Properties-C/C++-Code Generation-Buffer Security Check中對GS編譯選項進行設(shè)置。
.在所有函數(shù)調(diào)用發(fā)生時,向棧幀內(nèi)壓入一個額外的隨機DWORD,
.Security Cookie位于EBP之前,系統(tǒng)還將在.data的內(nèi)存區(qū)域中存放一個Security Cookie的副本,
.當棧中發(fā)生溢出時,Security Cookie將被首先淹沒,之后才是EBP和返回地址,
.在函數(shù)返回之前,系統(tǒng)將執(zhí)行一個額外的安全驗證操作,被稱做Security check,
在VS 2005 SP1起引入了一個新的安全標識:
#pragma strict_gs_check
通過添加#pragma strict_gs_check(on)可以對任意類型的函數(shù)添加Security Cookie。
Security Cookie 產(chǎn)生的細節(jié):
.系統(tǒng)以.data節(jié)的第一個雙字作為Cookie的種子,
.在棧幀初始化以后系統(tǒng)用ESP異或種子,作為當前函數(shù)的Cookie,
在VS 2005 及后續(xù)版本還使用了變量重排技術(shù),在編譯時根據(jù)局部變量的類型對變量在棧幀中的位置進行調(diào)整,
12 數(shù)據(jù)與程序的分水嶺:DEP
12.1 DEP機制的保護原理
DEP,Data Execution Prevention,數(shù)據(jù)執(zhí)行保護;溢出攻擊的根源在于現(xiàn)代計算機對數(shù)據(jù)和代碼沒有明確區(qū)分這一先天缺陷,
DEP基本原理:將數(shù)據(jù)所在內(nèi)存頁標識為不可執(zhí)行,當程序溢出成功轉(zhuǎn)入shellcode時,程序會嘗試在數(shù)據(jù)頁面上執(zhí)行指令,此時CPU就會拋出異常,而不是去執(zhí)行惡意指令。
軟件DEP其實就是SafeSEH;
硬件DEP才是真正意義的DEP,AMD和Intel都為此做了設(shè)計,
12.3 利用Ret2Libc挑戰(zhàn)DEP
Ret2libc,Return to libc;
三種相對比較有效的繞過DEP的exploit方法:
1)通過跳轉(zhuǎn)到ZwSetInformationProcess函數(shù)將DEP關(guān)閉后再轉(zhuǎn)入shellcode執(zhí)行;
2)通過跳轉(zhuǎn)到VirtualProtect函數(shù)來將shellcode所在內(nèi)存頁設(shè)置為可執(zhí)行狀態(tài),然后再轉(zhuǎn)入shellcode執(zhí)行;
3)通過跳轉(zhuǎn)到VirtualAlloc函數(shù)開辟一段具有執(zhí)行權(quán)限的內(nèi)存空間,然后將shellcode復(fù)制到這段內(nèi)存中執(zhí)行;
一個進程的DEP設(shè)置標識保存在KPROCESS結(jié)構(gòu)中的_KEXECUTE_OPTIONS上,
如果一個進程的Permanent位沒有設(shè)置,當它加載DLL時,系統(tǒng)就會對這個DLL進行DEP兼容性檢查,當存在兼容性問題時進程的DEP就會被關(guān)閉。
用OllyDbg加載調(diào)試程序。在0x7C92E257,即MOV EAX,1后邊的RETN指令處暫停程序。觀察堆棧可以看到此時ESP指向test函數(shù)返回地址的下方,而這個ESP指向的內(nèi)存空間存放的值將是RETN指令要跳到的地址。
所以我們需要在這個位置放上0x7C93CD24以便讓程序轉(zhuǎn)入關(guān)閉DEP流程,我們?yōu)閟hellcode添加4個字節(jié),并放置0x7C93CD24,
總結(jié)
- 上一篇: TC 2.0 学习总结
- 下一篇: PE文件数据结构汇总