亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        一種基于表達(dá)式樹的gadget 語義分析技術(shù)

        2021-01-15 07:17:42王永杰
        計(jì)算機(jī)工程 2021年1期
        關(guān)鍵詞:表達(dá)式寄存器內(nèi)存

        蔣 楚,王永杰

        (國(guó)防科技大學(xué) 電子對(duì)抗學(xué)院,合肥 230037)

        0 概述

        自1988年第一例緩沖區(qū)溢出漏洞攻擊——莫里斯蠕蟲爆發(fā)以來,針對(duì)內(nèi)存漏洞的攻擊方法便層出不窮,相應(yīng)的防護(hù)手段也不斷推陳出新[1],內(nèi)存漏洞的攻防博弈成為網(wǎng)絡(luò)空間安全領(lǐng)域的熱點(diǎn)問題之一。

        在早期的代碼注入攻擊中,滲透測(cè)試人員利用溢出漏洞向內(nèi)存中注入惡意代碼并篡改保存在內(nèi)存中的跳轉(zhuǎn)地址,使程序的控制流轉(zhuǎn)向所注入的惡意代碼中。為了解決這一問題,現(xiàn)代操作系統(tǒng)開始引入一種名為數(shù)據(jù)執(zhí)行保護(hù)(Data Execution Prevention,DEP)的保護(hù)機(jī)制,其將內(nèi)存中的數(shù)據(jù)和代碼進(jìn)行嚴(yán)格區(qū)分,滲透測(cè)試人員注入的惡意代碼只能被當(dāng)作數(shù)據(jù)解析而無法被執(zhí)行,從而使得常規(guī)的代碼注入攻擊難以發(fā)揮作用。

        隨著攻防技術(shù)的相互促進(jìn)與發(fā)展,代碼重用攻擊(Code Reuse Attack,CRA)開始興起[2-4],滲透測(cè)試人員利用內(nèi)存漏洞改變程序的執(zhí)行流程,通過將內(nèi)存空間中已有的分散代碼片段(稱為gadget)進(jìn)行鏈接,構(gòu)造出具備特定功能的程序邏輯從而實(shí)現(xiàn)攻擊的目的,能夠達(dá)到與傳統(tǒng)代碼注入攻擊相同的效果。

        代碼重用攻擊在實(shí)施過程中較為繁雜,通常需要一些工具輔助人工來完成gadget 序列的構(gòu)建,學(xué)術(shù)界也提出了很多自動(dòng)化的構(gòu)建方案,但都存在諸多問題使其難以得到廣泛應(yīng)用。短期內(nèi),代碼重用攻擊在實(shí)施過程中存在的問題將使得攻擊成本增加,惡意攻擊者不得不付出大量的時(shí)間來構(gòu)建攻擊載荷,從長(zhǎng)遠(yuǎn)來看,這也不利于防御機(jī)制的進(jìn)一步發(fā)展。因此,加快代碼重用攻擊的實(shí)現(xiàn)過程,快速構(gòu)建攻擊載荷,能夠方便滲透測(cè)試人員對(duì)系統(tǒng)進(jìn)行評(píng)估測(cè)試,從而構(gòu)建更加安全有效的防御系統(tǒng)。

        本文提出一種基于表達(dá)式樹的gadget 語義分析方法,通過表達(dá)式樹變體描述gadget 修改寄存器和內(nèi)存讀寫的情況,從而提高gadget 語義分析的效率,加快gadget 序列的構(gòu)建過程。

        1 研究背景

        1.1 代碼重用攻擊

        代碼重用攻擊是一種利用漏洞改變程序在內(nèi)存中的原有代碼執(zhí)行流程以實(shí)現(xiàn)攻擊目的的漏洞利用技術(shù)。以一個(gè)存在棧溢出漏洞的程序?yàn)槔?,在傳統(tǒng)的攻擊方法中,滲透測(cè)試人員需要向棧中注入惡意代碼,并修改程序的返回地址,使程序的控制流轉(zhuǎn)移到惡意代碼的起始地址,這種方法稱為代碼注入攻擊。但是,現(xiàn)代操作系統(tǒng)已經(jīng)廣泛采用數(shù)據(jù)不可執(zhí)行(DEP)等防御機(jī)制,代碼注入攻擊對(duì)此難以實(shí)現(xiàn)攻擊目的,因此,代碼重用攻擊成為當(dāng)前的主流攻擊方式。

        代碼重用攻擊和代碼注入攻擊之間既有一些共性特征也存在差異,它們都是利用計(jì)算機(jī)內(nèi)存漏洞的攻擊方式,均會(huì)篡改一些影響程序執(zhí)行的關(guān)鍵數(shù)據(jù),如棧中的返回地址、函數(shù)指針等,以此實(shí)現(xiàn)超出程序設(shè)計(jì)者預(yù)期的功能邏輯。兩者的區(qū)別在于滲透測(cè)試人員執(zhí)行惡意代碼的方法不同,代碼重用攻擊無需向內(nèi)存中注入外部代碼,只需重用程序中已經(jīng)存在的指令片段,這些指令片段能夠完成一定的計(jì)算和賦值等功能,因此也被稱為gadget,通過多個(gè)gadget 的拼接,滲透測(cè)試人員可以實(shí)現(xiàn)一些特定的意圖。代碼重用攻擊通常會(huì)使程序的控制流轉(zhuǎn)向特定的gadget,并按設(shè)定的順序依次執(zhí)行g(shù)adget,其實(shí)現(xiàn)過程如圖1 所示。

        圖1 代碼重用攻擊的實(shí)現(xiàn)過程Fig.1 Implementation of code reuse attack

        對(duì)于現(xiàn)代操作系統(tǒng)中某個(gè)存在緩沖區(qū)溢出問題的程序,為了繞過ASLR 和DEP 保護(hù),滲透測(cè)試人員需要進(jìn)行以下3 個(gè)步驟:

        1)利用內(nèi)存信息泄露漏洞得到需要調(diào)用的函數(shù)的地址和存在問題的緩沖區(qū)位置。

        2)構(gòu)建gadget 序列以調(diào)用該函數(shù)。

        3)根據(jù)gadget 序列構(gòu)造攻擊載荷并傳遞給程序。

        上述過程的核心是選擇合適的gadget 序列。滲透測(cè)試人員在實(shí)現(xiàn)某些功能前需要初始化一些寄存器,例如,在64 位Windows 操作系統(tǒng)中進(jìn)行函數(shù)調(diào)用前需要在RCX、RDX、R8 和R9 寄存器以及棧中設(shè)置參數(shù)。對(duì)于每一個(gè)需要初始化的寄存器,都要找到一個(gè)能夠?qū)ζ溥M(jìn)行修改的gadget,因此,在典型的代碼重用攻擊中要調(diào)用某個(gè)函數(shù),構(gòu)造的gadget 序列通常要包含:

        1)寄存器寫gadget,向RCX、RDX、R8 和R9 寄存器中寫入指定的值。

        2)能夠調(diào)用特定函數(shù)的gadget。

        要從程序中找到這些gadget,需要確定gadget 的部分語義,例如能否修改棧頂指針、能否修改特定的寄存器、是否有函數(shù)調(diào)用以及調(diào)用了哪個(gè)函數(shù)等信息。gadget 序列的構(gòu)建過程還會(huì)受到一些因素的影響,其中,最主要的影響是多個(gè)gadget 使用同一寄存器或同一內(nèi)存空間的情況,這會(huì)導(dǎo)致寄存器或某一內(nèi)存空間在賦值和使用時(shí)出現(xiàn)數(shù)據(jù)不一致的問題,這也被稱為gadget 的副作用。由于gadget 副作用的存在,手工構(gòu)造gadget 序列的過程極為繁瑣復(fù)雜。自SHACHAM提出ROP[3]以后,自動(dòng)化構(gòu)建gadget序列的研究就開始展開,但截至目前,gadget 工具的自動(dòng)化效果并不理想,多數(shù)工具只實(shí)現(xiàn)了自動(dòng)化搜索gadget 并進(jìn)行語義分析的功能。對(duì)于ROP 及其變種,gadget 搜索主要通過指令特征定位到特定的指令位置,再通過切片的方式實(shí)現(xiàn),該方法的優(yōu)化存在局限性。

        1.2 gadget 語義分析技術(shù)研究現(xiàn)狀

        由于機(jī)器指令的指令集過于復(fù)雜,并且與硬件結(jié)合過于緊密,直接對(duì)其進(jìn)行分析時(shí)難度較大。因此,現(xiàn)有工具通常會(huì)將gadget 的指令轉(zhuǎn)換成IR(Intermediate Representation),再以形式化的方法來確定gadget 所執(zhí)行的操作。

        SCHWARTZ 等人設(shè)計(jì)了能夠?qū)ΧM(jìn)制文件自動(dòng)生成ROP 載荷的工具Q[5-6],其主要思想是將搜索到的gadget 以一種更容易處理的中間形式表示,使用編譯器編譯時(shí)的指令匹配思路,結(jié)合中間形式在gadget 集合中選擇合適的gadget 來實(shí)現(xiàn)用戶描述功能。Q 將gadget 按功能進(jìn)行分類,并設(shè)計(jì)一種QooL語言,與gadget 的類別相對(duì)應(yīng)。Q 在判定某個(gè)gadget是否屬于特定功能的gadget 類別時(shí),采用程序驗(yàn)證領(lǐng)域中程序最弱前置條件的計(jì)算方法[7-9],具體如下:gadget L 和后置條件B 的最弱前置條件WP(L,B)是一個(gè)能夠判斷gadget 在執(zhí)行后能否滿足條件O 的布爾值,如果WP(L,B)恒為真,則gadget 屬于后置條件B 對(duì)應(yīng)的類別。這種將語義進(jìn)行分類的思想也被許多gadget 工具所采用。

        BARFgadget[10]用2 種方式實(shí)現(xiàn)gadget 分類和驗(yàn)證的功能,其仿照Q 將gadget 按功能分類,并為每一個(gè)類別定義一些判斷條件。在分類功能中,創(chuàng)建一個(gè)隨機(jī)化的初始狀態(tài),通過BARF 中的IR 模擬器執(zhí)行二進(jìn)制代碼對(duì)應(yīng)的REIL 指令以得到執(zhí)行g(shù)adget后的狀態(tài),確定gadget 讀寫了哪些寄存器以及是否修改了內(nèi)存和標(biāo)志位,并根據(jù)這些信息對(duì)gadget 的功能進(jìn)行初步分類;在驗(yàn)證功能中,根據(jù)預(yù)先定義的約束條件,通過約束求解的方式進(jìn)一步驗(yàn)證gadget是否具有前一階段確定的功能類別。

        PSHAPE[11]使用VEX 作為中間語言,并結(jié)合VEX 指令的特點(diǎn),將PUT、ST 和GET 指令中的寄存器進(jìn)行展開,用由寄存器構(gòu)成的表達(dá)式替換臨時(shí)變量,展開的過程中根據(jù)寄存器的傳遞關(guān)系,每次更新寄存器的最終值并且記錄寄存器解引用的情況。Ropper 和PSHAPE 的思路基本一致,針對(duì)PUT、ST和GET 3 種操作寄存器和內(nèi)存的指令,提取指令所依賴的表達(dá)式,最后使用約束求解器求解棧指針的偏移。angrop 基于angr 框架開發(fā),其充分利用了angr 提供的功能,將寄存器符號(hào)化,創(chuàng)建一個(gè)空白的初始狀態(tài),使用符號(hào)執(zhí)行得到執(zhí)行g(shù)adget 后的狀態(tài),根據(jù)新狀態(tài)中寄存器和內(nèi)存的值獲取gadget 讀寫寄存器和內(nèi)存的情況。

        ROPgenerator[12]使用REIL 作為中間語言,在將gadget 的指令轉(zhuǎn)換成REIL 指令后,會(huì)對(duì)每一條指令進(jìn)行分析,所有對(duì)寄存器和內(nèi)存的操作會(huì)被作為有向圖的一個(gè)節(jié)點(diǎn),節(jié)點(diǎn)中包含操作的表達(dá)式,通過節(jié)點(diǎn)之間的邊來表示寄存器之間的依賴關(guān)系,在遇到條件指令時(shí),在邊上添加條件的約束信息。最后,從有向圖中提取出條件和表達(dá)式的鍵值對(duì)以得到gadget 的語義摘要。

        BOP(Block Oriented Programming)[13]是一種非控制數(shù)據(jù)攻擊,其gadget 是遵循程序原有執(zhí)行流的代碼塊,但若要實(shí)現(xiàn)特定意圖,還需程序能夠執(zhí)行到具有特定語義的基本塊上,并且在執(zhí)行時(shí)滿足一些特定的約束。自動(dòng)化工具BOPC 對(duì)程序的基本塊進(jìn)行了抽象,其將寄存器符號(hào)化,在angr 框架上進(jìn)行符號(hào)執(zhí)行,通過對(duì)符號(hào)執(zhí)行后狀態(tài)的判斷來得到gadget 的關(guān)鍵信息。

        1.3 問題分析

        代碼重用攻擊的實(shí)施過程較為繁雜,通常需要一些工具輔助人工來完成gadget 鏈的構(gòu)建,當(dāng)前已經(jīng)有很多自動(dòng)化的構(gòu)建工具,本文總結(jié)6 種經(jīng)典gadget 工具的所用技術(shù)和實(shí)現(xiàn)方法,如表1 所示。

        表1 6 種現(xiàn)有工具的gadget 語義分析技術(shù)實(shí)現(xiàn)原理Table 1 The implementation principle of six existing tools’gadget semantic analysis technology

        以上gadget 工具采用的gadget 語義分析技術(shù)主要基于靜態(tài)分析和動(dòng)態(tài)符號(hào)執(zhí)行,一般而言,前者具有更高的效率,后者更容易實(shí)現(xiàn)。實(shí)際中在進(jìn)行g(shù)adget 語義分析時(shí),主要面臨如下2 個(gè)問題:

        1)gadget 語義分析主要服務(wù)于gadget 鏈的構(gòu)建,其關(guān)注的核心內(nèi)容與其他領(lǐng)域不同,而在當(dāng)前學(xué)術(shù)界公開發(fā)表的論文中,與gadget 語義分析相關(guān)的文獻(xiàn)資料較少,因此,分析確定gadget 的語義是首先要解決的問題。

        2)在多數(shù)情況下,gadget 的數(shù)量可能達(dá)到數(shù)十萬,而單個(gè)gadget 也可能是大段的代碼塊,需要盡可能地優(yōu)化gadget 的語義分析方法,因此,對(duì)現(xiàn)有g(shù)adget 語義分析方法進(jìn)行改進(jìn),加快語義分析的進(jìn)程,也是gadget 語義分析時(shí)需要解決的問題。

        針對(duì)上述第一個(gè)問題,本文分析現(xiàn)有g(shù)adget 工具的源碼,根據(jù)各工具分析的gadget 語義,定義gadget 語義摘要的概念,以明確gadget 語義分析的內(nèi)容;針對(duì)第二個(gè)問題,本文提出一種基于表達(dá)式樹的gadget 語義分析技術(shù),用一種表達(dá)式樹變體描述寄存器和內(nèi)存讀寫的表達(dá)式信息,以提高語義分析的效率。

        gadget 序列的自動(dòng)化生成需要完成gadget 的搜索、gadget 語義摘要的計(jì)算與gadget 的選擇和拼接等功能。gadget 搜索已經(jīng)廣泛應(yīng)用于工程實(shí)踐中,對(duì)于ROP 及其變種[14-16],采用的算法大多基于Galileo方法[3],很難有優(yōu)化的空間[17];對(duì)于gadget 的選擇和拼接,由于某一階段gadget 的選擇可能會(huì)影響之后所有的gadget 選擇,并且使用不同的gadget 選擇策略會(huì)產(chǎn)生不同的效果,對(duì)gadget 長(zhǎng)度的影響難以估量,因此,很難用一種通用且有效的方法實(shí)現(xiàn)自動(dòng)化;對(duì)于gadget 的語義分析,其內(nèi)容不夠明確,當(dāng)前gadget 工具使用的語義分析方法或是設(shè)計(jì)的結(jié)構(gòu)過于復(fù)雜,依托的框架也過于龐大,因此存在優(yōu)化的可能性。

        本文明確gadget 語義分析的內(nèi)容,提出一種基于表達(dá)式樹的方法,以描述寄存器和內(nèi)存讀寫的表達(dá)式信息。在該方法中,對(duì)描述表達(dá)式信息的數(shù)據(jù)結(jié)構(gòu)進(jìn)行優(yōu)化,使其能夠快速得到表達(dá)式所依賴的寄存器。在各個(gè)工具實(shí)現(xiàn)的搜索功能和語義摘要的計(jì)算功能各不相同的情況下,設(shè)計(jì)一個(gè)實(shí)驗(yàn)系統(tǒng)進(jìn)行對(duì)比與分析。

        2 基于表達(dá)式樹的gadget 語義摘要計(jì)算

        2.1 gadget 語義摘要

        在實(shí)際的代碼重用攻擊過程中,構(gòu)建一個(gè)可用的gadget 鏈并不需要gadget 蘊(yùn)含的全部語義信息。事實(shí)上,自動(dòng)化構(gòu)建gadget 鏈通常會(huì)采用啟發(fā)式算法,只需考慮gadget 副作用的影響和部分關(guān)鍵語義,如系統(tǒng)調(diào)用、控制流轉(zhuǎn)移等信息,明確需要分析的gadget 語義,并對(duì)其進(jìn)行簡(jiǎn)化或提煉即能夠加快語義分析的進(jìn)程。為了進(jìn)一步明確構(gòu)建gadget 序列過程中需要確定的語義,本文分析常用gadget 工具的源代碼,如表2 所示,其中,“√”表示工具分析了語義,“×”表示未分析。

        表2 6 種典型開源gadget 工具的語義信息Table 2 Semantic information of six typical open source gadget tools

        在表2 中,regw、memr 和memw 分別表示寄存器寫、內(nèi)存讀和內(nèi)存寫操作,expr 表示能否為相應(yīng)的寄存器或內(nèi)存進(jìn)行定量分析,生成能夠被解析的表達(dá)式,sp offset 表示棧指針的偏移值,transfer 表示控制流轉(zhuǎn)移情況,包括系統(tǒng)調(diào)用syscall、庫(kù)函數(shù)調(diào)用libcall 和條件轉(zhuǎn)移cond。

        由于多數(shù)gadget 工具沒有實(shí)現(xiàn)gadget 鏈構(gòu)建功能,因此在上述工具中,只有使用符號(hào)執(zhí)行進(jìn)行語義分析的2 個(gè)工具angrop 和BOPC 對(duì)控制流轉(zhuǎn)移情況進(jìn)行了分析。在實(shí)際確定控制流轉(zhuǎn)移情況的過程中,如果目的地址是一個(gè)常量,可以通過單條指令的機(jī)器碼結(jié)合指令的地址計(jì)算得到;如果目的地址是一個(gè)寄存器或內(nèi)存,可以通過寄存器和內(nèi)存的表達(dá)式得到。

        為進(jìn)一步明確gadget 語義,本文定義gadget 的語義摘要為:用于表述gadget 核心語義和功能的關(guān)鍵信息,包括寄存器和內(nèi)存的讀寫情況以及棧指針的偏移。其中,寄存器的讀寫情況包括被修改的寄存器名、最后一次寫入的值及其依賴的寄存器或內(nèi)存空間,內(nèi)存的讀寫情況包括被讀取或?qū)懭氲膬?nèi)存空間的位置、內(nèi)存地址、寫入的值及其依賴的寄存器或內(nèi)存空間。

        2.2 特殊表達(dá)式樹設(shè)計(jì)

        通過對(duì)現(xiàn)有g(shù)adget 工具的源碼進(jìn)行分析,得出多數(shù)gadget 工具對(duì)gadget 進(jìn)行表達(dá)式分析時(shí)使用的數(shù)據(jù)結(jié)構(gòu)不易于處理,尤其對(duì)于較長(zhǎng)的gadget,分析效率會(huì)降低,原因是現(xiàn)有g(shù)adget 工具表示寄存器數(shù)值的方式過于簡(jiǎn)單,或是使用簡(jiǎn)單的表達(dá)式替換,這使得gadget語義分析不能很好地解析寄存器或內(nèi)存的表達(dá)式。此外,現(xiàn)有g(shù)adget工具使用較為復(fù)雜的圖結(jié)構(gòu),在維護(hù)寄存器和內(nèi)存讀寫情況的過程中需要遍歷多個(gè)節(jié)點(diǎn),并通過多次計(jì)算來確定依賴寄存器或內(nèi)存的信息,在gadget數(shù)量較多時(shí)其影響較為顯著。

        gadget 工具能從部分二進(jìn)制文件(如一些大于10 MB 的共享庫(kù))中搜索到較多的gadget,這時(shí)需要計(jì)算大量的語義摘要,因此,要盡可能地加快語義摘要的計(jì)算速度。符號(hào)執(zhí)行或模擬執(zhí)行的方法將耗費(fèi)較長(zhǎng)時(shí)間,現(xiàn)有工具所使用的靜態(tài)分析技術(shù)同樣存在優(yōu)化的空間。

        為了能夠支持多種平臺(tái),gadget 工具一般會(huì)將gadget 翻譯成中間語言,再對(duì)中間語言進(jìn)行語法分析,在語法分析中較為突出的一個(gè)問題就是對(duì)數(shù)學(xué)表達(dá)式的描述和分析,通常使用表達(dá)式樹來解決該問題。為了說明中間語言轉(zhuǎn)換成表達(dá)式樹的可行性,本文以VEX、REIL 兩類使用最為廣泛的中間語言為例,對(duì)其中常用的幾種指令進(jìn)行表達(dá)式形式轉(zhuǎn)換。

        表3 所示為VEX 中最常見的8 種指令及其表達(dá)式形式,將GET、PUT、LD、ST 和ITE 這5 種指令轉(zhuǎn)換成賦值表達(dá)式,其中,ITE 是條件賦值指令,類似于C 語言的條件運(yùn)算符。將算術(shù)指令和類型轉(zhuǎn)換指令轉(zhuǎn)換成算術(shù)表達(dá)式,多數(shù)運(yùn)算操作都是一元或者二元運(yùn)算,部分浮點(diǎn)運(yùn)算操作使用了3 個(gè)或者4 個(gè)操作數(shù),并調(diào)用了VEX中的輔助函數(shù)(helper function),但通常對(duì)gadget 的語義分析只關(guān)心通用寄存器,而輔助函數(shù)沒有副作用,不會(huì)影響寄存器的值,因此,不需要精確地定義其表達(dá)式,可以將它轉(zhuǎn)換成多叉樹的形式。

        表3 VEX 的常見指令及其表達(dá)式形式Table 3 Common instructions of VEX and their expressions

        表4 所示為REIL 中最常見的7 種指令及其表達(dá)式形式,將STR、LDM、STM、BISZ 和JCC 這5 種指令轉(zhuǎn)換成賦值表達(dá)式,其中,BISZ 是條件賦值指令,類似于C 語言的條件運(yùn)算符,JCC 是條件跳轉(zhuǎn)指令,可以看作是對(duì)IP 的條件賦值。將算術(shù)指令和邏輯指令轉(zhuǎn)換成算術(shù)表達(dá)式,所有的運(yùn)算操作都是二元運(yùn)算,可以很容易地轉(zhuǎn)換成樹的形式。

        表4 REIL 的常見指令及其表達(dá)式形式Table 4 Common instructions of REIL and their expressions

        在傳統(tǒng)的表達(dá)式樹中,每一個(gè)葉節(jié)點(diǎn)對(duì)應(yīng)一個(gè)操作數(shù),每一個(gè)非葉節(jié)點(diǎn)對(duì)應(yīng)一個(gè)數(shù)學(xué)運(yùn)算,整個(gè)表達(dá)式樹會(huì)對(duì)應(yīng)一個(gè)算數(shù)表達(dá)式,而無需考慮特定的子表達(dá)式樹。但是,gadget 的語義分析可能涉及多個(gè)寄存器或中間變量,多數(shù)情況下需要考慮中間變量的表達(dá)式,還需要記錄表達(dá)式對(duì)應(yīng)的目標(biāo)變量,因此,本文對(duì)傳統(tǒng)的表達(dá)式樹進(jìn)行一些修改,設(shè)計(jì)一種特殊的表達(dá)式樹以表示gadget 的語義,具體為:樹中有Val 和Expr 兩類節(jié)點(diǎn),Val 節(jié)點(diǎn)可以是寄存器或內(nèi)存的初值、常量值和運(yùn)算符,Expr 節(jié)點(diǎn)是一棵子表達(dá)式樹,每一棵子表達(dá)式樹對(duì)應(yīng)一條IR 指令,其根節(jié)點(diǎn)必定是一個(gè)代表運(yùn)算符的Val 節(jié)點(diǎn),Expr 節(jié)點(diǎn)中保存了目標(biāo)變量的信息,這樣一個(gè)gadget 就轉(zhuǎn)化成一棵或多棵表達(dá)式樹。

        由于一個(gè)gadget 可能多次修改某一寄存器或內(nèi)存空間,因此需要區(qū)分每一次修改寄存器的情況,將寄存器或內(nèi)存的初始值標(biāo)記為如同“eax_0”的形式,即在寄存器名或內(nèi)存地址后加下劃線“_”和修改次數(shù)“0”。以指令“add eax,ebx”對(duì)應(yīng)的VEX IR 為例,如圖2 所示,可以得到如圖3 所示的表達(dá)式樹,其中,圓圈代表Val 節(jié)點(diǎn),方框代表Expr 節(jié)點(diǎn)。

        圖2 “add eax,ebx”對(duì)應(yīng)的VEX 指令Fig.2 VEX instruction corresponding to“add eax,ebx”

        圖3 “add eax,ebx”的VEX 指令對(duì)應(yīng)的表達(dá)式樹Fig.3 The expression tree corresponding to VEX instruction of“add eax,ebx”

        與傳統(tǒng)的表達(dá)式樹相同,本文表達(dá)式樹能夠通過訪問葉節(jié)點(diǎn)來確定表達(dá)式的操作數(shù),進(jìn)而得到gadget 的副作用信息,獲取表達(dá)式所依賴的寄存器或內(nèi)存空間。與傳統(tǒng)表達(dá)式樹的不同之處在于,該表達(dá)式樹維護(hù)了表達(dá)式對(duì)應(yīng)的目標(biāo)變量,并能通過Expr 節(jié)點(diǎn)方便地提取某個(gè)中間變量對(duì)應(yīng)的表達(dá)式值,這為獲取部分變量的約束提供了便利。特別地,當(dāng)gadget 的長(zhǎng)度較長(zhǎng)時(shí),構(gòu)造的表達(dá)式樹深度也會(huì)增加,在極端情況下會(huì)近似成為一條鏈表,這時(shí)確定依賴寄存器的效率會(huì)大幅降低。為了能夠快速得到依賴寄存器的信息,本文采用以空間換時(shí)間的思路,在將IR 指令轉(zhuǎn)化成表達(dá)式樹的過程中,為每一個(gè)Expr 節(jié)點(diǎn)維護(hù)依賴寄存器的信息。

        2.3 語義分析的執(zhí)行流程

        本文提出一種基于表達(dá)式樹的gadget 語義摘要計(jì)算方法,在將二進(jìn)制轉(zhuǎn)化成中間語言IR 后,根據(jù)中間語言需要滿足SSA(Static Single Assignment)的特點(diǎn)構(gòu)造2.2 節(jié)所述的表達(dá)式樹,根據(jù)該表達(dá)式樹生成gadget 語義摘要,執(zhí)行流程如圖4 所示。

        圖4 gadget 語義摘要計(jì)算流程Fig.4 Calculation procedure of semantic summary of gadget

        在生成表達(dá)式樹以后,為每一個(gè)寄存器和中間變量構(gòu)建一個(gè)鍵為名稱、值為表達(dá)樹的鍵值對(duì),為每一個(gè)寄存器構(gòu)建一個(gè)修改次數(shù)的計(jì)數(shù)器,此時(shí)獲取特定寄存器或中間變量的值只需要先通過鍵值對(duì)訪問對(duì)應(yīng)的表達(dá)式樹,然后解析表達(dá)式樹即可。在解析樹時(shí)先通過葉節(jié)點(diǎn)訪問該寄存器或中間變量的依賴寄存器信息,再將對(duì)應(yīng)的Expr 節(jié)點(diǎn)轉(zhuǎn)換回?cái)?shù)學(xué)表達(dá)式作為約束條件進(jìn)行求解即可得到對(duì)應(yīng)的寄存器值。對(duì)于棧寄存器的偏移值,從棧寄存器對(duì)應(yīng)的Expr 節(jié)點(diǎn)出發(fā),自頂向下遍歷Expr 節(jié)點(diǎn)并收集約束條件,即可通過約束求解器求出偏移值。

        2.4 SemExpr 的設(shè)計(jì)與實(shí)現(xiàn)

        當(dāng)前有多種方案能夠?qū)崿F(xiàn)IR 翻譯和分析功能,如S2E、BARF 和angr 等框架。其中,S2E使用QEMU 進(jìn)行整個(gè)計(jì)算機(jī)模擬,但這需要較多的系統(tǒng)資源;BARF 使用REIL[18]作為中間語言,當(dāng)前REIL難以支持很多指令,其中包括gadget 中比較常見的指令,如retf,因此,BARF 在功能上略顯不足;angr 使用VEX IR[19]作為中間語言,相對(duì)于REIL,VEX 支持的指令集更多,相對(duì)于匯編語言,VEX 提取語義信息更快捷,因此,其更適合計(jì)算gadget 的摘要信息,并且已經(jīng)有angrop、Ropper 和PSHAPE 等開源工具,這使得angr 的實(shí)現(xiàn)和評(píng)估更為簡(jiǎn)單。

        本文在Ropper 的基礎(chǔ)上構(gòu)建原型系統(tǒng)SemExpr,如圖5 所示,其中主要包括pyvex 和Z3 兩個(gè)開源項(xiàng)目。pyvex 是python 版本的IR 翻譯工具,能夠?qū)⒍M(jìn)制文件轉(zhuǎn)換成VEX IR;Z3 是一個(gè)高效的SMT(Satisfiability Modulo Theories)求解器,集成了多種約束求解算法。

        圖5 SemExpr 的結(jié)構(gòu)及執(zhí)行流程Fig.5 Structure and execution procedure of SemExpr

        SemExpr由3 個(gè)模塊構(gòu)成,加載模塊使用了Ropper原有的加載代碼,能夠讀取PE 文件和ELF 文件的代碼段;搜索模塊會(huì)根據(jù)指定的命令行參數(shù),搜索以ret、jmp指令或系統(tǒng)調(diào)用結(jié)尾的gadget,并去掉重復(fù)的gadget;語義模塊會(huì)對(duì)gadget 進(jìn)行分析,得到gadget 的表達(dá)式樹以及各寄存器的表達(dá)式,生成約束條件,根據(jù)約束條件計(jì)算sp 的偏移值。系統(tǒng)執(zhí)行流程如下:

        1)加載二進(jìn)制文件,解析文件頭,得到代碼段中的字節(jié)序列和對(duì)應(yīng)的地址。

        2)根據(jù)命令行參數(shù),從第1 步所得字節(jié)序列中搜索具有特定機(jī)器碼的位置,通過Galileo算法得到gadget,將所有的gadget放到一個(gè)集合中以去除相同的gadget。

        3)為每個(gè)gadget 創(chuàng)建一個(gè)圖結(jié)構(gòu),利用pyvex 得到gadget 的VEX IR 形式,根據(jù)VEX IR 指令具有IRStmt、IRExpr 和IROp 3 層結(jié)構(gòu)的特點(diǎn),在IROp 中得到能夠被Z3 解析的表達(dá)式形式,在IRExpr 中構(gòu)建單個(gè)的表達(dá)式樹結(jié)構(gòu)并根據(jù)表達(dá)式形式構(gòu)建約束條件,在IRStmt 中將構(gòu)建的單個(gè)表達(dá)式樹添加到gadget 對(duì)應(yīng)的圖中。

        4)找到sp 對(duì)應(yīng)的表達(dá)式樹,遍歷該表達(dá)式樹,得到樹中的全部約束條件。

        5)將約束條件作為輸入,使用Z3 進(jìn)行求解,得到sp 的偏移值。

        6)返回gadget 的語義摘要信息。

        3 實(shí)驗(yàn)與評(píng)估

        3.1 實(shí)驗(yàn)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)

        現(xiàn)有g(shù)adget 工具基于Galileo 算法均實(shí)現(xiàn)了各自的gadget 搜索功能,但其搜索參數(shù),如指令長(zhǎng)度限制和字節(jié)數(shù)限制各不相同,并且在搜索后還定義了不同的篩選策略,因此,它們搜索得到的gadget 數(shù)量也不盡相同。此外,各個(gè)工具計(jì)算的語義摘要內(nèi)容略有不同,導(dǎo)致難以對(duì)各工具進(jìn)行對(duì)比實(shí)驗(yàn)和評(píng)估。

        針對(duì)上述問題,本文設(shè)計(jì)一個(gè)如圖6 所示的實(shí)驗(yàn)系統(tǒng)gadgetAnalysis,以評(píng)估本文設(shè)計(jì)的gadget 語義摘要計(jì)算方法的性能。該實(shí)驗(yàn)系統(tǒng)由搜索模塊、轉(zhuǎn)換模塊和語義模塊構(gòu)成,其中,搜索模塊用于搜索gadget,在實(shí)現(xiàn)時(shí)對(duì)gadget 搜索工具ROPgadget[20]進(jìn)行略微修改,使用戶能夠設(shè)定gadget 長(zhǎng)度的上下限;轉(zhuǎn)換模塊用于將ROPgadget 的搜索結(jié)果轉(zhuǎn)換成各工具能夠分析的數(shù)據(jù)結(jié)構(gòu),部分工具會(huì)在確定語義前對(duì)gadget 進(jìn)行篩選,為了提高對(duì)比實(shí)驗(yàn)的準(zhǔn)確性,本文將篩選部分全部去除;語義模塊能夠?qū)λ阉鞯降膅adget 進(jìn)行分析,確定gadget 的語義,實(shí)現(xiàn)時(shí)將各gadget 工具的語義分析部分進(jìn)行提取和修改,只計(jì)算本文定義的語義摘要,但是對(duì)于PSHAPE,其使用基于字符串替換的語義分析,最后只能得到嵌套的VEX 形式的表達(dá)式,不能用于gadget 序列構(gòu)建。

        圖6 gadgetAnalysis 系統(tǒng)結(jié)構(gòu)Fig.6 System structure of gadgetAnalysis

        3.2 結(jié)果與分析

        選取Windows 和Linux 下常見的共享庫(kù)和軟件,設(shè)定gadget 的指令數(shù)為2~10,統(tǒng)計(jì)各工具計(jì)算語義摘要的時(shí)間以及能夠處理的gadget 數(shù)量,進(jìn)行10 次實(shí)驗(yàn)取平均值得到如表5 所示的結(jié)果。根據(jù)表5 的實(shí)驗(yàn)結(jié)果,從計(jì)算時(shí)間、能處理的gadget 數(shù)量和能否生成可用的表達(dá)式3 個(gè)方面衡量各工具的性能,結(jié)果如表6 所示。從表6 可以看出,angrop 計(jì)算時(shí)間最長(zhǎng),由于其使用了符號(hào)執(zhí)行,計(jì)算的語義最多,面對(duì)一些特殊的指令時(shí)反而無法處理,因此能處理的gadget 數(shù)量最少;ROPgenerator 雖然計(jì)算時(shí)間最短,但受限于REIL 指令,其能處理的gadget 數(shù)量較少;PSHAPE 計(jì)算時(shí)間較短,能處理的gadget 數(shù)量也最多,但其生成的表達(dá)式不能被解析;Ropper 能處理的gadget 數(shù)量較多,但其計(jì)算時(shí)間較長(zhǎng);相較于Ropper,SemExpr 在計(jì)算時(shí)間上取得了明顯改進(jìn),其能取得較好的效果。

        表5 各gadget 工具計(jì)算語義摘要的時(shí)間和能夠處理的gadget 數(shù)量Table 5 The time that each gadget tool requires to calculate the semantic summary and the number of gadgets that can be processed

        表6 各gadget 工具性能對(duì)比Table 6 Performance comparisons of each gadget tool

        4 結(jié)束語

        本文針對(duì)當(dāng)前自動(dòng)化方案構(gòu)造gadget序列時(shí)效率較低的問題,對(duì)主流gadget 工具計(jì)算的語義信息進(jìn)行提煉,并定義gadget語義摘要的概念,提出一種基于表達(dá)式樹的gadget語義摘要計(jì)算方法。以VEX、REIL 2種中間語言為例,說明中間語言轉(zhuǎn)換成表達(dá)式樹的可行性,并實(shí)現(xiàn)一種原型系統(tǒng)SemExpr。在此基礎(chǔ)上,本文設(shè)計(jì)用于測(cè)量gadget 語義摘要計(jì)算效率的實(shí)驗(yàn)系統(tǒng)gadgetAnalysis,仿真結(jié)果驗(yàn)證了SemExpr在計(jì)算gadget語義摘要時(shí)具有較好的性能。在對(duì)gadget進(jìn)行語義分析后,如何根據(jù)語義分析的信息來拼接gadget 以構(gòu)建具有特定功能的gadget 鏈,是代碼重用攻擊實(shí)現(xiàn)自動(dòng)化的瓶頸之一。對(duì)于該問題,目前只能通過一些啟發(fā)式算法來構(gòu)建具備簡(jiǎn)單功能的gadget 序列,設(shè)計(jì)算法構(gòu)建具有指定復(fù)雜邏輯的gadget序列將是下一步的研究方向。

        猜你喜歡
        表達(dá)式寄存器內(nèi)存
        Lite寄存器模型的設(shè)計(jì)與實(shí)現(xiàn)
        一個(gè)混合核Hilbert型積分不等式及其算子范數(shù)表達(dá)式
        表達(dá)式轉(zhuǎn)換及求值探析
        “春夏秋冬”的內(nèi)存
        淺析C語言運(yùn)算符及表達(dá)式的教學(xué)誤區(qū)
        分簇結(jié)構(gòu)向量寄存器分配策略研究*
        基于內(nèi)存的地理信息訪問技術(shù)
        議C語言中循環(huán)語句
        商(2012年11期)2012-07-09 19:07:55
        高速數(shù)模轉(zhuǎn)換器AD9779/AD9788的應(yīng)用
        一種可重構(gòu)線性反饋移位寄存器設(shè)計(jì)
        久久aⅴ无码一区二区三区| 无码精品一区二区三区在线| 国产精品女人呻吟在线观看| 亚洲av日韩av无码av| 国产成人香蕉久久久久| 开心五月激情五月天天五月五月天 | 中文字幕人妻av一区二区| 亚洲成av人综合在线观看| 日本少妇被黑人xxxxx| 精品亚洲欧美高清不卡高清| 国产高清自产拍av在线| 国产成人a级毛片| 国产影片中文字幕| 久99久精品视频免费观看v| 国产精品高清免费在线| 亚洲午夜av久久久精品影院色戒| 国产精品jizz视频| 天天插天天干天天操| 日韩av在线手机免费观看| 全黄性性激高免费视频| 国产午夜福利精品久久2021| 国产精品天干天干在线观蜜臀| 中文国产乱码在线人妻一区二区| 东京道一本热中文字幕| 亚洲综合欧美日本另类激情| 91亚洲最新国语中文字幕| 免费在线观看av不卡网站 | 亚洲乱码中文字幕一线区| 先锋中文字幕在线资源| 久久久久99精品成人片试看| 亚洲国产精品夜男人天堂| 青青草成人在线免费视频| 日本一卡2卡3卡四卡精品网站| 青青草视频华人绿色在线| 日本av不卡一区二区三区| 蜜桃日本免费观看mv| 秋霞午夜无码鲁丝片午夜精品| 亚洲视频中文字幕更新| 日韩午夜理论免费tv影院| 国产专区国产av| 无码中文字幕专区一二三|