国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于ARMv8架構(gòu)ROP自動構(gòu)造框架

2017-08-12 12:22:06趙利軍
計算機應(yīng)用與軟件 2017年8期
關(guān)鍵詞:庫中寄存器內(nèi)存

趙利軍 彭 城

(徐州工程兵學(xué)院作戰(zhàn)實驗中心 江蘇 徐州 221000)

?

基于ARMv8架構(gòu)ROP自動構(gòu)造框架

趙利軍 彭 城

(徐州工程兵學(xué)院作戰(zhàn)實驗中心 江蘇 徐州 221000)

為了在ARM公司最新發(fā)布的首款支持64位處理器的ARMv8架構(gòu)上實現(xiàn)ROP(Return_Oriented Programmig)技術(shù),提高ROP攻擊效力,設(shè)計了ARMv8架構(gòu)上的ROP 自動構(gòu)造工具。首先對已有的ARM架構(gòu)下gadget搜索工具進行擴展,使之支持ARMv8架構(gòu)下可用指令序列的搜索,并把這些指令序列存儲在gadget庫中,其次采用優(yōu)化策略對gadget庫進行優(yōu)化。然后利用語義等價性找出與shellcode語義相同的gadget鏈,并利用寄存器連通性解決語義斷層和寄存器沖突等問題。最后完成gadget的自動串聯(lián)形成具有特定行為的ROP鏈。通過利用ROP自動構(gòu)造工具對網(wǎng)站”exploit.db”中大量的shellcode進行自動構(gòu)造,證明了工具具有良好的攻擊效力,增強了ROP攻擊的實用性。

ROP 指令序列 ARMv8 寄存器連通性 語義斷層 寄存器沖突

0 引 言

數(shù)據(jù)執(zhí)行保護和簽名等技術(shù)有效地阻止了代碼注入式攻擊。2005年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年Shacham[2]第一次提出了X86平臺上的返回導(dǎo)向編程技術(shù)ROP。返回導(dǎo)向編程攻擊的方式不再局限于將漏洞程序的控制流跳轉(zhuǎn)到庫函數(shù)中,而是利用庫函數(shù)或可執(zhí)行文件的指令代碼片段實現(xiàn)攻擊,將復(fù)用的代碼粒度從return-to-libc的函數(shù)級別縮小到指令序列。 自2007年ROP概念被提出后,關(guān)于ROP攻擊的研究引起了研究人員的 廣泛關(guān)注,他們先后在各個平臺上對ROP攻擊進行而來實驗。例如ARM平臺,SPARC平臺和AVR平臺。Kornau[3]首次在ARM架構(gòu)上實現(xiàn)了ROP攻擊并驗證了圖靈完整性,而且提出了一套基于REIL語言的自動構(gòu)建ROP鏈的算法。2008年,Roemer[4]等在SPARC平臺上驗證了ROP圖靈完整性。盧森堡大學(xué)的Ralf-Philipp Weinmann利用ROP技術(shù)實現(xiàn)了iOS系統(tǒng)的入侵[5]。

ROP技術(shù)至關(guān)重要的一環(huán)就是可用指令序列的自動搜索,本文中將這些指令序列定義為gadget。由于庫文件中的代碼的數(shù)量非常巨大,所以手工搜索gadget將會非常的耗時,這將嚴重降低ROP技術(shù)的效率。2011年,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。Schwartz等提出的自動構(gòu)造ROP攻擊的框架Q是基于短指令序列的,不能繞過Chen[7]等提出的防御機制。2014年,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)。并且目前針對ROP攻擊的大部分研究仍停留在gadget自動搜索階段,還需要很多的人工參與,嚴重降低了ROP攻擊的效率。為了解決以上技術(shù)缺陷,本文設(shè)計了一種ARMv8 ROP shellcode自動構(gòu)造工具,該工具首先搜索到ARMv8架構(gòu)下的可用指令序列,然后在可用指令序列中搜索到與shellcode語義相同的gadget,自動完成gadget的串聯(lián),提高了ROP攻擊的效率。

1 背 景

