本發(fā)明屬于系統(tǒng)安全
技術(shù)領(lǐng)域:
:,更具體地,涉及一種針對(duì)ROP攻擊的檢測(cè)方法。
背景技術(shù):
::隨著信息技術(shù)的高速發(fā)展和網(wǎng)絡(luò)的快速普及,計(jì)算機(jī)軟件系統(tǒng)在社會(huì)生活中扮演著越來(lái)越重要的角色,與此同時(shí),各種程序漏洞仍然很普遍,在遺留的軟件系統(tǒng)中尤為突出,通過(guò)這些漏洞,攻擊者可以劫持軟件系統(tǒng)程序的控制流并將其轉(zhuǎn)向自己預(yù)設(shè)的控制流,令系統(tǒng)執(zhí)行非用戶意愿的行為。一種普遍的攻擊方式就是Return-OrientedProgramming(簡(jiǎn)稱ROP)攻擊,這種攻擊方式通過(guò)搜索內(nèi)存中以跳轉(zhuǎn)指令(如RET指令)結(jié)尾的代碼片段,并將這些代碼片段進(jìn)行組合形成一個(gè)用于完成攻擊目的的指令序列,利用內(nèi)存漏洞替換掉原有的程序流程。ROP攻擊者最常用的就是在Windows的動(dòng)態(tài)鏈接庫(kù)中搜索代碼片段。現(xiàn)有的針對(duì)ROP攻擊的實(shí)際運(yùn)用的檢測(cè)方法是控制流完整性檢測(cè)方法(ControlFlowIntegrity,CFI):由加州大學(xué)和微軟公司于2005年提出,其檢測(cè)策略是檢查程序控制流的完整性,不允許非法轉(zhuǎn)移程序的控制流,這就切斷了ROP的攻擊途徑。承襲此思想,Abadi提出了基于控制流程圖(Controlflowgraph,CFG)的CFI檢測(cè)機(jī)制,程序按照控制流程在每一個(gè)跳轉(zhuǎn)指令進(jìn)行地址跳轉(zhuǎn)時(shí),通過(guò)檢查目的地址的有效性,從而保證程序所執(zhí)行的命令在預(yù)先設(shè)定的CFG范圍內(nèi)。這種檢測(cè)機(jī)制不僅能夠檢測(cè)靜態(tài)ROP攻擊還能夠檢測(cè)即時(shí)搜索代碼的JIT-ROP攻擊(Just-In-TimeCodeReuse)。但是由于CFI針對(duì)程序每一步都要進(jìn)行過(guò)濾,所以會(huì)產(chǎn)生巨大的性能負(fù)擔(dān);同樣由于該方案是需要對(duì)系統(tǒng)的內(nèi)核程序進(jìn)行修改,在Windows8之前的系統(tǒng)都不能應(yīng)用這種檢測(cè)方法?;诘刂房臻g隨機(jī)化(AddressSpaceLayoutRandomization,ASLR)能夠防御非JIT-ROP類型的ROP攻擊,在WindowsVista版本及以后的Windows系統(tǒng)中均實(shí)現(xiàn)了此技術(shù),但在之前的Windows版本并不兼容此方法。目前還沒(méi)有一種方法能夠在在這些系統(tǒng)中實(shí)現(xiàn)檢測(cè)ROP攻擊。根據(jù)零點(diǎn)指標(biāo)數(shù)據(jù)2015年3月9日公布的網(wǎng)絡(luò)調(diào)查結(jié)果顯示,目前WindowsXP在國(guó)內(nèi)電腦操作系統(tǒng)市場(chǎng)占據(jù)半壁江山的份額,盡管微軟停止技術(shù)支持,但是仍有近八成用戶不愿放棄使用XP。因此針對(duì)適用于所有系統(tǒng)的ROP檢測(cè)研究還是很有必要的。技術(shù)實(shí)現(xiàn)要素:針對(duì)現(xiàn)有技術(shù)的以上缺陷或改進(jìn)需求,本發(fā)明提出了一種針對(duì)ROP攻擊的檢測(cè)方法,其目的在于轉(zhuǎn)移ROP所攻擊的動(dòng)態(tài)鏈接庫(kù)的加載位置,,并在原加載位置填充警告指令,由此滿足ROP攻擊的防御需求。為實(shí)現(xiàn)上述目的,按照本發(fā)明的一個(gè)方面,提出了一種針對(duì)ROP攻擊的檢測(cè)方法,包括:修改動(dòng)態(tài)鏈接庫(kù)的基址字段,令所述基址字段指向的基址由動(dòng)態(tài)鏈接庫(kù)的初始基址改變?yōu)閯?dòng)態(tài)鏈接庫(kù)的新基址,且所述動(dòng)態(tài)鏈接庫(kù)的新基址=偏移量+動(dòng)態(tài)鏈接庫(kù)的初始基址;在動(dòng)態(tài)鏈接庫(kù)中增加代碼段,所述代碼段用于在動(dòng)態(tài)鏈接庫(kù)的初始基址對(duì)應(yīng)的加載位置填充警告指令;所述代碼段的尾部具有跳轉(zhuǎn)指令,所述跳轉(zhuǎn)指令的跳轉(zhuǎn)距離為跳轉(zhuǎn)指令與動(dòng)態(tài)鏈接庫(kù)的原入口函數(shù)的相對(duì)距離;將動(dòng)態(tài)鏈接庫(kù)的入口地址由原入口函數(shù)的起始地址修改為所述代碼段的起始地址。優(yōu)選地,動(dòng)態(tài)鏈接庫(kù)的新基址=偏移量+動(dòng)態(tài)鏈接庫(kù)的初始基址,所述偏移量為分配粒度的隨機(jī)非零整數(shù)倍,且所述偏移量的絕對(duì)值大于動(dòng)態(tài)鏈接庫(kù)的長(zhǎng)度。優(yōu)選地,所述在動(dòng)態(tài)鏈接庫(kù)中增加代碼段的方法具體為:在動(dòng)態(tài)鏈接庫(kù)的所有段之后增加代碼段,令新的動(dòng)態(tài)鏈接庫(kù)的段數(shù)=初始的動(dòng)態(tài)鏈接庫(kù)的段數(shù)+1;令動(dòng)態(tài)鏈接庫(kù)的新長(zhǎng)度=動(dòng)態(tài)鏈接庫(kù)的初始長(zhǎng)度+增加的代碼段的長(zhǎng)度;將增加的代碼段的屬性保存于動(dòng)態(tài)鏈接庫(kù)的段表中。優(yōu)選地,所述檢測(cè)方法還包括計(jì)算并修改所述動(dòng)態(tài)鏈接庫(kù)的校驗(yàn)和。優(yōu)選地,所述檢測(cè)方法用于Windows系統(tǒng)??傮w而言,通過(guò)本發(fā)明所構(gòu)思的以上技術(shù)方案與現(xiàn)有技術(shù)相比,由于對(duì)動(dòng)態(tài)鏈接庫(kù)的基址進(jìn)行修改,從而改變動(dòng)態(tài)鏈接庫(kù)的加載位置,能夠取得下列有益效果:1、本發(fā)明的方法不需要對(duì)系統(tǒng)的內(nèi)核程序進(jìn)行修改,僅僅通過(guò)修改動(dòng)態(tài)鏈接庫(kù)的加載位置實(shí)現(xiàn)ROP攻擊的檢測(cè),能應(yīng)用于所有Windows系統(tǒng);2、本發(fā)明無(wú)需針對(duì)程序的每一步過(guò)濾,對(duì)系統(tǒng)的性能不會(huì)產(chǎn)生額外負(fù)擔(dān),同時(shí)能夠檢測(cè)除JIT-ROP以外的所有ROP攻擊。附圖說(shuō)明圖1本發(fā)明檢測(cè)ROP攻擊過(guò)程的示意圖;圖2原始動(dòng)態(tài)鏈接庫(kù)結(jié)構(gòu)和修改后的動(dòng)態(tài)鏈接庫(kù)結(jié)構(gòu);圖3在動(dòng)態(tài)鏈接庫(kù)中增加新段需要修改的位置;圖4加載階段,動(dòng)態(tài)鏈接庫(kù)修改前后內(nèi)存的情況;圖5a為修改動(dòng)態(tài)鏈接庫(kù)之前,ROP攻擊過(guò)程;圖5b為修改動(dòng)態(tài)鏈接庫(kù)以后,ROP攻擊過(guò)程。具體實(shí)施方式為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,以下結(jié)合附圖及實(shí)施例,對(duì)本發(fā)明進(jìn)行進(jìn)一步詳細(xì)說(shuō)明。應(yīng)當(dāng)理解,此處所描述的具體實(shí)施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。此外,下面所描述的本發(fā)明各個(gè)實(shí)施方式中所涉及到的技術(shù)特征只要彼此之間未構(gòu)成沖突就可以相互組合。本發(fā)明公開(kāi)了一種針對(duì)ROP攻擊的檢測(cè)方法,在該檢測(cè)方法中,我們解決了以下技術(shù)問(wèn)題:1、在未應(yīng)用ASLR的系統(tǒng)中實(shí)現(xiàn)檢測(cè)并防御ROP攻擊;2.提出的解決方案具有普適性,即適用于所有Windows系統(tǒng)。由于系統(tǒng)在加載動(dòng)態(tài)鏈接庫(kù)時(shí)都是按照基址字段,將動(dòng)態(tài)鏈接庫(kù)加載至對(duì)應(yīng)的加載位置。通常而言,動(dòng)態(tài)鏈接庫(kù)的基址與動(dòng)態(tài)鏈接庫(kù)中的基址字段相同,都是固定的。ROP攻擊者在攻擊之前就已會(huì)準(zhǔn)備好這些代碼,然后按照該固定的基址去訪問(wèn),所以在進(jìn)行攻擊之前都會(huì)確保內(nèi)存中已經(jīng)加載了代碼段所屬的動(dòng)態(tài)鏈接庫(kù),以便成功部署攻擊。本發(fā)明的思路就是要轉(zhuǎn)移這些動(dòng)態(tài)鏈接庫(kù)的加載位置(以基址為起始位置,長(zhǎng)度為動(dòng)態(tài)鏈接庫(kù)的長(zhǎng)度的內(nèi)存空間),將加載位置在內(nèi)存中偏移一段距離,然后在動(dòng)態(tài)鏈接庫(kù)的初始基址對(duì)應(yīng)的加載位置填充警告指令,那么ROP攻擊者按照原基址進(jìn)行訪問(wèn)時(shí),訪問(wèn)的就是警告指令,使得系統(tǒng)檢測(cè)到ROP攻擊。這種檢測(cè)方式不會(huì)影響到動(dòng)態(tài)鏈接庫(kù)的正常使用,且不會(huì)需要更改系統(tǒng)的內(nèi)核。針對(duì)技術(shù)問(wèn)題,對(duì)動(dòng)態(tài)鏈接庫(kù)進(jìn)行重定位,使其偏移原來(lái)的加載位置,并在原來(lái)的加載位置填充警告指令,使得ROP攻擊者執(zhí)行警告指令,導(dǎo)致系統(tǒng)捕獲異常,檢測(cè)出ROP攻擊。其過(guò)程如圖1所示。將本發(fā)明的技術(shù)方案應(yīng)用到系統(tǒng)的動(dòng)態(tài)鏈接庫(kù)后,能夠確保利用這些動(dòng)態(tài)鏈接庫(kù)進(jìn)行普通ROP攻擊(即非JIT-ROP攻擊)的攻擊行為將無(wú)法成功實(shí)施。具體而言,本發(fā)明針對(duì)ROP攻擊的檢測(cè)方法包括:修改動(dòng)態(tài)鏈接庫(kù)的加載位置,在動(dòng)態(tài)鏈接庫(kù)中增加代碼段,計(jì)算并修改動(dòng)態(tài)鏈接庫(kù)的校驗(yàn)和;其中,修改動(dòng)態(tài)鏈接庫(kù)的加載位置具體包括:修改動(dòng)態(tài)鏈接庫(kù)的基址字段,令所述基址字段指向的基址由動(dòng)態(tài)鏈接庫(kù)的初始基址改變?yōu)閯?dòng)態(tài)鏈接庫(kù)的新基址,且所述動(dòng)態(tài)鏈接庫(kù)的新基址=偏移量+動(dòng)態(tài)鏈接庫(kù)的初始基址,所述偏移量為分配粒度(一般為64K)的隨機(jī)非零整數(shù)倍,且所述偏移量的絕對(duì)值大于動(dòng)態(tài)鏈接庫(kù)的長(zhǎng)度;所述在動(dòng)態(tài)鏈接庫(kù)中增加代碼段具體包括:在動(dòng)態(tài)鏈接庫(kù)中增加代碼段,所述代碼段用于在動(dòng)態(tài)鏈接庫(kù)的初始基址對(duì)應(yīng)的加載位置填充警告指令;所述代碼段的尾部具有跳轉(zhuǎn)指令,所述跳轉(zhuǎn)指令的跳轉(zhuǎn)距離為跳轉(zhuǎn)指令的起始地址與動(dòng)態(tài)鏈接庫(kù)的原入口函數(shù)的起始地址的相對(duì)距離;將動(dòng)態(tài)鏈接庫(kù)的入口地址設(shè)置為所述代碼段的起始地址。其中,所述在動(dòng)態(tài)鏈接庫(kù)中增加代碼段的方法具體為:在動(dòng)態(tài)鏈接庫(kù)的所有段之后增加代碼段,如果在動(dòng)態(tài)鏈接庫(kù)中包括綁定導(dǎo)入表(boundimporttable),則還需將綁定導(dǎo)入表轉(zhuǎn)移至新段之后;令新的動(dòng)態(tài)鏈接庫(kù)的段數(shù)=初始的動(dòng)態(tài)鏈接庫(kù)的段數(shù)+1;令動(dòng)態(tài)鏈接庫(kù)的新長(zhǎng)度=動(dòng)態(tài)鏈接庫(kù)的初始長(zhǎng)度+增加的代碼段的長(zhǎng)度;將增加的代碼段的屬性保存于動(dòng)態(tài)鏈接庫(kù)的段表中。在系統(tǒng)以上述方法進(jìn)行防御后,針對(duì)ROP的攻擊,系統(tǒng)的檢測(cè)方法分以下步驟進(jìn)行:1、ROP攻擊者促使系統(tǒng)加載動(dòng)態(tài)鏈接庫(kù);2、系統(tǒng)從動(dòng)態(tài)鏈接庫(kù)的入口地址從而跳轉(zhuǎn)至增加的代碼段;3、系統(tǒng)執(zhí)行增加的代碼段中的代碼,首先在動(dòng)態(tài)鏈接庫(kù)的初始基址對(duì)應(yīng)的加載位置填充警告指令,然后執(zhí)行增加的代碼段尾部的跳轉(zhuǎn)指令,并跳轉(zhuǎn)至原入口函數(shù);4、系統(tǒng)執(zhí)行原入口函數(shù),由于動(dòng)態(tài)鏈接庫(kù)的基址字段發(fā)生了變化,從而使得動(dòng)態(tài)鏈接庫(kù)的對(duì)應(yīng)的加載位置也發(fā)生了變化,如此便將動(dòng)態(tài)鏈接庫(kù)轉(zhuǎn)移到了一個(gè)新位置;5、此時(shí),ROP攻擊者仍然按照動(dòng)態(tài)鏈接庫(kù)的初始基址訪問(wèn)動(dòng)態(tài)鏈接庫(kù)的初始基址對(duì)應(yīng)的加載位置,由于此處已被填充為警告指令,于是系統(tǒng)發(fā)現(xiàn)ROP攻擊,從而實(shí)現(xiàn)了ROP攻擊的檢測(cè)。實(shí)施例1PE文件指的是微軟Windows操作系統(tǒng)的程序文件,動(dòng)態(tài)鏈接庫(kù)就屬于典型的PE文件。目前,PE文件的修改技術(shù)已十分成熟,但是,還沒(méi)有出現(xiàn)一種成熟的技術(shù)僅僅通過(guò)修改動(dòng)態(tài)鏈接庫(kù)來(lái)檢測(cè)ROP攻擊的。利用這種思路來(lái)檢測(cè)ROP攻擊不需要對(duì)系統(tǒng)進(jìn)行內(nèi)核程序的修改,可兼容所有的Windows系統(tǒng)。本實(shí)施例提供了一種針對(duì)ROP攻擊的檢測(cè)方法,包括預(yù)處理階段以及加載階段:預(yù)處理階段中,我們采用的方案是在原有的動(dòng)態(tài)鏈接庫(kù)中新增加一個(gè)代碼段作為新段,然后在該新段中添加代碼來(lái)實(shí)現(xiàn)在原始動(dòng)態(tài)鏈接庫(kù)的加載位置填充警告指令的功能。圖3是在圖2的基礎(chǔ)上詳細(xì)標(biāo)記出了要修改的部分,在NT頭中要修改四部分的內(nèi)容,分別是PE文件頭中的表示段個(gè)數(shù)的字段,PE可選頭中表示動(dòng)態(tài)鏈接庫(kù)大小的字段、原入口函數(shù)地址、和校驗(yàn)和字段,段表中需要新增一個(gè)段表用來(lái)描述新增加的段,以及要在新段中填充代碼。S1.實(shí)現(xiàn)動(dòng)態(tài)鏈接庫(kù)的重定位,詳細(xì)步驟如下:S11決定動(dòng)態(tài)鏈接庫(kù)的基址字段對(duì)應(yīng)的基址的偏移量。我們采用隨機(jī)函數(shù)來(lái)隨機(jī)生成一個(gè)值作為偏移量,不使用固定值是為了防止ROP攻擊者在自己的系統(tǒng)實(shí)施此方案后重新獲得此基址字段,然后根據(jù)固定的偏移量來(lái)實(shí)施攻擊。此偏移量在隨機(jī)化的基礎(chǔ)上還需要滿足兩個(gè)條件:(1)為了不給攻擊者留下任何搜索到可利用信息的可能,偏移量的絕對(duì)值必須大于動(dòng)態(tài)鏈接庫(kù)的長(zhǎng)度;(2)由于在Windows系統(tǒng)中動(dòng)態(tài)鏈接庫(kù)的基址都是按照64K(0x10000)作為分配粒度進(jìn)行對(duì)齊,所以計(jì)算得到的偏移量還需要依此進(jìn)行對(duì)齊,即偏移量為分配粒度的整數(shù)倍。S12.修改動(dòng)態(tài)鏈接庫(kù)的基址字段。Windows操作系統(tǒng)選擇動(dòng)態(tài)鏈接庫(kù)的基址時(shí)會(huì)參照動(dòng)態(tài)鏈接庫(kù)文件的基址字段來(lái)進(jìn)行加載。讀取PE頭部信息,該字段位于如圖2所示的NT頭部的PE可選頭。這里將從原來(lái)的動(dòng)態(tài)鏈接庫(kù)中讀取到的基址字段稱為原基址字段,計(jì)算方法為:新基址字段=原基址字段+偏移量。例如現(xiàn)有一個(gè)動(dòng)態(tài)鏈接庫(kù)的基址字段是0x12340000,假設(shè)經(jīng)1)計(jì)算的偏移量為0x220000,那么新的基址字段就是0x12340000+0x220000=0x12560000;該偏移量與步驟S11中的偏移量相同;S13.修改動(dòng)態(tài)鏈接庫(kù)。在動(dòng)態(tài)鏈接庫(kù)中的指令地址、數(shù)據(jù)地址是使用基于基址字段的絕對(duì)地址來(lái)表示的。如果基址字段發(fā)生變化,那么絕對(duì)地址就要基于新基址字段發(fā)生變化。修改公式同步驟S12。動(dòng)態(tài)鏈接庫(kù)中的重定位段(reloc段),如圖2所示,標(biāo)記出了這些需要修改的指令地址和數(shù)據(jù)地址在動(dòng)態(tài)鏈接庫(kù)中的位置。圖1中從上到下分別是動(dòng)態(tài)鏈接庫(kù)的初始基址和修改后的動(dòng)態(tài)鏈接庫(kù)的新基址,實(shí)線框中是修改后的動(dòng)態(tài)鏈接庫(kù),當(dāng)動(dòng)態(tài)鏈接庫(kù)根據(jù)修改后的基址字段加載到動(dòng)態(tài)鏈接庫(kù)的新基址時(shí),會(huì)在動(dòng)態(tài)鏈接庫(kù)的初始基址對(duì)應(yīng)的加載位置填充警告指令。當(dāng)ROP攻擊程序按照原始動(dòng)態(tài)鏈接庫(kù)的基址字段進(jìn)行訪問(wèn)時(shí),會(huì)觸發(fā)警告指令的執(zhí)行,告知系統(tǒng)可能遭到攻擊。S2.在動(dòng)態(tài)鏈接庫(kù)中新增一個(gè)代碼段作為新段,所述新段用于填充代碼。在系統(tǒng)加載該動(dòng)態(tài)鏈接庫(kù)的時(shí)候會(huì)運(yùn)行這些代碼:所述代碼用于在動(dòng)態(tài)鏈接庫(kù)的原基址對(duì)應(yīng)的加載位置填充警告指令。詳細(xì)步驟如下:S21.準(zhǔn)備增加的代碼段(CodeForFillSection),這里將命名為.stext段。增加的代碼段中代碼的作用是利用軟件系統(tǒng)提供的內(nèi)存分配函數(shù)申請(qǐng)?jiān)刂房臻g,然后用內(nèi)存填充函數(shù)將申請(qǐng)的空間填充為警告指令。在C語(yǔ)言中嵌套匯編語(yǔ)句實(shí)現(xiàn)這一功能,然后編譯鏈接獲得相應(yīng)的可執(zhí)行二進(jìn)制文件,將其提取出來(lái),成為.stext段的內(nèi)容。S22.修改動(dòng)態(tài)鏈接庫(kù)的文件頭中的段數(shù)字段,該字段位于NT頭中的可選頭字段,如圖3的標(biāo)記1中所示,該字段描述該動(dòng)態(tài)鏈接庫(kù)中有多少個(gè)段,修改公式:段數(shù)(新)=段數(shù)(舊)+1。S23.修改動(dòng)態(tài)鏈接庫(kù)文件長(zhǎng)度,如圖3的標(biāo)記2處。修改公式:動(dòng)態(tài)鏈接庫(kù)文件長(zhǎng)度(新)=動(dòng)態(tài)鏈接庫(kù)文件長(zhǎng)度(舊)+增加的.stext段的長(zhǎng)度(即.stext段按照段對(duì)齊字段(SectionAlignment)對(duì)齊后的大小,段對(duì)齊字段是圖2中位于NT頭中的可選頭里面的一個(gè)字段)。.stext段中填充的代碼不會(huì)超過(guò)對(duì)齊字段對(duì)應(yīng)的分配粒度,所以.stext段的長(zhǎng)度在通常情況下也就是分配粒度的長(zhǎng)度。S24.新增段表,如圖3的標(biāo)記3處,用來(lái)描述.stext段的屬性。需要修改的屬性有段名、段的文件大小(指段中的實(shí)際數(shù)據(jù)大小)、.stext段的長(zhǎng)度、段文件偏移和段相對(duì)偏移(在內(nèi)存中加載該動(dòng)態(tài)鏈接庫(kù)后的偏移),以及頁(yè)面屬性(可讀、可寫(xiě)、可執(zhí)行)信息。如果動(dòng)態(tài)鏈接庫(kù)結(jié)構(gòu)中含有綁定導(dǎo)入表(boundimporttable,位于圖3中PE可選頭的數(shù)據(jù)目錄中),因其位于段表之后,所以需要修改其偏移值:新偏移值=舊偏移值+一個(gè)段表的大小。每個(gè)段表的結(jié)構(gòu)相同,大小均為固定值,可直接求其包含數(shù)據(jù)的多少獲得。再將綁定導(dǎo)入表追加在新段表之后。S25.如圖3的標(biāo)記4處,將S21.中準(zhǔn)備好的.stext段追加在所有段之后。如果動(dòng)態(tài)鏈接庫(kù)文件中包含證書(shū)表(CertificateTable,位于圖3中PE可選頭的數(shù)據(jù)目錄中),因其位于段結(jié)構(gòu)之后,所以需要修改其偏移值:新偏移值=舊偏移值+新段大小。再將綁定證書(shū)表追加在新段之后,這些并不影響新段的內(nèi)容。修改前后的數(shù)據(jù)庫(kù)結(jié)構(gòu)如圖2所示,原始動(dòng)態(tài)鏈接庫(kù)結(jié)構(gòu)包括DOS頭、NT頭(NT頭里面又包括PE簽名、PE文件頭、PE可選頭)、段表、.text段、.data段、.reloc段...(這里只列出動(dòng)態(tài)鏈接庫(kù)公有的段,個(gè)別動(dòng)態(tài)鏈接庫(kù)可能含有其他特定的段,這些段并不影響本發(fā)明的功能描述,所以予以忽略)修改后的動(dòng)態(tài)鏈接庫(kù)在結(jié)構(gòu)上新增加了一個(gè).stext段,用以實(shí)現(xiàn)在原始動(dòng)態(tài)鏈接庫(kù)的加載位置填充警告指令。S3.實(shí)現(xiàn)代碼跳轉(zhuǎn),使得填充在新段的代碼順利執(zhí)行。S31.修改動(dòng)態(tài)鏈接庫(kù)的入口地址,在圖3標(biāo)志2處的PE可選頭中獲得。系統(tǒng)在加載動(dòng)態(tài)鏈接庫(kù)時(shí),會(huì)首先執(zhí)行原入口函數(shù),為了在加載時(shí)成功執(zhí)行.stext段的代碼,我們重新設(shè)置程序的原入口函數(shù)的地址為.stext段的起始地址(S24中的段相對(duì)偏移)。S32.在.stext段后面添加跳轉(zhuǎn)指令,在執(zhí)行CodeForFillSection中的代碼后則通過(guò)跳轉(zhuǎn)指令跳轉(zhuǎn)到原來(lái)的原入口函數(shù),以便系統(tǒng)正常加載動(dòng)態(tài)鏈接庫(kù)。添加的跳轉(zhuǎn)指令只能使用相對(duì)跳轉(zhuǎn)指令,跳轉(zhuǎn)距離為跳轉(zhuǎn)指令到原入口函數(shù)的地址的相對(duì)距離。S33.計(jì)算并修改校驗(yàn)和,校驗(yàn)和是校驗(yàn)整個(gè)動(dòng)態(tài)鏈接庫(kù)文件,用來(lái)驗(yàn)證動(dòng)態(tài)鏈接庫(kù)是否被篡改,位于圖3標(biāo)志2處。使用系統(tǒng)提供的接口函數(shù)創(chuàng)建動(dòng)態(tài)鏈接庫(kù)修改后的文件映射,并根據(jù)映射地址和文件長(zhǎng)度計(jì)算出修改后的動(dòng)態(tài)鏈接庫(kù)的新校驗(yàn)和,替換原校驗(yàn)和。這是每當(dāng)動(dòng)態(tài)鏈接庫(kù)發(fā)生變化后才必須要修改的地方,因?yàn)橄到y(tǒng)在加載時(shí)會(huì)用這個(gè)值進(jìn)行驗(yàn)證。加載階段,在系統(tǒng)以上述方法進(jìn)行了防御后,針對(duì)ROP的攻擊,系統(tǒng)的加載階段分以下步驟進(jìn)行:假設(shè)現(xiàn)有一動(dòng)態(tài)鏈接庫(kù)的基址字段為0x12340000,修改后的基址字段為0x12560000,修改前后,系統(tǒng)的內(nèi)存狀態(tài)如圖4所示,左邊是加載原始動(dòng)態(tài)鏈接庫(kù)的內(nèi)存空間,原始動(dòng)態(tài)鏈接庫(kù)加載于起始位置為0x12340000,結(jié)束位置為0x12560000的地方。右邊是加載修改后的動(dòng)態(tài)鏈接庫(kù)的內(nèi)存空間,修改后的動(dòng)態(tài)鏈接庫(kù)加載在起始位置為0x12560000的地方,即原始動(dòng)態(tài)鏈接庫(kù)的結(jié)束位置,并且0x12340000~0x12560000的內(nèi)存空間被填充為了警告指令。本方案的檢測(cè)機(jī)制是實(shí)時(shí)的,一旦遭到攻擊就會(huì)檢測(cè)出ROP攻擊行為,所以該階段的說(shuō)明需要結(jié)合攻擊來(lái)闡述。例如在加載階段中的某原始動(dòng)態(tài)鏈接庫(kù)中有下面這樣一個(gè)代碼片段可以被ROP攻擊者利用。0x12367890pushad0x12367891retn在加載原始動(dòng)態(tài)鏈接庫(kù)的系統(tǒng)遭到ROP攻擊時(shí),如圖5a,ROP攻擊者通過(guò)內(nèi)存泄露漏洞將函數(shù)的返回地址addr1修改為在目標(biāo)動(dòng)態(tài)鏈接庫(kù)中搜索到的代碼片段的地址,如0x12367890,使得本來(lái)要跳轉(zhuǎn)到addr1的程序控制流跳轉(zhuǎn)到了0x12367890去執(zhí)行代碼片段(pushad,retn),成功劫持了程序控制流。然而,在加載修改后的動(dòng)態(tài)鏈接庫(kù)系統(tǒng)遭到ROP攻擊時(shí),如圖5b,0x12367890處的代碼已經(jīng)是我們填充的警告指令。當(dāng)攻擊者覆蓋了返回地址,跳到0x12367890處時(shí),便會(huì)執(zhí)行警告指令,導(dǎo)致系統(tǒng)發(fā)現(xiàn)異常,檢測(cè)出ROP攻擊,使得攻擊失敗。該具體步驟如下:1、ROP攻擊者促使系統(tǒng)加載動(dòng)態(tài)鏈接庫(kù);2、系統(tǒng)從動(dòng)態(tài)鏈接庫(kù)的入口地址從而跳轉(zhuǎn)至.stext段;3、系統(tǒng)執(zhí)行增加的代碼段中的代碼,首先在動(dòng)態(tài)鏈接庫(kù)的初始基址對(duì)應(yīng)的加載位置(即圖4中0x12340000~0x12560000的位置)填充警告指令,然后執(zhí)行代碼段尾部的跳轉(zhuǎn)指令,并跳轉(zhuǎn)至原入口函數(shù);4、系統(tǒng)執(zhí)行原入口函數(shù),由于動(dòng)態(tài)鏈接庫(kù)的基址字段發(fā)生了變化,從而使得動(dòng)態(tài)鏈接庫(kù)的對(duì)應(yīng)的加載位置也發(fā)生了變化(圖4中由0x12340000~0x12560000變?yōu)榱?x12560000~0x12780000),如此便將動(dòng)態(tài)鏈接庫(kù)轉(zhuǎn)移到了一個(gè)新的加載位置;5、此時(shí),ROP攻擊者仍然按照動(dòng)態(tài)鏈接庫(kù)的初始基址訪問(wèn)動(dòng)態(tài)鏈接庫(kù)的初始基址對(duì)應(yīng)的加載位置(即圖4中0x12340000~0x12560000的位置),由于此處已被填充為警告指令,于是系統(tǒng)發(fā)現(xiàn)ROP攻擊,從而實(shí)現(xiàn)了ROP攻擊的檢測(cè)。本領(lǐng)域的技術(shù)人員容易理解,以上所述僅為本發(fā)明的較佳實(shí)施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi)所作的任何修改、等同替換和改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。當(dāng)前第1頁(yè)1 2 3 當(dāng)前第1頁(yè)1 2 3