李昆侖,鞏春景,李尚然,王 琳,張德智
(河北大學(xué) 電子信息工程學(xué)院,河北 保定 071000)
隨著互聯(lián)網(wǎng)的普及,各種攻擊方式也趨于多樣化,最常見(jiàn)的攻擊方式是利用緩沖區(qū)溢出將控制流導(dǎo)向?qū)⒁獔?zhí)行的惡意代碼.在這種類(lèi)型的攻擊中,第一步需要找到一種方法覆蓋內(nèi)存中的指針,比較常見(jiàn)的方法是利用緩沖區(qū)溢出和格式化字符串漏洞.攻擊者一旦獲取了程序的控制流,下一步就是控制其去執(zhí)行一些惡意程序.比如注入攻擊、return-into-libc攻擊、ROP攻擊和JIT-ROP攻擊等.其中return-into-libc是一種不依賴(lài)注入代碼并且可以繞過(guò)內(nèi)存不可執(zhí)行技術(shù)的攻擊方式,攻擊者在棧中合適位置預(yù)先填入庫(kù)函數(shù)入口的地址,將控制流導(dǎo)向庫(kù)函數(shù)的入口實(shí)施攻擊[1].比如libc庫(kù)中提供了大量的API函數(shù),攻擊者便可通過(guò)執(zhí)行若干庫(kù)函數(shù)來(lái)進(jìn)行實(shí)質(zhì)性的攻擊.ROP攻擊與return-into-libc相比,其復(fù)用的代碼不再是整個(gè)函數(shù),而是代碼庫(kù)中某些以ret結(jié)尾的短小指令.JIT-ROP攻擊動(dòng)態(tài)獲取進(jìn)程中的資源構(gòu)造gadgets實(shí)施攻擊[2].
隨后也出現(xiàn)了一些保護(hù)機(jī)制,比如控制流完整性(Control-Flow Integrity,CFI) 通過(guò)阻止原計(jì)劃中沒(méi)有的控制流,有效的阻止了代碼復(fù)用攻擊[3]; 地址空間隨機(jī)化方法 (Address space layout randomization,ASLR)通過(guò)將庫(kù)函數(shù)的代碼段和數(shù)據(jù)段的起始地址進(jìn)行隨機(jī)化處理,使得攻擊者不能得到正確的地址而無(wú)法進(jìn)行攻擊[4];但是通過(guò)暴力破解的方法可以得到真正的地址,又可以通過(guò)內(nèi)存泄漏繞過(guò)傳統(tǒng)的地址空間隨機(jī)化方法[5].隨后出現(xiàn)的細(xì)粒度隨機(jī)化方法,進(jìn)一步增加了程序的多樣性,并限制內(nèi)存泄露的有效性[6,7].Pappas 等人提出in-place 代碼隨機(jī)化技術(shù),通過(guò)指令重排列、等價(jià)指令替換和寄存器重賦值阻止 ROP 攻擊.然而,最近的研究表明,系統(tǒng)中存在的漏洞使得攻擊者可以在任何地方讀取內(nèi)存并繞過(guò)細(xì)粒度的隨機(jī)化方法[8].另外還有DEP技術(shù)和W⊕X技術(shù)(W的含義是writable,X的含義是executable,W⊕X代表可寫(xiě)區(qū)域不可執(zhí)行,可執(zhí)行區(qū)域不可寫(xiě)入)等.
2007年,Shacham將return-into-libc這種攻擊方式進(jìn)一步演化為ROP[9-11](Return-Oriented Programming).ROP攻擊的出現(xiàn)表明了攻擊者無(wú)需再向程序中注入任何新的代碼便可實(shí)現(xiàn)圖靈機(jī)完全性.
ROP攻擊的思想很簡(jiǎn)單,與return-into-libc相比,ROP攻擊的跳轉(zhuǎn)位置不再是libc庫(kù)中的API函數(shù),而是函數(shù)中的某些指令,而且這些指令都是以ret結(jié)尾的且指令最多不超過(guò)6條的短指令序列,一般將其稱(chēng)之為gadget.ROP攻擊可以繞過(guò)Windows的數(shù)據(jù)執(zhí)行保護(hù)技術(shù)DEP(Data Execution Prevention).針對(duì)棧溢出的ROP攻擊是當(dāng)前研究的熱點(diǎn),通過(guò)修改函數(shù)指針可以很容易發(fā)起ROP攻擊,本文主要研究這種攻擊的機(jī)理與的檢測(cè)方法.
PointGuard是針對(duì)函數(shù)指針攻擊檢測(cè)方面一種有效的檢測(cè)方法,將函數(shù)指針經(jīng)過(guò)加密之后保存在內(nèi)存中,當(dāng)進(jìn)行函數(shù)調(diào)用時(shí)再進(jìn)行動(dòng)態(tài)解密[12].控制流安全 (Control Flow Integrity,CFI)也是一種經(jīng)典的基于控制流的保護(hù)思想[13].它們所用到的關(guān)鍵技術(shù)是靜態(tài)分析,對(duì)于間接跳轉(zhuǎn)不起作用.對(duì)于目前發(fā)起的ROP攻擊大多數(shù)是利用緩沖區(qū)溢出后覆蓋函數(shù)的返回地址執(zhí)行g(shù)adget,而對(duì)于通過(guò)覆蓋函數(shù)指針發(fā)起ROP攻擊的研究很少.本文深入分析了函數(shù)指針攻擊形成機(jī)理,實(shí)現(xiàn)了這種攻擊,并且提出一種動(dòng)靜結(jié)合的方法來(lái)檢測(cè)通過(guò)修改函數(shù)指針發(fā)起的ROP攻擊,核心思想是檢查某些間接跳轉(zhuǎn)指令是否連續(xù)執(zhí)行有效的gadget.將fpDetect檢測(cè)方法應(yīng)用于正常程序與含有ROP攻擊的程序中,實(shí)驗(yàn)表明這種檢測(cè)方法的誤報(bào)率低.可以同時(shí)應(yīng)用在Linux與Windows操作系統(tǒng)中.
對(duì)于具有可變大小指令的x86系統(tǒng)來(lái)說(shuō),攻擊者可以在已有程序或者動(dòng)態(tài)庫(kù)中找到gadgets.具體的說(shuō),這些gadgets是從一個(gè)多字節(jié)指令當(dāng)中的某個(gè)字節(jié)開(kāi)始進(jìn)行編譯的指令.例如代碼字節(jié)0b 00 00 83 c4 2c c3 66從第一個(gè)字節(jié)開(kāi)始反匯編得到以下指令序列:
oreax,dwordptr[eax]
addbyteptr[ebx+0x66c32cc4],al
如果從第二個(gè)字節(jié)開(kāi)始反匯編則得到以下指令序列:
addbyteptr[eax],al
addesp,0x2c
ret
圖1 unintended指令序列Fig.1 Unintended instruction sequence
如圖1所示攻擊者可以利用x86指令密集型的特點(diǎn)在庫(kù)中尋找大量以ret結(jié)尾的gadget來(lái)實(shí)施攻擊.
圖2描述本文所做實(shí)驗(yàn)的緩沖區(qū)中布局情況,圖的左邊是緩沖區(qū)中填入的數(shù)據(jù)(每條數(shù)據(jù)對(duì)應(yīng)著地址),右邊是每條地址所對(duì)應(yīng)的指令.當(dāng)執(zhí)行第一條指令時(shí),首先會(huì)將地址0x0806ea3a出棧執(zhí)行pop edx,將數(shù)據(jù)0x080ea060出棧并存儲(chǔ)到edx中(0x080ea060為data段首的地址).然后在執(zhí)行ret時(shí),0x080bb7f6的地址出棧,并執(zhí)行pop eax指令,此時(shí)會(huì)將字符串“/bin”的ASCII碼存入到eax中.接下來(lái)將地址0x0809a79d出棧并執(zhí)行mov dword ptr [edx],eax,這條指令的執(zhí)行會(huì)將字符串“/bin”存放到data段中.最后將執(zhí)行execve函數(shù).只要庫(kù)足夠大就可以找到各種類(lèi)型的指令,完成各種功能,實(shí)現(xiàn)圖靈機(jī)完全性.圖靈機(jī)完全性是指能夠?qū)崿F(xiàn)數(shù)據(jù)的移動(dòng)存儲(chǔ)、算數(shù)加減、邏輯運(yùn)算操作、控制流操作、函數(shù)調(diào)用、系統(tǒng)調(diào)用操作的具備通用圖靈機(jī)計(jì)算能力的gadget集合[14].
圖2 ROP攻擊指令執(zhí)行順序Fig.2 ROP attack instruction execution order
指令密集型的特點(diǎn)使得攻擊者更容易尋找gadget,利用其指令字節(jié)數(shù)不規(guī)整的特點(diǎn),當(dāng)我們?cè)谝粋€(gè)多字節(jié)指令中的某個(gè)字節(jié)處開(kāi)始進(jìn)行反匯編時(shí)會(huì)得到意想不到的結(jié)果.
gadget由兩部分組成:功能指令和控制轉(zhuǎn)移指令.在ROP中控制轉(zhuǎn)移指令采用ret,目的是改變控制流跳轉(zhuǎn)到下一個(gè)gadget.功能指令可以實(shí)現(xiàn)的功能可概括為以下:
1)加載常數(shù)到寄存器:將堆棧中的常量加載到指定的寄存器中,如pop ecx; ret.執(zhí)行此語(yǔ)句后,存儲(chǔ)在堆棧中的值將加載到ecx寄存器中.
2)從內(nèi)存中加載數(shù)據(jù):如mov ecx,[eax]; ret指令.執(zhí)行這條指令后會(huì)將eax中的地址指向的值加載到ecx中.
3)將寄存器中的值寫(xiě)到內(nèi)存中:如mov [eax],ecx; ret指令.執(zhí)行這條指令后會(huì)將寄存器ecx中存放的值寫(xiě)入到eax地址指向的內(nèi)存區(qū)域中.
4)算數(shù)運(yùn)算:包括加、減、乘、除、異或等.
5)實(shí)現(xiàn)內(nèi)核中斷:int 0x80; ret和call gs:[0x10];ret.
6)盡量避免使用的gadgets:不要使用以leave結(jié)尾的gadgets,會(huì)污染棧幀;不要使用包含pop ebp的gadget,同樣也會(huì)污染棧幀.
在windows操作系統(tǒng)中本文采取IDA Pro反匯編可執(zhí)行二進(jìn)制文件,編寫(xiě)idc腳本對(duì)可執(zhí)行二進(jìn)制文件進(jìn)行分析.IDA Pro是一種交互式、可編程的、可擴(kuò)展的、多處理器的交叉Windows或Linux WinCE MacOS平臺(tái)主機(jī)分析程序反匯編工具.是一個(gè)常用的靜態(tài)反編譯軟件,對(duì)于0day世界的許多成員和shellcode安全分析師來(lái)說(shuō)是不可或缺的工具.
在Linux操作系統(tǒng)中采用pin動(dòng)態(tài)二進(jìn)制插樁工具來(lái)獲取函數(shù)信息進(jìn)行分析.pin是一種動(dòng)態(tài)二進(jìn)制檢測(cè)框架,適用于x86、x64構(gòu)架,一般用于程序動(dòng)態(tài)分析,支持windows、Linux以及OSX.在計(jì)算機(jī)安全領(lǐng)域有重要的應(yīng)用.
近些年來(lái)已經(jīng)有成熟的保護(hù)機(jī)制來(lái)預(yù)防通過(guò)覆蓋函數(shù)的返回地址進(jìn)行的攻擊.Cowan提出的金絲雀方法(canary),通過(guò)在棧中插入關(guān)鍵字canary,當(dāng)函數(shù)返回時(shí)動(dòng)態(tài)檢測(cè)canary的值是否被修改,以此來(lái)檢測(cè)函數(shù)的返回地址是否被修改.文獻(xiàn)[15]以軟件和硬件的方式建立影子棧來(lái)存儲(chǔ)函數(shù)的返回地址,并在函數(shù)返回時(shí)檢測(cè)返回地址的值是否被篡改,以此來(lái)檢測(cè)覆蓋函數(shù)返回地址的攻擊.
C語(yǔ)言是計(jì)算機(jī)編程語(yǔ)言,C語(yǔ)言的學(xué)習(xí)與研究對(duì)于操作系統(tǒng)的安全至關(guān)重要[16].由于針對(duì)函數(shù)的返回地址進(jìn)行攻擊的保護(hù)機(jī)制日趨完善,所以攻擊者把目光投向函數(shù)指針.在c/c++中被定義的函數(shù)指針是一個(gè)指向被調(diào)用函數(shù)的地址,攻擊者可以重寫(xiě)函數(shù)指針指向代碼段中的任意地址來(lái)執(zhí)行,進(jìn)而控制程序的執(zhí)行流.如圖3所示,是一段代碼以及??臻g中的示意圖.
圖3 函數(shù)代碼段及棧中布局Fig.3 Function code segment and layout in stack
由圖3中的代碼可知,程序在??臻g中開(kāi)辟了156個(gè)字節(jié)的緩沖區(qū),當(dāng)func中傳遞的參數(shù)p的字節(jié)數(shù)大于156個(gè)字節(jié)時(shí)將會(huì)覆蓋函數(shù)指針fp,但不一定會(huì)覆蓋函數(shù)的返地址ret.攻擊者可以精心構(gòu)造參數(shù)p的值使其發(fā)生緩沖區(qū)溢出.使覆蓋函數(shù)指針fp的地址為代碼段的地址(return-into-libc和ROP),因?yàn)榇a段為可執(zhí)行權(quán)限,而DEP無(wú)法防御這種攻擊.
fpDetect檢測(cè)方案雖然實(shí)現(xiàn)簡(jiǎn)單,但效率高,檢測(cè)的誤報(bào)漏報(bào)率低.
應(yīng)用程序中只包含兩種函數(shù),本地函數(shù)與動(dòng)態(tài)庫(kù)函數(shù)(簡(jiǎn)稱(chēng)庫(kù)函數(shù)),本地函數(shù)調(diào)用本地函數(shù)時(shí)使用直接跳轉(zhuǎn)指令如call xxx(xxx為本地函數(shù)的地址),因?yàn)楸镜睾瘮?shù)的地址固定,而庫(kù)函數(shù)的地址采取運(yùn)行時(shí)重定位機(jī)制,只有在運(yùn)行時(shí)庫(kù)函數(shù)的地址才可以確定,故在調(diào)用庫(kù)函數(shù)時(shí)采取間接跳轉(zhuǎn)指令,如call eax(其中eax為調(diào)用的庫(kù)函數(shù)的地址).另外,在通過(guò)使用函數(shù)指針調(diào)用函數(shù)時(shí)也是間接調(diào)用的,例如可以使用call eax來(lái)調(diào)用函數(shù)指針,eax中地址便為被調(diào)用的本地函數(shù)的入口點(diǎn)地址.
本文提出的檢測(cè)方法fpDetect是一種動(dòng)靜結(jié)合的方法,首先使用IDA Pro對(duì)二進(jìn)制文件進(jìn)行反匯編,編寫(xiě)idc腳本取得程序中除調(diào)用交叉引用函數(shù)以外的間接跳轉(zhuǎn)指令的地址,然后分析這些間接跳轉(zhuǎn)指令將要執(zhí)行的指令,若將要執(zhí)行的指令能夠形成連續(xù)的gadgets,則判斷為函數(shù)指針攻擊.
核心思想就是檢查部分間接跳轉(zhuǎn)的目標(biāo)地址中所執(zhí)行的指令是否為連續(xù)的gadgets.因而這是一種動(dòng)靜結(jié)合的技術(shù).
圖4 fpDetect檢測(cè)流程Fig.4 fpDetect detection process
gadget需要滿(mǎn)足下面的幾個(gè)條件:1、指令數(shù)不超過(guò)6;2、組成gadget的指令都為副作用無(wú)關(guān)指令.副作用指令是在指令運(yùn)行時(shí)修改EFLAGS寄存器的指令.為使得gadget的執(zhí)行更具有靈活性,一般組成gadget的指令數(shù)目為2到3條.由于正常程序執(zhí)行時(shí)存在大量的副作用指令,故判斷執(zhí)行的指令中是否全為副作用無(wú)關(guān)指令也是判斷其是否為gadget的一個(gè)重要條件.
本文所做基于函數(shù)指針的ROP攻擊是在Linux操作系統(tǒng)下進(jìn)行的.gadget 1覆蓋原函數(shù)指針fp,gadget 2~gadget n依次存放于buf中,此時(shí)的gadget 1相當(dāng)于一個(gè)跳板將執(zhí)行流引入到gadget 2上,然后依次執(zhí)行g(shù)adgets.
DBI的檢測(cè)思想:如果函數(shù)調(diào)用不是從庫(kù)函數(shù)或者本地函數(shù)的入口點(diǎn)調(diào)用,則將其判斷為非法調(diào)用,即檢測(cè)到ROP攻擊[17].而這種檢測(cè)方法忽略了正常函數(shù)調(diào)用庫(kù)函數(shù)時(shí),也會(huì)存在非入口點(diǎn)跳轉(zhuǎn)這種情況.正常的非入口點(diǎn)跳轉(zhuǎn)是由編譯器決定的,非入口點(diǎn)跳轉(zhuǎn)的存在可以使程序的執(zhí)行變得更加簡(jiǎn)便.非正常的非入口點(diǎn)跳轉(zhuǎn)發(fā)生時(shí),當(dāng)距離ret較近時(shí)便有可能形成gadgets.
DROR的檢測(cè)思想:判斷程序運(yùn)行時(shí)連續(xù)使用的ret指令的數(shù)量是否超出檢測(cè)閾值,若超出這個(gè)檢測(cè)閾值則判斷其為ROP攻擊[18].同樣這種檢測(cè)方法也忽略了正常的程序執(zhí)行時(shí)也會(huì)有連續(xù)執(zhí)行ret指令的情況,會(huì)增加了檢測(cè)的誤報(bào)與漏報(bào)率,針對(duì)這種情況,本文提出了fpDetect檢測(cè)方法,來(lái)提高檢測(cè)的準(zhǔn)確性.
本文所做實(shí)驗(yàn)均在操作系統(tǒng)Linux ubuntu 14.04.5 32/64位、windows 10和windows XP中進(jìn)行.fpDetect檢測(cè)方法在Linux與windows中同樣適用.
在Linux操作系統(tǒng)下本文實(shí)驗(yàn)中注入攻擊部分所使用的弱點(diǎn)程序?yàn)閳D3中所示的程序,被注入的shellcode為shellcode database中真實(shí)的shellcode,如下所示:
execve(“/bin/sh”)
xorecx%,ecx%
mulecx%
pushecx%
push0x68732f2f
push0x6e69622f
movesp%,ebx%
moval%,11
int0x80
其對(duì)應(yīng)的硬編碼如下:
shellcode="/xeb/x0b/x5b/x31/xc0/x31/xc9/x31/xd2"
shellcode+=/xb0/x0b/xcd/x80/xe8/xf0/xff/xff/xff"
shellcode+="/x2f/x62/x69/x6e/x2f/x73/x68"
最終攻擊程序構(gòu)造的payload如下:
payload=shellcode+'A'*(128-len(shellcode))
+p32(shellcodeaddr).
當(dāng)執(zhí)行了read函數(shù)之后,fp位置的地址被覆蓋為一個(gè)作為跳板的指令的地址,使得程序的執(zhí)行流去執(zhí)行shellcode.最終攻擊成功之后的截圖如圖5所示.
圖5 攻擊成功之后的截圖Fig.5 A screenshot after a successful attack
在windows操作系統(tǒng)下本文實(shí)驗(yàn)中的注入攻擊是借助user32.dll來(lái)完成的,所使用的弱點(diǎn)程序與在Linux操作系統(tǒng)中使用的程序一樣.首先編寫(xiě)shellcode(本文所編寫(xiě)的shellcode是調(diào)用MessageBox函數(shù)),然后在user32.dll中尋找跳板指令push ebp;ret.注入攻擊成功之后將彈出圖6所示的窗口.
圖6 攻擊成功Fig.6 Attack success
在Linux中通過(guò)使用pin對(duì)二進(jìn)制文件插樁間接跳轉(zhuǎn)指令,去除調(diào)用庫(kù)函數(shù)的間接跳轉(zhuǎn)指令的地址,調(diào)試剩余的間接跳轉(zhuǎn)指令發(fā)現(xiàn)當(dāng)函數(shù)調(diào)用函數(shù)指針時(shí)控制流跳轉(zhuǎn)去執(zhí)行??臻g中的shellcode,由此判斷為注入攻擊.
4.3.1 ROP攻擊的實(shí)現(xiàn)
在linux操作系統(tǒng)中構(gòu)造ROPchain時(shí),如果是簡(jiǎn)單的gadgets,可以通過(guò)objdump來(lái)查找.但當(dāng)我們尋找一些復(fù)雜的gadgets的時(shí)候,可以借助一些查找gadgets的工具,例如Ropme、Ropper和ROPgadget等.但這些工具多數(shù)只能應(yīng)用于linux操作系統(tǒng)中,所以本文函數(shù)指針ROP攻擊實(shí)驗(yàn)在linux32位與linux64位操作系統(tǒng)中進(jìn)行.
ROP攻擊所使用的ROPchain是從shellcode database中的shellcode經(jīng)過(guò)改寫(xiě)之后在庫(kù)中找到的gadgets構(gòu)造的ROPchain.在shellcode database中隨機(jī)選取了十個(gè)簡(jiǎn)短的shellcode構(gòu)造了ROPchain,用于進(jìn)行本次的實(shí)驗(yàn).
為了使得本文更具有說(shuō)服性,本文采用Linux操作系統(tǒng)中自動(dòng)構(gòu)造工具ROPgadget構(gòu)造的ROPchain舉例說(shuō)明基于函數(shù)指針ROP攻擊的實(shí)現(xiàn).由于fpDetect檢測(cè)方法對(duì)于如何覆蓋函數(shù)指針沒(méi)有要求,所以實(shí)驗(yàn)中選擇了圖3所示的弱點(diǎn)程序進(jìn)行實(shí)驗(yàn).除read函數(shù)外還有大量的危險(xiǎn)庫(kù)函數(shù),比如strcpy、memcpy和malloc等.本文以read函數(shù)為例,通過(guò)發(fā)送測(cè)試代碼實(shí)施ROP攻擊.當(dāng)執(zhí)行了read函數(shù)之后的??臻g圖如圖7所示.
圖7 read函數(shù)執(zhí)行前后的??臻gFig.7 Stack space of the read function before and after execution
在linux32位操作系統(tǒng)中發(fā)送測(cè)試代碼,當(dāng)read函數(shù)執(zhí)行之后緩沖區(qū)被填充上gadgets的地址,其中函數(shù)指針fp的位置被替換為gadget1的地址.這個(gè)地址很關(guān)鍵,因?yàn)樗淖饔檬菍⒊绦虻膱?zhí)行流引到gadget2上去執(zhí)行.本文通過(guò)精心構(gòu)造及尋找,最終選定了add 0x2c ,esp%;ret作為gadget1處地址所存儲(chǔ)的指令.在這里值得一提的是,因?yàn)閹?kù)中不一定有我們想要的那條指令,所以我們應(yīng)該在庫(kù)中尋找與我們需指令執(zhí)行效果最為相近的指令,然后再調(diào)整gadgets在緩沖區(qū)中的具體位置,以此思想來(lái)構(gòu)造真正的攻擊.圖8為實(shí)施ROP攻擊成功之后的截圖.
圖8 32位操作系統(tǒng)中攻擊成功截圖Fig.8 A screenshot of the attack in the 32-bit operating system
在linux 64 位操作系統(tǒng)中基于函數(shù)指針的ROP攻擊的實(shí)施與在32位操作系統(tǒng)中有所不同,其內(nèi)存地址的范圍由32位變成了64位.但是可以使用的內(nèi)存地址不能大于0x00007fffffffffff,否則會(huì)拋出異常.其次是函數(shù)參數(shù)的傳遞方式發(fā)生了改變,x86中參數(shù)都是保存在棧上,但在x64中的前六個(gè)參數(shù)依次保存在RDI,RSI,RDX,RCX,R8和 R9中,如果還有更多的參數(shù)的話(huà)才會(huì)保存在棧上,所以我們需要尋找一些類(lèi)似于pop rdi;ret的這種gadget.圖9為實(shí)施ROP攻擊成功之后的截圖.其中amd64-64-little代表由AMD公司開(kāi)發(fā)的64位元的處理器架構(gòu).
圖9 64位操作系統(tǒng)中攻擊成功截圖Fig.9 A screenshot of the attack in the 64-bit operating system
4.3.2 函數(shù)指針ROP攻擊檢測(cè)
針對(duì)函數(shù)指針ROP攻擊檢測(cè)本文分別在windows10操作系統(tǒng)與linux 64位操作系統(tǒng)中進(jìn)行.在windows 10中,使用IDA Pro對(duì)二進(jìn)制文件進(jìn)行靜態(tài)分析,編寫(xiě)idc腳本獲取程序中的除調(diào)用庫(kù)函數(shù)的間接跳轉(zhuǎn)指令的地址,然后對(duì)其進(jìn)行動(dòng)態(tài)分析;在linux操作系統(tǒng)中使用pin動(dòng)態(tài)插裝,取得函數(shù)信息并進(jìn)行g(shù)db調(diào)試.如表1所示,fpDetect檢測(cè)全部檢測(cè)成功.與DBI的檢測(cè)方法相比較,fpDetect檢測(cè)方法考慮了函數(shù)的非入口點(diǎn)跳轉(zhuǎn),提高了檢測(cè)的準(zhǔn)確率.與DROP相比,DROP只考慮到了棧溢出ROP攻擊,而沒(méi)有考慮到覆蓋函數(shù)指針的攻擊,對(duì)于本文中構(gòu)造的攻擊DROP檢測(cè)方法失效.
表1 性能測(cè)試表Table 1 Performance test table
本文采用的是動(dòng)靜結(jié)合的檢測(cè)思想,所以檢測(cè)的準(zhǔn)確性會(huì)大大提高.本文通過(guò)實(shí)驗(yàn)對(duì)計(jì)算機(jī)中的程序進(jìn)行真實(shí)檢測(cè),結(jié)果如表2可知,沒(méi)有誤報(bào)產(chǎn)生,這也進(jìn)一步驗(yàn)證了本文方法的有效性.
表2 誤報(bào)測(cè)試結(jié)果表Table 2 Misreport test result table
對(duì)于目前發(fā)起的ROP攻擊大多數(shù)是利用緩沖區(qū)溢出后覆蓋函數(shù)的返回地址后執(zhí)行g(shù)adget,而對(duì)于通過(guò)覆蓋函數(shù)指針發(fā)起ROP攻擊的研究很少.本文通過(guò)實(shí)驗(yàn)證明了這種攻擊是存在的.因?yàn)楹瘮?shù)指針在c/c++中普遍存在,所以很容易被攻擊者所利用.本文提出的fpDetect檢測(cè)方法能夠檢測(cè)基于函數(shù)指針發(fā)起的ROP攻擊,同時(shí)也提高了檢測(cè)的準(zhǔn)確率.但是除了檢測(cè)攻擊,還要把更多的精力放到防御上.
由于近年來(lái)大多數(shù)研究集中在應(yīng)用層代碼重用攻擊上,而面向內(nèi)核級(jí)的代碼復(fù)用攻擊將會(huì)給計(jì)算機(jī)帶來(lái)更加實(shí)質(zhì)性的破壞[19],所以接下來(lái)作者將要研究?jī)?nèi)核級(jí)代碼復(fù)用攻擊.并且會(huì)把更多的研究重點(diǎn)放到防御上.