1.1 ARMv8架構(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)下支持64 bit的地址空間,AArch32狀態(tài)下支持32 bit的地址空間 ,且在每種工作狀態(tài)下ARMv8都有31個通用寄存器[9]。本文將主要對AArch64狀態(tài)下ARMV8架構(gòu)的差異性。

1.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ù)的個數(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)到調(diào)用函數(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?;泛头祷氐刂贰_M入callee函數(shù)后,首先會將棧指針減去一個常數(shù)(由編譯器根據(jù)具體情況而定),假設(shè)位于sp2位置,然后將X29和X30寄存器分別壓棧,此時棧指針位于sp3位置,X30寄存器保存的是callee的返回地址;sp1-sp3之間的空間為callee的??臻g。

1.1.2 ARMv8架構(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)分支指令描述表

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é)尾的指令序列。

1.2 ARMv8 ROP攻擊原理概述

所謂的ROP攻擊就是利用庫文件或可執(zhí)行文件中的短指令序列完成的攻擊,ARMv8架構(gòu)一次ROP攻擊的原理如圖2所示。

圖2 ARMv8 ROP攻擊概況圖

其中各部分完成的功能如下:

① 攻擊者通過一次漏洞利用將gadget框架注入到用戶控制的棧中,并控制程序使之跳轉(zhuǎn)到gadget 1執(zhí)行。

② 所有的位于漏洞程序運行映像內(nèi)存中的gadget序列,運行時映像包括漏洞程序本身和被漏洞程序加載的所有的庫文件。

③ gadget框架通過棧將變量傳遞給下一個gadget,每個gadget框架包括該gadget需要的源數(shù)據(jù)和下一個被期望執(zhí)行的gadget的首地址。

④ 被存儲在專用內(nèi)存段中的可以變多個gadget訪問的變量,這個內(nèi)存區(qū)域可以被每個gadget進行讀寫訪問。

⑤ 一個gadget示例,本文把其命名為gadget1。

⑥ 程序跳轉(zhuǎn)到gadget 1執(zhí)行后,gadget 1的前兩條指令訪問專用內(nèi)存區(qū)域[X5+0x8]和[X5+0x20]內(nèi)存位置。

⑦ gadget框架為gadget1中的LDP指令提供輸入,X1和X2寄存器被設(shè)置為保存在gadget框架中的值,X30寄存器也被設(shè)置為下一個期望執(zhí)行的gadget的首地址。

⑧ gadget1通過RET執(zhí)行使程序跳轉(zhuǎn)到gadget2執(zhí)行。

⑨ gadget2的一個示例。

⑩ 寄存器X4和X5被設(shè)置為gadget2框架中的值,X30寄存器被設(shè)置為gadget3的首地址,然后程序跳轉(zhuǎn)到gadget3執(zhí)行。依次循環(huán)下去直到所有的gadget執(zhí)行完畢,即完成一次ROP攻擊。

2 ARMv8 ROP shellcode自動構(gòu)造工具

本文中設(shè)計的ROP shellcode自動構(gòu)造框架如圖3所示。其主要包括三個部分;shellcode分析框架、gadget自動搜索框架和gadget自動構(gòu)建框架。Shellcode分析框架完成shellcode語義的提取和優(yōu)化,gadget自動搜索框架實現(xiàn)ARMv8架構(gòu)下可用指令序列的搜索,gadget自動構(gòu)建框架通過分析shellcode的語義,在gadget庫中搜索與shellcode具有語義的gadget,以完成gadget的自動串聯(lián)。

圖3 ARMv8 gadget自動搜索框架

2.1 shellcode分析模塊

Shellcode分析框架主要用于shellcode的優(yōu)化和語義提取。 對用于輸入的shellcode,該框架首先將shellcode轉(zhuǎn)換為LLVM 中間語言,然后在中間語言級對shellcode進行優(yōu)化和語義提取。其中優(yōu)化主要包括冗余指令的消除、指令合并等。語義提取主要是提取shellcode語句的操作類型。Shellcode分析模塊將會加快gadget自動生成模塊的效率。圖4顯示了shellcode分析模塊的執(zhí)行結(jié)果,其中左半部分為完成一個從1加到10的求和運算,右半部分為經(jīng)過shellcode分析模塊分析后的結(jié)果。

圖4 shellcode分析框架結(jié)果

2.2 gadget自動搜索框架

