趙利軍 王震宇 王奕森 莊 寬
(信息工程大學數(shù)學工程與先進計算國家重點實驗室 河南 鄭州 450001)
?
基于ARMv8架構(gòu)gadget自動搜索框架
趙利軍王震宇王奕森莊寬
(信息工程大學數(shù)學工程與先進計算國家重點實驗室河南 鄭州 450001)
摘要為了在ARM公司最新發(fā)布的首款支持64位處理器的ARMv8架構(gòu)上實現(xiàn)ROP(Return_Oriented Programmig)技術(shù),設(shè)計了ARMv8架構(gòu)上的ROP gadget的自動搜索工具。通過結(jié)合ARMv8架構(gòu)指令系統(tǒng)的特點,首先在庫文件搜索出所有的以RET指令結(jié)尾的短指令序列,并把這些指令序列存儲在gadget庫中,然后采用一些優(yōu)化策略對該庫進行優(yōu)化,最后根據(jù)用戶的輸入在庫中搜索到與用戶輸入功能相同的gadget鏈。通過對搜索工具搜索到的gadget的統(tǒng)計,結(jié)果表明gadget集具有圖靈完整性,可以執(zhí)行任意的操作。最后通過一個實例證明了ROP在ARMv8架構(gòu)上的可行性。
關(guān)鍵詞ROP指令序列自動搜索ARMv8圖靈完整性
0引言
數(shù)據(jù)執(zhí)行保護和簽名等技術(shù)有效地阻止了代碼注入式攻擊。2005年Sebastian Krahmer等人提出了一種借用代碼攻擊方法,該方法不再需要向內(nèi)存中注入惡意代碼,而是利用代碼段中的代碼實現(xiàn)攻擊。return-into-libc[1]技術(shù)是一種典型的借用代碼攻擊,通過劫持控制流,跳轉(zhuǎn)到C語言函數(shù)庫libc,復(fù)用libc中已有的函數(shù)。但是return-into-libc攻擊只能順序調(diào)用函數(shù),不能實現(xiàn)圖靈完備的行為,如分支操作、循環(huán)操作等。
為了彌補return-into-libc攻擊的局限性, 2007年Hova Shacham[2]第一次提出了X86平臺上的返回導向編程技術(shù)ROP。返回導向編程攻擊的方式不再局限于將漏洞程序的控制流跳轉(zhuǎn)到庫函數(shù)中,而是利用庫函數(shù)或可執(zhí)行文件的指令代碼片段實現(xiàn)攻擊,將復(fù)用的代碼粒度從return-to-libc的函數(shù)級別縮小到指令序列。 自2007年ROP概念被提出后,關(guān)于ROP攻擊的研究引起了研究人員的廣泛關(guān)注,他們先后在各個平臺上對ROP攻擊進行實驗。例如ARM平臺,SPARC平臺和AVR平臺。Tim Kornau[3]首次在ARM架構(gòu)上實現(xiàn)了ROP攻擊并驗證了圖靈完整性,而且提出了一套基于REIL語言的自動構(gòu)建ROP鏈的算法。2008年,Erik Buchanan[4]等人在SPARC平臺上驗證了ROP圖靈完整性。盧森堡大學的Ralf-Philipp Weinmann利用ROP技術(shù)實現(xiàn)了iOS系統(tǒng)的入侵[5]。
ROP技術(shù)至關(guān)重要的一環(huán)就是可用指令序列的自動搜索,本文中將這些指令序列定義為gadget。由于庫文件中的代碼的數(shù)量非常巨大,所以手工搜索gadget將會非常的耗時,這將嚴重降低ROP技術(shù)的效率。2011年,Edward J. Schwartz[6]等人提出了一種 X86 平臺上gadget 自動搜索算法,其定義了內(nèi)部語言 QooL 來實現(xiàn)漏洞程序到 ROP payload 之間的轉(zhuǎn)換,但是其缺陷是定義的語義只有內(nèi)存操作和邏輯操作,沒有涉及到條件執(zhí)行和循環(huán)。然而這些技術(shù)只適用于X86架構(gòu),并不適用于其它架構(gòu),特別是RISC架構(gòu)。2010年,Kornau 等人在ARM架構(gòu)上實現(xiàn)一種基于中間語言 REIL 的 ARM gadget 自動搜索算法,首先該算法定位到分支指令,然后根據(jù)語法樹算法把一條指令翻譯成 REIL 語言,最后組合信息成為有用的gadgets。Edward J. Schwartz等人提出的自動構(gòu)造ROP攻擊的框架Q是基于短指令序列的,不能繞過Ping Chen[7]等人的提出的防御機制。2014年,Chao Yang[8]等人在Schwartz基礎(chǔ)上提出了基于長指令序列的自動構(gòu)造框架,成功地繞過了Ping Chen等人的防御機制。
ARMv8架構(gòu)為了獲得低功耗高效率的64位計算優(yōu)勢,引入了一個全新的指令字長為32位的64位指令集A64。上文論述的gadget搜索算法或是針對ARMv7架構(gòu),或是針對X86架構(gòu),并沒有解決ARMv8架構(gòu)gadget搜索關(guān)鍵問題:(1) ARMv8 gadget的搜索。ARMv7中用于實現(xiàn)函數(shù)返回的BX lr指令在A64指令集中已經(jīng)不復(fù)存在。A64指令集中,用于實現(xiàn)函數(shù)返回的指令為RET {Xm}(當Xm省略時默認使用X30),ARMv7不存在該條指令。(2) ARMv8的圖靈完整性。為了支持ARMv8新的指令系統(tǒng)和技術(shù)特性,其運行支撐環(huán)境也發(fā)生了顯著的變化。新的動態(tài)鏈接庫中的gadget集是否具有圖靈完整性也需要重新考證。本文通過對X86架構(gòu)下的gadget自動搜索算法的分析,結(jié)合ARMv8指令集的特征,設(shè)計了ARMv8架構(gòu)下的gadget自動搜索工具,并利用搜索到的指令序列在ARMv8 linux中進行了實驗。
1ARMv8架構(gòu)的差異性分析
ARMv8架構(gòu)在指令集設(shè)置、寄存器使用和函數(shù)調(diào)用等方面和我們熟知的架構(gòu)(X86,ARM)截然不同。ARMv8架構(gòu)有兩種工作狀態(tài)-AArch64和AArch32。在這兩種工作狀態(tài)下指令集仍然都是32位的,但是指令的尋址范圍不同了:AArch64狀態(tài)下支持64bit的地址空間,AArch32狀態(tài)下支持32 bit的地址空間,且在每種工作狀態(tài)下ARMv8都有31個通用寄存器[9]。本文將主要對AArch64狀態(tài)下ARMV8架構(gòu)的差異性。
1.1子函數(shù)調(diào)用規(guī)則
ARMv8架構(gòu)摒棄了ARMv7架構(gòu)下的7中工作模式-1個用戶模式和6個特權(quán)模式,ARMV8架構(gòu)下采用4種工作模式EL0-EL3,EL0相當于用戶模式,下面我們將主要對非特權(quán)模式進行分析。
ARMv8架構(gòu)下當發(fā)生子函數(shù)調(diào)用時,程序?qū)C中下一條指令的地址保存到寄存器X30中,然后跳轉(zhuǎn)到PC中的地址去執(zhí)行,當函數(shù)返回時程序?qū)D(zhuǎn)到X30寄存器中的地址處執(zhí)行。當子函數(shù)的參數(shù)的個數(shù)不大于8個的時候,則參數(shù)由寄存器X0-X7進行參數(shù)傳遞,如果子函數(shù)的參數(shù)大于8個,則大于8個參數(shù)之外的參數(shù)通過棧進行傳遞。根據(jù)ARMv8架構(gòu)的子函數(shù)的調(diào)用規(guī)則,在ARMv8架構(gòu)中的寄存器分配規(guī)則如表1所示。
表1 函數(shù)調(diào)用時寄存器分配規(guī)則
從表1中可以看出ARMv7架構(gòu)為15個通用寄存器,其中LR用來存放函數(shù)的返回地址,當函數(shù)重被調(diào)函數(shù)返回時從LR寄存器讀取返回地址跳轉(zhuǎn)到條用函數(shù)繼續(xù)執(zhí)行。ARMv8架構(gòu)下為31個通用寄存器,棧指針寄存器SP獨立于31個通用寄存器之外,其中X30相當于ARMv7架構(gòu)下的LR寄存器,當函數(shù)返回時,程序?qū)D(zhuǎn)到X30寄存器中的地址執(zhí)行。
ARMv8架構(gòu)下函數(shù)調(diào)用時的內(nèi)存布局相比于ARM以前的版本有了較大的改變,函數(shù)調(diào)用時的棧結(jié)構(gòu)如圖1所示。
圖1 函數(shù)調(diào)用棧的分布情況對比圖
左圖為ARMv7的情形。caller調(diào)用callee之前,棧指針位于sp1位置;進入callee后,將?;芳拇嫫鱎11和程序鏈接寄存器LR分別壓棧,LR寄存器保存的是callee的返回地址。接著將棧指針減去一個常數(shù)(由編譯器根據(jù)具體情況而定),假設(shè)其位于sp3位置。sp2-sp3之間的空間為callee的??臻g。
右圖為ARMv8的情形。caller調(diào)用callee之前,棧指針位于sp1位置;緊挨著sp1位置的兩個寄存器X29和X30分別存放的是caller棧基址和返回地址。進入callee函數(shù)后,首先會將棧指針減去一個常數(shù)(由編譯器根據(jù)具體情況而定),假設(shè)位于sp2位置,然后將X29和X30寄存器分別壓棧,此時棧指針位于sp3位置,X30寄存器保存的是callee的返回地址;sp1-sp3之間的空間為callee的??臻g。
此外,ROP 技術(shù)必須要有方法將棧中的數(shù)據(jù)加載到寄存器X0-X7中。研究發(fā)現(xiàn),ARMv8中使用LDP和LDR指令完成數(shù)據(jù)的出棧操作[10]。
LDR指令實現(xiàn)單數(shù)據(jù)的讀取,即從當前棧頂讀取一個數(shù)據(jù)加載到目的寄存器,其匯編指令格式為:LDR Xn,[sp],#offset,其含義是從當前棧頂讀取一個數(shù)據(jù)存儲到寄存器Xn,然后棧指針sp加上offset。
LDP完成寄存器組的讀取。其匯編指令格式為:LDP Xn,Xm,[sp],#offset,其含義是從當前棧頂連續(xù)讀取兩個數(shù)據(jù)依次存儲到寄存器Xn和Xm,然后棧指針sp加上offset。
1.2ARMv8架構(gòu)分支指令
通過對ARMv8架構(gòu)指令系統(tǒng)的研究[9],總共有5類跳轉(zhuǎn)指令可以影響程序的執(zhí)行流。其功能如表2所示,當處理器在AArch64位的工作狀態(tài)下時,表中的寄存器就寫成Xm,當工作在AArch32狀態(tài)下時寄存器就寫成Wm。
表2 ARMv8架構(gòu)分支指令描述表
從表2中可以看出,ARMv8架構(gòu)分支指令可以分成三大類:條件跳轉(zhuǎn)分支指令、非條件直接跳轉(zhuǎn)分支指令和非條件間接跳轉(zhuǎn)分支指令,其中條件跳轉(zhuǎn)分支指令和非條件直接跳轉(zhuǎn)分支指令的目標地址的偏移被編碼到指令的編碼中,不利于控制,所以本文不會使用以條件跳轉(zhuǎn)分支指令和非條件直接跳轉(zhuǎn)分支指令為結(jié)尾的指令序列。
ARMv8架構(gòu)上的可用指令序列都是以支持寄存器間接跳轉(zhuǎn)指令為結(jié)尾的。從表2中可以看出,這些指令主要包括三類:BLR Xm、BR Xm和RET {Xm}。其中,ARMv8中BLR Xm和BR Xm主要用于分支跳轉(zhuǎn)或函數(shù)調(diào)用,BLR指令時需要將返回地址保存到寄存器X30中,而BR指令不需要將返回地址保存到寄存器X30中;RET {Xm}為函數(shù)返回指令,當Xm省略時默認使用X30。本文中主要搜索以RET {Xm}指令為結(jié)尾的指令序列。
2ARMv8 gadget自動搜索框架
本文中設(shè)計的搜索框架如圖2所示。其主要包括兩個部分;指令序列搜索模塊和gadget組合模塊。gadget搜索模塊完成庫文件中以RET指令為結(jié)尾的短指令序列的搜索。gadget組合模塊根據(jù)用戶的輸入在指令序列集中搜索到相應(yīng)的gadget鏈。
圖2 ARMv8 gadget自動搜索框架
2.1gadget搜索模塊
gadget鏈是ROP技術(shù)最重要的一部分,所謂 gadget,是指在一個程序中能搜索到的具有某一特定功能的可用指令序列。該指令序列必須滿足一定的條件:
(1) gadget 中包含的指令條數(shù)通常很短,在個位數(shù)以內(nèi);
(2) gadget 的末尾都是一個跳轉(zhuǎn)指令;
(3) 每個 gadget 完成某一功能,如 mov/add/sub/and/neg等。
本文中的gadget搜索框架將主要搜索以RET指令結(jié)尾的指令序列。ARMv8架構(gòu)下的RET指令和X86架構(gòu)下的RET指令在指令編碼,指令語法等方面是完全不同的。ARMv8架構(gòu)RET指令的編碼如圖3所示。
圖3 ARMv8 RET指令編碼格式
Xm為目的地址寄存器,理論上Xm可以為31個通用寄存器中的任意一個,但是通過統(tǒng)計本文發(fā)現(xiàn)ARMv8架構(gòu)下Xm通常為X30寄存器。這樣RET {Xm}指令的編碼格式固定為“xc0x03x5fxd6”。所以本文的搜索算法將主要在目標二進制文件對特征碼“xc0x03x5fxd6”進行搜索。
當定位到分支指令之后,開始以分支指令開始逆向遍歷,其搜索算法如圖4所示,圖4給出的自動搜索算法遍歷庫文件或可執(zhí)行文件的整個代碼段。算法的第4行通過對ARMv8架構(gòu)ELF文件格式的分析,定位到代碼段。該算法的第一層循環(huán)用來搜索整個庫文件來定位分支指令,當搜索到“xc0x03x5fxd6”特征碼時用第二層循環(huán)開始逆向4字節(jié)遍歷,并把相應(yīng)的指令保存到G.gadget_binary[]中,當完成一個指令流的搜索后,把該指令流的首地址保存到G.address中。當發(fā)生以下情況時算法停止搜索:① 當遇到返回指令RET時;② 當G.gadget_binary[]中的指令的條數(shù)大于搜索深度maxdepth時。
圖4 ARMv8 gadget自動搜索算法
算法中的maxdepth為用戶預(yù)先設(shè)置好的一個閾值,這個值的設(shè)置是必要的,且其值一般設(shè)置為個位數(shù),本文中將其值設(shè)置為4。如果不設(shè)置閾值或者該值過大會給指令序列帶來巨大的邊界影響。算法的G結(jié)構(gòu)定義如下:
typedef struct gadget_logic_struct
{
int address;
int gadget_binary[4];
其中address用來存儲每個指令序列的起始地址,gadget_binary[4]用來存儲指令序列,當指令序列的指令條數(shù)小于4時,使用NOP指令填充。經(jīng)過上述算法可以得到所有的以RET分支指令結(jié)尾的gadget序列。
2.2gadget組合模塊
gadget組合模塊通過解析用戶的輸入,在指令序列集中搜索到與用戶輸入具有相同功能的gadget鏈。該模塊主要解決兩個問題。gadget序列的優(yōu)化和寄存器沖突的解決。
2.2.1gadget序列的優(yōu)化
本文的優(yōu)化主要是針對棧指針寄存器SP偏移的優(yōu)化。2.1節(jié)中搜索到的gadget集中存在很多功能相同,但是其棧指針SP的偏移卻是不同的短指令序列。例如gadget”add x3,x2,x5;ldr x30,[sp],#0x8;ret”和gadget”add x3,x2,x5;ldp x29,x30,[sp],#0x10; ret”,這兩個gadget完成的功能都是將寄存器X2和寄存器X5中內(nèi)容相加,結(jié)果保存到寄存器X3中,但是第一個gadget中SP調(diào)整了8個字節(jié),而第二個gadget中SP調(diào)整了16個字節(jié),本文中將會保留第一個gadget。本文采用線性掃描方法進行解決。即gadget組合模塊從gadget集的開始位置遍歷整個gadget集,當遇到與用戶輸入具有相同功能的gadget,就保存該gadget中SP調(diào)整的大小,當遍歷結(jié)束時,選取那個SP調(diào)整最小的gadget作為gadget鏈中的一個。這樣在進行ROP攻擊時,會節(jié)省非常多的棧空間,提高了ROP攻擊的效率。本文中的方法雖然效率非常低,但非常有效。
2.2.2寄存器沖突的解決
寄存器沖突指存在兩個gadgets:G1和G2,G1存儲臨時數(shù)據(jù)到寄存器A,G2需要初始化寄存器A以完成相應(yīng)的操作,G1和G2之間就存在寄存器沖突。本文的解決策略主要分成兩種情況:一種情況是如果一個寄存器被某個gadget無意的設(shè)置,而且該寄存器又同時被后面的一個gadget使用,并且在這兩個gadget之間沒有設(shè)置該寄存器的gadget,那么我們就需要這兩個gadget之間插入load gadget以消除寄存器沖突。例如“mov x1,[x2];mov x0,0xffff0983;ldr x30,[sp],#0x10;ret”和“mov x4,[x0];ldp x29,x30,[sp],#0x20;ret”這兩個gadget,第一個gadget的功能是設(shè)置X1的值,然而X0卻被該gadget無意的設(shè)置,而又同時在后一個gadget中被作為源寄存器使用,如果在他們之間沒有一個gadget對進行設(shè)置,我們就立即在前一個gadget后插入load gadget對X0寄存器進行更新;另一種情況是一個gadget對寄存器進行了初始化用來完成后面的計算,而該寄存器卻又被另一個gadget用于存儲臨時變量,這將影響該寄存器的正常使用,那么我們就在這兩個gadget之間增加一個store gadget以消除寄存器沖突。例如“mov x0,0x7fb724a568;ldp x29,x30,[sp],#0x10;ret”、“add x0,x2,x5;ldp x29,x30,[sp],#0x10;ret”這兩個gadget,第一個gadget將X0寄存器賦值為0x7fb724a568,該值被后面的gadget作為一個基址使用,但是第二個gadget卻將X0寄存器用來存儲寄存器X2和X5相加的臨時結(jié)果,那么我們就在這兩個gadget之間增加一個store gadget將一個gadget的結(jié)果首先存儲起來,等到使用時再取出。
3ARMv8 ROP實例
實驗環(huán)境: Linaro ARMv8 Linux,其版本號為Linux 3.6.0-1-Linaro-vexpress64。Linaro是ARM公司授權(quán)商,其為ARMv8開發(fā)的工具鏈和快速模型虛擬平臺能從ARM官網(wǎng)下載[11]。
為了盡快使企業(yè)脫貧,林洋本著精準扶貧的理念,充分利用國家出臺的各項農(nóng)業(yè)扶持政策,大力推進農(nóng)業(yè)項目建設(shè)。近3年來,先后建成年產(chǎn)300萬標準食用菌菌袋扶貧開發(fā)項目,食用菌種植推廣項目,小型農(nóng)田水利補貼項目,大棚種植冬棗項目等。這些農(nóng)業(yè)項目已收到了良好的社會效益和經(jīng)濟效益,本單位職工及周邊農(nóng)村上百人在項目推廣中受益脫貧,群眾紛紛點贊,稱林洋是“帶領(lǐng)群眾脫貧的引路人”。2017年,云城乳業(yè)被市國資委評為“項目推進先進單位”。
本節(jié)將給出Linaro ARMv8 Linux上實現(xiàn)的ROP實例。該實例的ROP shellcode欲實現(xiàn)的功能是通過復(fù)用libc.so.6中的write函數(shù)在終端輸出字符串”ARMv8 exploit”,然后復(fù)用libc.so.6中的exit函數(shù)使程序離開。
3.1gadget鏈
根據(jù)用戶的目的,工具搜索到了以下三個gadget,這3個gadget來自ARMv8常用的libc.so.6或ld-linux-aarch64.so.1庫文件。gadget(1)用于從內(nèi)存加載數(shù)據(jù)到寄存器X0;gadget(2)從內(nèi)存中連續(xù)讀取4個數(shù)據(jù)依次放入寄存器X1、X2、X3和X4;gadget(3)完成write系統(tǒng)調(diào)用,指令”mov x8, #0x40”將write的系統(tǒng)調(diào)用號0x40加載到寄存器X8,指令”ldr x30,[sp],#10”將write系統(tǒng)調(diào)用后的程序執(zhí)行的目的地址加載到寄存器X30。
0x7fb7f4c4e4 F84107E0 ldr x0,[sp],#0x10
0x7fb7f4c4e8 F84107FE ldr x30,[sp],#0x10
0x7fb7f4c4ec D65F03C0 ret
gadget(1)
0x7fb7fe835c A8C10BE1 ldp x1,x2,[sp],#0x10
0x7fb7fe8360 A8C113E3 ldp x3,x4,[sp],#0x10
0x7fb7fe8364 A8C27BFD ldp x29, x30, [sp], #0x20
0x7fb7fe8368 D65F03C0 ret
gadget(2)
0x7fb7f65c64 D2800808 mov x8, #0x40
0x7fb7f65c68 D4000001 svc #0
0x7fb7f65c6c F84027FE ldr x30,[sp],#0x10
0x7fb7f65c70 D65F03C0 ret
gadget(3)
通過對上面gadget鏈的分析,生成的ARMv8 ROP shellcode內(nèi)容如下:
char shellcode[]=″x41x41x41x41x41x41x41x41x41x41x41x41x41x41x41x41″″x41x41x41x41x41x41x41x41xe4xc4xf4xb7x7fx00x00x00″″x00x00x00x00x00x00x00x00x41x41x41x41x41x41x41x41″″x5cx83xfexb7x7f x00x00x00x41x41x41x41x41x41x41x41″″x41x41x41x41x41x41x41x41xd0xc4xf4xb7x7f x00x00x00″″x41x41x41x41x41x41x41x41x41x41x41x41x41x41x41x41″″x41x41x41x41x41x41x41x41x41x41x41x41x41x41x41x41″″x50xfcxffxffx7fx00x00x00x0dx00x00x00x00x00x00x00″″x41x41x41x41x41x41x41x41x41x41x41x41x41x41x41x41″″x41x41x41x41x41x41x41x41x41x41x41x41x41x41x41x41″″ARMv8 exploit;
3.2ROP執(zhí)行流
ROP shellcode對應(yīng)的內(nèi)存布局及工作原理如圖5所示。圖的左側(cè)給出ROP的內(nèi)存安排和內(nèi)存地址的后12位,圖的右側(cè)的虛線代表指令序列的執(zhí)行順序。
通過一次漏洞利用,將返回地址用gadget(1)的返回地址改寫,程序返回時將會跳轉(zhuǎn)到本文設(shè)定的指令序列,程序依次執(zhí)行g(shù)adget(1)和gadget(2),在gadget(1)和gadget(2)執(zhí)行完畢之后X0、X1和X2三個寄存器已經(jīng)被設(shè)置為write系統(tǒng)調(diào)用所需要的三個參數(shù),gadget(3)將write系統(tǒng)調(diào)用號0x40傳遞給寄存器0x40,然后執(zhí)行write系統(tǒng)調(diào)用在終端輸出字符串”ARMV8 exploit”,通過控制write系統(tǒng)調(diào)用的返回地址,write系統(tǒng)調(diào)用執(zhí)行完畢后程序?qū)D(zhuǎn)到gadget(1)執(zhí)行,gadget(1)將exit系統(tǒng)調(diào)用的參數(shù)和入口地址分別傳遞給寄存器X0和X30,最后通過執(zhí)行exit系統(tǒng)調(diào)用使程序離開。在內(nèi)存中,本文沒有用到的閑置內(nèi)存全部用字符A填充。
圖5 ROP攻擊實例原理圖
4實驗結(jié)果評估
本文利用該工具在Linaro ARMv8 Linux 常用的庫文件libc.so.6和ld-linux-aarch64.so.1中進行搜索,實驗結(jié)果如下所示。
libc.so.6庫文件中搜索深度為4的部分搜索結(jié)果。
ld-linux-aarch64.so.1庫文件中搜索深度為4的部分搜索結(jié)果。
通過利用搜索到的結(jié)果統(tǒng)計出以RET指令結(jié)尾的gadget的數(shù)目如表3所示。
表3 gadget統(tǒng)計結(jié)果
Erik Buchanan[12]等人首次在X86架構(gòu)上對gadget的圖靈完整性進行了證明,如果一個gadget集可以滿足基本的賦值操作、算術(shù)和邏輯運算、控制流和函數(shù)調(diào)用四個條件,那么該gadget集就是圖靈完整的,可以執(zhí)行任何操作。通過統(tǒng)計,本文中搜索工具搜索到的gadget同樣可以滿足上面四個條件,因此本文工具搜索到的gadget也是圖靈完備的,可以執(zhí)行任意的操作。
5結(jié)語
為了實現(xiàn)ARMv8架構(gòu)上的ROP技術(shù),本文首次提出了ARMv8上ROP gadget自動搜索的框架,它首先在庫文件搜索出所有的以RET指令結(jié)尾的短指令序列,并把這些指令序列存儲在gadget庫中,然后對該庫進行優(yōu)化,最后根據(jù)用戶的輸入在庫中搜索到與用戶輸入功能相同的gadget鏈。通過對搜索工具搜索到的gadget進行統(tǒng)計,結(jié)果表明gadget集具有圖靈完整性,可以執(zhí)行任意的操作。本文不僅提出了ARMv8架構(gòu)下的gadget自動搜索工具,而且利用搜索到的gadget在ARMVv8 Linux中進行了ROP實驗,實驗結(jié)果表明可以利用gadget集在ARMv8架構(gòu)上進行ROP攻擊。但是本文的搜索工具是基于語法進行搜尋的,在搜索過程中會產(chǎn)生許多無用的gadget,而且無法反映gadget一些標志寄存器的影響,降低了gadget的搜索效率和準確性。下一步我們將提出一種基于語義的gadget自動搜索方法對這些問題進行解決。此外,本文使用的ROP shellcode是通過人工分析形成的, ARMv8 ROP shellcode自動生成方法的研究也將成為下一步工作的重點。
參考文獻
[1] Krahmer S.x86-64 buffer overflow exploits and the borrowed code chunks exploitation technique[J].C1:Vulnerable Server application,2005.
[2] Shacham H.The geometry of innocent flesh on the bone:Return-into-libc without function calls (on the x86)[C]//Proceedings of the 14th ACM conference on Computer and communications security.ACM,2007:552-561.
[3] Kornau T.Return oriented programming for the ARM architecture[D].Master’s thesis,Ruhr-Universitat Bochum,2010.
[4] Roemer R,Buchanan E,Shacham H,et al.Return-oriented programming:Systems,languages,and applications[J].ACM Transactions on Information and System Security (TISSEC),2012,15(1):2.
[5] Vincenzo Iozzo,ROP and iPhone.http://blog.zynamics.com/2010/04/16/rop-and-iphone/, Apri,16,2010.
[6] Schwartz E J,Avgerinos T,Brumley D.Q:Exploit Hardening Made Easy[C]//USENIX Security Symposium,2011.
[7] Chen P,Xiao H,Shen X B,et al.DROP:Detecting return-oriented programming malicious code[M]//Information Systems Security.Springer Berlin Heidelberg,2009:163-177.
[8] Yang C,Zheng T,Lin Z.AR Exploit:An Automatic ROP Exploit Based on Long Sequence[C]//Software Security and Reliability-Companion (SERE-C),2014 IEEE Eighth International Conference on.IEEE,2014:50-56.
[9] https://silver.arm.com/download/ARM_and_AMBA_Architecture/AR100-DA-70501-r0p0-00eac5/ARMv8_ISA_PRD03-GENC-010197-30-0.pdf.
[10] https://silver.arm.com/download/ARM_and_AMBA_Architecture/AR10 0-DA-70501-r0p0-00eac5/DDI0487A_a_armv8_arm_errata.pdf.
[11] Linaro.Linaro ARMv8 Project.http://www.Linaro.org/projects/armv8/.
[12] Buchanan E,Roemer R,Shacham H.When good instructions go bad:generalizing return-oriented programming to RISC[C]//Proceedings of the 15th ACM conference on Computer and communications security.ACM,2008:27-38.
AN AUTOMATED GADGET SEARCH FRAMEWORK BASED ON ARMv8 ARCHITECTURE
Zhao LijunWang ZhenyuWang YisenZhuang Kuan
(StateKeyLaboratoryofMathematicalEngineeringandAdvancedComputing,PLAInformationEngineeringUniversity,Zhengzhou450001,Henan,China)
AbstractTo implement ROP (return-oriented programming) technology on the first ARMv8 architecture supporting 64 bits processor which is the latest release of ARM, we designed an automatic search tool for ROP gadget on ARMv8 architecture. By combining the features of instruction system of ARMv8 architecture, it first searches all the short instruction sequences ending with “RET” instruction in library files, and stores these instruction sequences to gadget library, and then uses some optimisation strategy to optimise the library, finally, according to users’ input it finds the gadget chains with same function of users’ input. Through the statistics of gadgets searched by search tool, result showed that the gadget set had the Turing completeness, and could execute any operation. In end of the paper, through an example we proved the feasibility of ROP on ARMv8 architecture.
KeywordsROPInstruction sequenceAutomatic searchARMv8Turing completeness
收稿日期:2014-12-02。國家高技術(shù)研究發(fā)展計劃基金項目(200 9AA012200)。趙利軍,碩士生,主研領(lǐng)域:嵌入式設(shè)備安全分析。王震宇,副教授。王奕森,碩士生。莊寬,碩士生。
中圖分類號TP309.1
文獻標識碼A
DOI:10.3969/j.issn.1000-386x.2016.05.076