gadget鏈是ROP技術(shù)最重要的一部分,所謂 gadget,是指在一個程序中能搜索到的具有某一特定功能的可用指令序列。該指令序列必須滿足一定的條件:

(1) gadget 中包含的指令條數(shù)通常很短,在個位數(shù)以內(nèi);

(2) gadget 的末尾都是一個跳轉(zhuǎn)指令;

(3) 每個 gadget 完成某一功能,如 mov/add/sub/and/neg 等。

本文中的gadget搜索框架將主要搜索以RET指令結(jié)尾的指令序列。通過統(tǒng)計發(fā)現(xiàn)ARMv8架構(gòu)通常使用X30寄存器作為RET指令的目的地址寄存器。其指令的編碼為”xc0x03x5fxd6”。所以本文的搜索算法將主要在目標二進制文件對特征碼”xc0x03x5fxd6”進行搜索。

當定位到分支指令之后,開始以分支指令開始逆向遍歷,其搜索算法如圖5所示,圖5給出的自動搜索算法遍歷庫文件或可執(zhí)行文件的整個代碼段。算法的第4行通過對ARMv8架構(gòu)ELF文件格式的分析,定位到代碼段。該算法的第一層循環(huán)用來搜索整個庫文件來定位分支指令,當搜索到”xc0\x03x5fxd6”特征碼時用第二層循環(huán)開始逆向4字節(jié)遍歷,并把相應(yīng)的指令保存到G.gadget_binary[]中,當完成一個指令流的搜索后,把該指令流的首地址保存到G.address中。當發(fā)生以下情況時算法停止搜索:① 當遇到返回指令RET時;② 當G.gadget_binary[]中的指令的條數(shù)大于搜索深度maxdepth時。

圖5 ARMv8 gadget自動搜索算法

算法中的maxdepth為用戶預(yù)先設(shè)置好的一個閾值,這個值的設(shè)置是必要的,且其值一般設(shè)置為個位數(shù),本文中將其值設(shè)置為4。如果不設(shè)置閾值或者該值過大會給指令序列帶來巨大的邊界影響。

2.3 gadget自動構(gòu)造模塊

Gadget自動構(gòu)造模塊通過對shellcode分析模塊分析結(jié)果進行分析,在gadget自動搜索模塊搜索出的圖靈完成的gadget庫中匹配到與shellcode語義相同的gadget。其框架如圖6所示,其中語義匹配器通過分析shellcode的語義在gadget庫中找出所有的與shellcode語義具有相同語義的gadget。Gadget選擇器根據(jù)不同的策略對gadget庫進行排序,然后選擇最優(yōu)的gadget。Gadget優(yōu)化器主要解決語義斷層和寄存器沖突等問題。

圖6 gadget自動構(gòu)造模塊

2.3.1 gadget選擇器

本文中主要是根據(jù)棧指針SP偏移值的大小進行排序。語義匹配器生成的gadget中的所有的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集,根據(jù)SP偏移的大小采取冒泡排序算法對gadget進行排序,當遍歷結(jié)束時,gadget庫中的gadget將是按照棧指針SP偏移值從小到大排序,然后選取那個SP調(diào)整最小的gadget作為gadget鏈中的一個。這樣在進行ROP攻擊時,會節(jié)省非常多的棧空間,提高了ROP攻擊的效率。將來本文還會對排序策略進行擴展,從而構(gòu)造出更優(yōu)的gadget鏈。

2.3.2 gadget優(yōu)化器

雖然2.3.1節(jié)中已經(jīng)選擇除了最優(yōu)的gadget,但是其仍然存在以下兩個問題。第一,語義分析器有可能搜索不到與shellcode語義相同的gadget;而且2.3.1結(jié)構(gòu)搜索出的gadget可能存在葉子gadget,這將影響gadget的串聯(lián);這些都將導(dǎo)致gadget語義斷層。第二,gadget選擇器生成的gadget鏈中存在寄存器沖突。Gadget優(yōu)化器主要解決這兩個問題。

1) 語義斷層

語義斷層主要包括兩個方面:葉子gadget和shellcode語義丟失。

葉子gadget:所謂的葉子gadget就是指那些無法控制目的地址寄存器的gadget,例如gadget{add x0,x2,x4;ret}就是一個葉子gadget,因為在RET指令之前沒有一條匯編指令能夠?qū)30寄存器進行控制,這將影響該gadget與下一條期望執(zhí)行的gadget的串聯(lián)。本文將使用一個跳板gadget進行解決,跳板gadget的主要功能是對X30寄存器進行設(shè)置,然后使用通用寄存器來作為目的地址寄存器實現(xiàn)gadget的串聯(lián),例如gadget1{ldr x6,[sp],#0x8;ldr x30,[sp],#0x10;bx r6}就是一個跳板gadget。當遇到葉子gadget時,就在該gadget之前插入跳板gadget1,將R6寄存器設(shè)置為葉子gadget的首地址,將X30寄存器設(shè)置為葉子gadget執(zhí)行完畢后期望執(zhí)行的gadget的地址。這樣當跳板gadget1執(zhí)行完畢后,將會使用BX R6指令跳轉(zhuǎn)到葉子gadget執(zhí)行,葉子gadget最后的RET指令完成與后續(xù)gadget的串聯(lián)。但是在使用跳板gadget時,一定要注意不要破壞R6寄存器中的值,必須存放葉子gadget的首地址。

shellcode語義丟失:shellcode語義丟失是指在gadget庫中找不到與shellcode具有相同語義的gadget。本文通過分析gadget自動搜索模塊生成的gadget庫,證明了寄存器的連通性,即寄存器間是兩兩可達的。然后通過利用寄存器的連通性實現(xiàn)寄存器的替換,在替換過程中,本文將盡量替換最少的寄存器以解決shellcode語義丟失問題。例如假設(shè)在2.1節(jié)的求和例子中,本文假設(shè)語句”add x3,x3,x4”將會造成shellcode語義丟失,即在gadget庫中搜索不到與該語句語義相同的gadget。那么本文將會按照寄存器最少替換原則,首先對目的寄存器X3寄存器進行替換,直到在gadget庫中找到語義相同的gadget,當使用寄存器X1對X3進行替換時,則在gadget庫中找到了與其語義相等的gadget1”add x1,x3,x4;ldp x29,x30,[sp],#0x20;ret”,然后在gadget1之后增加gadget2”mov x3,x1;ldr x30,[sp],#0x8;ret”,將gadget1與gadget2串聯(lián)到一起將會完成與語句”add x3,x3,x4”語義相同的gadget,解決語義斷層問題。如果對目的寄存器替換完畢后,仍然無法發(fā)現(xiàn)gadget,那么就對源寄存器進行替換,按照寄存器替換由少到多的原則一直替換下去,直到找到語義相等的gadget。

2) 寄存器沖突的解決

寄存器沖突指存在兩個gadgets:G1和G2,G1存儲臨時數(shù)據(jù)到寄存器A,G2需要初始化寄存器A以完成相應(yīng)的操作,G1和G2之間就存在寄存器沖突。本文將首先尋找一個棧安全位置,該位置不會影響gadget的控制結(jié)構(gòu),然后在兩個gadget之間增加一個內(nèi)存存儲gadget將臨時數(shù)據(jù)保存到棧安全位置,等到使用時再將其取出。例如“add x0,x1,x3;ldr x30,[sp],#0x10;ret”和“mov x0,#0x8;ldp x29,x30,[sp],#0x20;ret”這兩個gadget,第一個gadget的功能是將寄存器X1和X3相加之后的結(jié)果保存到寄存器X0,這將影響X0寄存器的正常使用,那么本文就在這兩個gadget之間增加一個store gadget{str x0,[x5];ldp x29,x30,[sp],#0x20;ret}。首先將X0寄存器中的值保存到棧安全位置,等到使用時再從相應(yīng)的位置取出,以消除寄存器沖突。其中X5寄存器保存的是棧安全位置的基址。

3 實驗與評估

3.1 ARMv8 shellcode實例

實驗環(huán)境: Linaro ARMv8 Linux,其版本號為Linux 3.6.0-1-Linaro-vexpress64。Linaro是ARM公司授權(quán)商,其為ARMv8開發(fā)的工具鏈和快速模型虛擬平臺能從ARM官網(wǎng)下載[11]。

本節(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ù)使程序離開。

ROP shellcode對應(yīng)的內(nèi)存布局及工作原理如圖7所示。圖的左側(cè)給出ROP的內(nèi)存安排和內(nèi)存地址的后12位,圖的右側(cè)的虛線代表指令序列的執(zhí)行順序。

圖7 ROP攻擊實例原理圖

通過一次漏洞利用,將返回地址用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填充。

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的控制結(jié)構(gòu)內(nèi)容如下:

char shellcode[]=

″x41x41x41x41x41x41x41x41x41x41x41x41x41x41x41x41″

″x41x41x41x41x41x41x41x41xe4xc4xf4xb7x7fx00x00x00″

″x00x00x00x00x00x00x00x00x41x41x41x41x41x41x41x41″

″x5cx83xfexb7x7fx00x00x00x41x41x41x41x41x41x41x41″

″x41x41x41x41x41x41x41x41xd0xc4xf4xb7x7fx00x00x00″

″x41x41x41x41x41x41x41x41x41x41x41x41x41x41x41x41″

″x41x41x41x41x41x41x41x41x41x41x41x41x41x41x41x41″

″x50xfcxffxffx7fx00x00x00x0dx00x00x00x00x00x00x00″

″x41x41x41x41x41x41x41x41x41x41x41x41x41x41x41x41″

″x41x41x41x41x41x41x41x41x41x41x41x41x41x41x41x41″

″ARMv8 exploit;

3.2 gadget自動搜索框架搜索結(jié)果

本文利用該工具在Linaro ARMv8 Linux 常用的庫文件libc.so.6和ld-linux-aarch64.so.1中進行搜索,實驗結(jié)果如圖8、圖9所示。

圖8 libc.so.6庫文件中搜索深度為4的部分搜索結(jié)果

圖9 ld-linux-aarch64.so.1庫文件中搜索深度為4的部分搜索結(jié)果

通過利用搜索到的結(jié)果統(tǒng)計出以RET指令結(jié)尾的gadget的數(shù)目如表3所示。

表3 gadget統(tǒng)計結(jié)果

Buchanan[12]等首次在X86架構(gòu)上對gadget的圖靈完整性進行了證明,如果一個gadget集可以滿足基本的賦值操作、算術(shù)和邏輯運算、控制流和函數(shù)調(diào)用四個條件,那么該gadget集就是圖靈完整的,可以執(zhí)行任何操作。通過統(tǒng)計,本文中搜索工具搜索到的gadget同樣可以滿足上面四個條件,因此本文工具搜索到的gadget也是圖靈完備的,可以執(zhí)行任意的操作。

3.3 gadget自動生成框架測試

本文從網(wǎng)站exploit.db中選取了10個shellcode,然后利用本文的自動構(gòu)造工具進行自動的構(gòu)造。本文所使用的環(huán)境為Linaro ARMv8 Linux,其版本號為Linux 3.6.0-1-Linaro-vexpress64。Linaro是ARM公司授權(quán)商,其為ARMv8開發(fā)的工具鏈和快速模型虛擬平臺能從ARM官網(wǎng)下載。轉(zhuǎn)化后的ARMv8 shellcode大小和ARMv8 ROP shellcode大小如表4所示。

表4 ARMv8 ROP shellcode

在表4所示的shellcode中,有的涉及了復(fù)雜的shellcode的設(shè)計,包括使用多個系統(tǒng)調(diào)用和條件跳轉(zhuǎn)等。例如,“setreuid(getuid(),setuid()),execve(“/bin/sh”,0,0)”ROP shellcode中需要涉及4個系統(tǒng)調(diào)用,“dup2(0,0),dup2(0,1),dup2(0,2)”ROP shellcode中需要涉及條件跳轉(zhuǎn)。從表4中可以看出,隨著shellcode的復(fù)雜性的增加,構(gòu)造ARMv8 ROP shellcode的復(fù)雜度也在增大。shellcode的長度越大,構(gòu)造的ARMv8 ROP shellcode的gadget的數(shù)目和大小也越大。

4 結(jié) 語

為了實現(xiàn)ARMv8架構(gòu)上的ROP技術(shù),提高ROP攻擊的效率,增加其實用性。本文首次對已有的gadget搜索框架進行擴展,實現(xiàn)了ARMv8架構(gòu)上ROP gadget自動搜索的框架。它首先在庫文件搜索出所有的以RET指令結(jié)尾的短指令序列,并把這些指令序列存儲在gadget庫中;然后利用語義分析器找到與shellcode語義相同的gadget,gadget選擇器對這些gadget進行優(yōu)化排序,選擇出最優(yōu)的gadget;最后利用gadget、優(yōu)化器解決語義斷層和寄存器沖突問題,完成gadget的自動構(gòu)造。利用實驗對本文的工具進行了測試,實驗結(jié)果表明本文的工具具有良好的攻擊效力。但是本文中的shellcode的控制結(jié)構(gòu)是通過人工分析進行的,并且其不具有隱蔽性。下一步主要研究ROP shellcode控制結(jié)構(gòu)的自動構(gòu)造和控制結(jié)構(gòu)的隱蔽性,以此提高ROP攻擊能力和抗檢測能力。

[1] Krahmer S.x86-64 buffer overflow exploits and the borrowed code chunks exploitation technique[OL].2005-09-28.http://users.suse.com/~krahmer/no-nx.pdf.

[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].Ruhr-Universitat Bochum,2010.

[4] Roemer R,Buchanan E,Shacham Hl.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[OL].2010-04-16.http://blog.zynamics.com/2010/04/16/rop-and-iphone/.

[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,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[OL].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.

ROPAUTOMATICCONSTRUCTIONFRAMEWORKBASEDONARMV8ARCHITECTURE

Zhao Lijun Peng Cheng
(OperationalExperimentCenter,XuzhouEngineeringCorpsCollege,Xuzhou221000,Jiangsu,China)

To support Return Oriented Programming technology on 64 bit ARMv8 architecture, we designed the ROP automatic construction tool. This tool can improve the effectiveness of the ROP attack. First, we extend the gadget searching tools, so the instruction sequence search can be used in the ARMv8 architecture. And we store the instruction sequence into gadget library. Secondly, we use the optimization strategy to optimize the gadget library. Then we use semantic equivalence to find the same gadget chain as the shellcode semantics. In addition, we use register connectivity to solve semantic faults and register conflicts and other issues. Finally, we need to complete the gadget automatic series to form a specific behaviour of the ROP chain. By using the ROP automatic construction tool to construct shellcode in the website "exploit.db", it proves that the tool has good attack effectiveness and enhances the practicability of ROP attack.

ROP Instruction sequence ARMv8 Register connectivity Semantic fault Register conflict

2016-08-29。趙利軍,講師,主研領(lǐng)域:軟件開發(fā),信息安全。彭城,副教授。

TP309.1

A

10.3969/j.issn.1000-386x.2017.08.057

猜你喜歡
庫中寄存器內(nèi)存
動物城堡
動物城堡
Lite寄存器模型的設(shè)計與實現(xiàn)
“春夏秋冬”的內(nèi)存
當代陜西(2019年13期)2019-08-20 03:54:22
分簇結(jié)構(gòu)向量寄存器分配策略研究*
智能盤庫在自動化立體庫中的探索和應(yīng)用
ID3算法在構(gòu)件庫中的應(yīng)用
河南科技(2014年10期)2014-02-27 14:09:02
基于內(nèi)存的地理信息訪問技術(shù)
高速數(shù)模轉(zhuǎn)換器AD9779/AD9788的應(yīng)用
一種可重構(gòu)線性反饋移位寄存器設(shè)計
郴州市| 遂川县| 余干县| 紫金县| 伊春市| 平利县| 兴山县| 灵石县| 鲁甸县| 崇礼县| 云南省| 赤城县| 宁化县| 疏勒县| 彭水| 峨山| 保亭| 邢台县| 张北县| 长顺县| 广州市| 鹰潭市| 扎兰屯市| 教育| 石首市| 沭阳县| 青铜峡市| 甘洛县| 连城县| 玛纳斯县| 遵义县| 宁城县| 宜阳县| 龙里县| 开原市| 平凉市| 卢湾区| 北碚区| 平远县| 兴化市| 鸡泽县|