• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      基于IDA microcode的控制流反混淆框架設(shè)計與實(shí)現(xiàn)

      2022-07-08 00:42:30符笑彬鐘曉雄鄭彥斌
      關(guān)鍵詞:基本塊控制流常量

      符笑彬, 丁 勇, 鐘曉雄, 鄭彥斌,2

      (1.桂林電子科技大學(xué) 廣西密碼學(xué)與信息安全重點(diǎn)實(shí)驗(yàn)室, 廣西 桂林 541004;2.曲阜師范大學(xué) 數(shù)學(xué)科學(xué)學(xué)院, 山東 曲阜 273165)

      代碼混淆是一種常見的軟件保護(hù)方案,可將目標(biāo)程序轉(zhuǎn)換為更復(fù)雜但在語義上等效的混淆程序,主要目的是讓逆向分析人員難以解讀出軟件的內(nèi)部邏輯[1]。Obfuscator-LLVM(O-LLVM)是最著名的代碼混淆器之一,它可以有效抵御攻擊者對混淆程序的逆向分析。O-LLVM官方提供3種混淆方法:指令替換、虛假控制流和控制流平坦化。隨后有多位開發(fā)者在O-LLVM官方版本基礎(chǔ)上進(jìn)行修改并開源,增加了更多的混淆方案,例如:字符串加密[2]、寄存器間接跳轉(zhuǎn)[3]、函數(shù)間接調(diào)用[3]、指令虛擬化[4]等。

      O-LLVM可以有效保護(hù)軟件知識產(chǎn)權(quán),同時也被廣泛應(yīng)用在病毒、木馬等惡意軟件。因此,實(shí)現(xiàn) O-LLVM反混淆對于維護(hù)健康的軟件安全生態(tài)環(huán)境具有重要的現(xiàn)實(shí)意義。

      2015年,Yadegari等[5]提出了一種基于模擬執(zhí)行的反混淆方法。但是,此類方案主要存在以下缺陷:1)反混淆完整度較低:由于條件分支的存在,很多情況下該方案無法執(zhí)行到所有可能的路徑。例如,在許多惡意軟件程序中,只有在滿足特定觸發(fā)條件時,才會執(zhí)行實(shí)現(xiàn)惡意行為的特定代碼路徑[6]。2)存在多種反模擬執(zhí)行方案:代碼虛擬化[7]、加殼與代碼自修改[8-9]。3)補(bǔ)丁二進(jìn)制困難:補(bǔ)丁二進(jìn)制文件只能修改原指令,而不能隨意添加新指令。

      2019年,Kan等[10]提出了基于符號執(zhí)行的安卓應(yīng)用程序反混淆方案。雖然符號執(zhí)行彌補(bǔ)了模擬執(zhí)行的前2個缺陷,但仍然主要存在以下問題:1)存在多種反符號執(zhí)行方案:Anand等[11]將符號執(zhí)行的弱點(diǎn)分為復(fù)雜約束、路徑發(fā)散和路徑爆炸,由此設(shè)計和實(shí)現(xiàn)了對應(yīng)的反符號執(zhí)行方案。例如,攻擊SMT約束求解器使得符號執(zhí)行探測不到目標(biāo)路徑等[12-13]。2)符號執(zhí)行路徑爆炸:當(dāng)被混淆的函數(shù)本身邏輯過于復(fù)雜時,符號執(zhí)行會產(chǎn)生路徑爆炸問題,導(dǎo)致嚴(yán)重耗時以至于無法執(zhí)行完畢[11]。3)補(bǔ)丁二進(jìn)制困難。4)真實(shí)塊識別困難:當(dāng)遇到定制化的O-LLVM混淆時,原本的真實(shí)塊識別算法會失效,而且僅依靠分析匯編指令很難開發(fā)新的真實(shí)塊識別算法。

      2019年,Garba等[14]提出了基于中間語言LLVM-IR的O-LLVM反混淆方法,該方案在多個方面優(yōu)于模擬執(zhí)行和符號執(zhí)行方案。但是,其只能針對虛假控制流進(jìn)行反混淆,卻不能處理控制流平坦化。由于該方案重度依賴開源項目Remill[15],導(dǎo)致其不支持ARM32架構(gòu)。在移動平臺上ARM32架構(gòu)占有率極高,因此該方案不適用于絕大多數(shù)移動平臺。

      為了解決上述難點(diǎn),提出了一種基于IDA microcode的反混淆框架BinDeob。引入中間語言(intermediate representation,簡稱IR)IDA microcode的主要目的是解決文獻(xiàn)[14]不支持ARM32架構(gòu)的問題,采用IR帶來了架構(gòu)無關(guān)的優(yōu)勢,因此BinDeob支持ARM32、ARM64、x86、x64等多種指令集架構(gòu)。但I(xiàn)DA microcode本身不具備控制流反混淆能力,需要在此基礎(chǔ)上開發(fā)相關(guān)反混淆算法。具體來說,BinDeob的反混淆操作是O-LLVM混淆的逆過程,將二進(jìn)制代碼提升到IR IDA microcode,即等價于O-LLVM混淆器使用的LLVM-IR,更有利于反混淆算法的實(shí)現(xiàn)。另外,在定制化混淆中,不僅真實(shí)塊的識別會變得更加困難,而且某個真實(shí)塊可能被多次復(fù)用。BinDeob在IR層通過兼容定制化混淆的真實(shí)塊識別算法和復(fù)用塊分割算法可以很好地解決這些問題。

      1 背景知識

      1.1 Obfuscator-LLVM

      Obfuscator-LLVM(O-LLVM)是x86和ARM平臺上使用最廣泛的代碼混淆器之一[16]。O-LLVM旨在為軟件提供代碼混淆和防篡改的功能,充分提高了軟件的安全性。它具有良好的混淆效果、定制化的混淆方案、不依賴于編程語言和平臺體系等特點(diǎn),因此被廣泛應(yīng)用于軟件安全領(lǐng)域。但是,惡意軟件開發(fā)者也逐步在惡意軟件中使用該混淆技術(shù),以提高安全人員的分析難度,增加安全人員分析惡意軟件所需的時間成本。官方版的O-LLVM提供了以下3種混淆技術(shù)。

      1) 指令替換。指令替換是O-LLVM中最簡單的混淆技術(shù),使用功能等價但更復(fù)雜的指令序列代替標(biāo)準(zhǔn)的二進(jìn)制運(yùn)算指令。通常一條標(biāo)準(zhǔn)運(yùn)算指令能匹配多種等價的指令序列,O-LLVM將隨機(jī)選取并組合,進(jìn)而增加代碼的多樣性。

      2) 虛假控制流。在隨機(jī)選擇的基本塊之前添加條件跳轉(zhuǎn),該跳轉(zhuǎn)指向原始基本塊或永遠(yuǎn)不會被執(zhí)行的虛假基本塊[16]。為了避免被編譯器優(yōu)化,新添加的基本塊通常包含不透明謂詞,同時確保在運(yùn)行期間僅執(zhí)行原始基本塊[10]。

      3) 控制流平坦化??刂屏髌教够乃枷胱钤缬擅绹S吉尼亞大學(xué)的 Wang[17]提出,之后Chow等[18]詳細(xì)證明了其正確性。2009年,Lszl等[19]將控制流平坦化技術(shù)運(yùn)用于C/C++代碼的保護(hù)。控制流平坦化會將正常的程序流程轉(zhuǎn)換為switch結(jié)構(gòu),使得基本塊之間的聯(lián)系碎片化,導(dǎo)致逆向分析人員無法直觀地判定出基本塊之間的先后關(guān)系,進(jìn)而提高逆向成本。

      一般來說,指令替換和虛假控制流都是指令級別的語義混淆,而控制流平坦化是函數(shù)級別控制流的整體重構(gòu)[10]。因此,控制流平坦化是最有效且最難還原的混淆方式。

      1.2 IDA Microcode

      IDA Pro作為業(yè)界安全人員的必備工具之一,其強(qiáng)大的反編譯功能深受廣大安全愛好者喜愛。從IDA 7.2版本開始,IDA開發(fā)團(tuán)隊開放了microcode API[21],使得用戶可以改善反編譯器的輸出結(jié)果。與低級匯編語言相比,反編譯器生成的高級語言(也稱為偽代碼)具有簡潔、結(jié)構(gòu)化、易于理解等優(yōu)點(diǎn),甚至可與程序源代碼相媲美[22]。

      IDA可將不同架構(gòu)的匯編指令轉(zhuǎn)換為同一種形式的microcode,然后反編譯器對其進(jìn)行優(yōu)化和轉(zhuǎn)換[21]。因此,對于反混淆研究來說,操作microcode API可忽略指令集架構(gòu)的差異,只需關(guān)心反混淆算法的實(shí)現(xiàn),最后直接生成反混淆后的高級語言。特別地,IDA在內(nèi)部優(yōu)化和轉(zhuǎn)換microcode時,會存在不同的9個成熟度階段(MMAT_ZERO,MMAT_GENERATED,MMAT_PREOPTIMIZED,MMAT_LOCOPT,MMAT_CALLS,MMAT_GLBOPT1,MMAT_GLBOPT2,MMAT_GLBOPT3,MMAT_LVARS)。在不同的成熟度階段,編譯器所做的優(yōu)化操作也不同,根據(jù)需要選取適當(dāng)?shù)某墒於入A段會使得反混淆操作事半功倍。同時,在反混淆處理中需要注意不同成熟度真實(shí)塊之間的對應(yīng)關(guān)系。

      2 反混淆框架的算法設(shè)計與實(shí)現(xiàn)

      控制流混淆一般包括虛假控制流和控制流平坦化。通過配置IDA pro的Segment權(quán)限即可自動對抗虛假控制流。在反混淆中,BinDeob操作microcode API將被混淆函數(shù)的匯編指令轉(zhuǎn)換為中間語言,再通過設(shè)計的兼容定制化混淆的真實(shí)塊識別算法和復(fù)用塊分割算法對中間語言進(jìn)行優(yōu)化和控制流重建,最后得到反混淆后的偽代碼。在BinDeob的設(shè)計過程中主要考慮如下3個問題。

      1) 真實(shí)塊識別。在被定制化混淆器保護(hù)的代碼中,可能存在多個主分發(fā)器與預(yù)分發(fā)器或者只存在主分發(fā)器,文獻(xiàn)[10,20]中提出的真實(shí)塊識別算法均會失效。本文提出一種兼容定制化混淆的真實(shí)塊識別算法,可同時適用于標(biāo)準(zhǔn)和定制化混淆器。

      2) 復(fù)用塊分割。在定制化混淆中,經(jīng)常出現(xiàn)某個真實(shí)塊被多次引用,但該真實(shí)塊的后繼塊卻不唯一,這里稱之為復(fù)用塊。因此,在反混淆時必須多次拷貝復(fù)用塊。文獻(xiàn)[5,10,20]的反混淆操作目標(biāo)為匯編指令,均難以完成分割操作。本文使用中間語言IDA microcode可以很好地解決該問題。

      3) 控制流重建。在確定了真實(shí)塊及真實(shí)塊之間的先后關(guān)系后,通常還需考慮真實(shí)塊有分支與無分支2種情況,最后通過修改相應(yīng)的跳轉(zhuǎn)指令重建控制流程。

      圍繞以上3個問題,提出了基于IDA microcode的控制流反混淆框架BinDeob,其架構(gòu)如圖1所示。具體工作流程為:1)給定一個O-LLVM混淆保護(hù)的二進(jìn)制文件,BinDeob框架首先通過真實(shí)塊識別算法得到難以識別的真實(shí)塊、映射表等信息,該算法能同時適用于標(biāo)準(zhǔn)和定制化混淆器;2)利用復(fù)用塊分割算法復(fù)制并重組被復(fù)用的真實(shí)塊,使得BinDeob在降低控制流重建難度的同時提升反混淆的準(zhǔn)確率;3)根據(jù)真實(shí)塊更新的平坦化變量值重建控制流程;4)得到反混淆后的偽代碼。

      2.1 真實(shí)塊識別

      為了更加準(zhǔn)確地反混淆,首先需要識別出全部真實(shí)塊,即包含原始操作的塊。在實(shí)際工程應(yīng)用中,大多數(shù)為定制化的O-LLVM混淆器,此前文獻(xiàn)[10,20]的反混淆研究均不能適用。此時被混淆函數(shù)的控制流程圖已不再具備相關(guān)規(guī)律,可能出現(xiàn)多個主分發(fā)器或者缺失預(yù)分發(fā)器,導(dǎo)致原真實(shí)塊識別算法無法正常工作。為了兼容定制化O-LLVM混淆器,結(jié)合多指令集架構(gòu)在IDA microcode的特性,將混淆后的控制流結(jié)構(gòu)分為以下5類基本塊,如圖2所示。

      圖2 被混淆函數(shù)的控制流程

      1) 序言:包含函數(shù)中大部分常量以及控制流混淆中的平坦化變量的初始化操作。平坦化變量是O-LLVM添加的決定控制流走向的變量,相當(dāng)于switch語句中的變量表達(dá)式。

      2) 主分發(fā)器:序言的后繼塊且入度最大,通常將入度最大作為識別特征。

      3) 子分發(fā)器:尾指令為某個平坦化常量與平坦化變量的條件跳轉(zhuǎn)。平坦化常量是指O-LLVM分配的多個隨機(jī)常量,相當(dāng)于switch語句中case的常量表達(dá)式。

      4) 返回塊:唯一一個出度為0的基本塊。

      5) 真實(shí)塊:除以上外,其余為真實(shí)塊。通常先更新平坦化變量,再無條件跳轉(zhuǎn)到分發(fā)器,之后進(jìn)入下一輪的switch選擇結(jié)構(gòu)中。

      在5類基本塊識別過程中,最難識別且最關(guān)鍵的是真實(shí)塊。當(dāng)全部的真實(shí)塊未被完全識別時,會導(dǎo)致反混淆的結(jié)果語義不一致;當(dāng)分發(fā)器被錯誤識別為真實(shí)塊時,則不能達(dá)到預(yù)期的反混淆效果。另外,在一些定制化的混淆器中,真實(shí)塊之間會出現(xiàn)復(fù)用的情況,也需要精準(zhǔn)地判斷其是否為真實(shí)塊,以供后續(xù)進(jìn)行分割處理。因此,提出了一種針對定制化混淆的真實(shí)塊識別算法。

      算法1真實(shí)塊識別算法

      輸入:dispatch主分發(fā)器,block_to_key真實(shí)塊與平坦化常量映射表

      輸出:真實(shí)塊列表

      /*遞歸識別后繼的真實(shí)塊*/

      function RecRealBlock(blk_no,dispatch,result)

      for disp_succ in get_mblock(blk_no).succset do

      if disp_succ == dispatch then

      continue

      else

      if disp_succ not in result then

      result.append(disp_succ)

      RecRealBlock(disp_succ,dispatch,result)

      end if

      end for

      end function

      /*獲取所有真實(shí)塊*/

      function Get_RealBlocks(dispatch,block_to_key)

      RealBlocks = []

      for block in block_to_key do

      tmp_realblock = []

      RecRealBlock(block,dispatch,tmp_realblock)

      for rb in tmp_realblock do

      if rb not in RealBlocks then

      RealBlocks.append(rb)

      end if

      end for

      end for

      return RealBlocks

      end function

      上述真實(shí)塊識別算法的主要思想是借助規(guī)律性強(qiáng)、易識別的分發(fā)器逆推得到難以識別的真實(shí)塊。因此先準(zhǔn)確地識別全部分發(fā)器,進(jìn)而確定真實(shí)塊、真實(shí)塊與平坦化常量的映射關(guān)系,供后續(xù)控制流恢復(fù)使用。在真實(shí)塊識別前,需要先從序言中提取平坦化變量,再確定主分發(fā)器的位置。具體操作流程如下:

      1) 確定平坦化變量。若序言中存在mov指令的源操作數(shù)為常量類型,目的操作數(shù)為堆棧變量類型,則記錄目的操作數(shù)。被混淆函數(shù)的控制流程圖具有圖2的一般規(guī)律,平坦化變量會多次出現(xiàn)在子分發(fā)器的條件跳轉(zhuǎn)指令中,且滿足的條件跳轉(zhuǎn)指令只有jz與jnz。因此,掃描整個函數(shù)的jz與jnz指令,當(dāng)滿足右操作數(shù)為常量類型,左操作數(shù)為堆棧變量類型時,記錄左操作數(shù)。之后篩選出現(xiàn)最多的堆棧變量,即為平坦化變量,且該變量應(yīng)存在于序言中。最后根據(jù)平坦化變量可快速準(zhǔn)確地定位子分發(fā)器。特別地,在一些定制化的混淆器中,平坦化變量會賦值到中間變量,導(dǎo)致其未出現(xiàn)在序言中,此時可引入污點(diǎn)分析技術(shù)解決該問題。

      2) 建立平坦化常量與真實(shí)塊的映射。掃描子分發(fā)器的條件跳轉(zhuǎn)指令,當(dāng)操作碼是jz時,平坦化常量為右操作數(shù),與之對應(yīng)的真實(shí)塊為目的操作數(shù);當(dāng)操作碼是jnz時,平坦化常量為右操作數(shù),與之對應(yīng)的真實(shí)塊為該子分發(fā)器的另一個后繼塊。

      3) 遞歸識別真實(shí)塊。通常第2步得到的真實(shí)塊并不完整。如圖2所示,Block7可由Block2計算得到,但Block8與Block9未被識別。因此在算法1中,遍歷已知的真實(shí)塊的全部后繼塊,使用遞歸算法完整且準(zhǔn)確地識別其余真實(shí)塊。

      2.2 復(fù)用塊分割

      在一些定制化的混淆器或者編譯優(yōu)化后的程序中,還會遇到更加復(fù)雜的情況,如真實(shí)塊被復(fù)用等。被復(fù)用的真實(shí)塊可能出現(xiàn)在任意位置,這對反混淆操作目標(biāo)為匯編指令的方案是致命的。因?yàn)樵谝粋€二進(jìn)制文件中不能隨意添加新指令,同時在匯編指令級別準(zhǔn)確識別真實(shí)塊是一件困難的事情。

      如圖3所示,真實(shí)塊被復(fù)用的情況通常可以分為2大類:無分支的單個真實(shí)塊和有分支的一組真實(shí)塊。實(shí)際上,以上2大類還會組合出更多樣、更復(fù)雜的復(fù)用情況。在第一種情況中,A、B兩組真實(shí)塊共用一個真實(shí)塊。該被復(fù)用的真實(shí)塊一般主要負(fù)責(zé)更新平坦化變量,而此時將存在3種不同的平坦化常量影響平坦化變量的取值,最終決定控制流程所到達(dá)的下一組真實(shí)塊。同理,在第二種情況中,平坦化變量將存在最多4種不同的取值。

      圖3 真實(shí)塊復(fù)用示例

      如圖4所示,在真實(shí)塊被復(fù)用時,最終理想的還原效果是將復(fù)用塊拷貝多次,并修復(fù)指向主分發(fā)器的無條件跳轉(zhuǎn)指令目的操作數(shù)為真實(shí)目標(biāo)真實(shí)塊。但在實(shí)際操作中,真實(shí)塊的復(fù)用情況還會更加復(fù)雜,不僅需要制定新的控制流重建規(guī)則,還要創(chuàng)建大量真實(shí)塊、維護(hù)真實(shí)塊之間的流程關(guān)系。由于復(fù)用塊出現(xiàn)的位置不確定性,基于上述規(guī)則的匹配拆分處理是困難的。針對該難題,提出了一種被復(fù)用的真實(shí)塊分割算法。

      圖4 復(fù)用塊分割效果

      算法2復(fù)用塊分割算法

      輸入:dispatch主分發(fā)器, RealBlocks真實(shí)塊列表

      輸出:分割后的真實(shí)塊

      for rb in RealBlocks.GetRepeatBlocks() do

      blk ← get_mblock(rb)

      for pred_num in blk.predset do

      if pred_num != blk.serial - 1 then

      p_blk←get_mblock(pred_num)

      if is_mcode_jcond(blk.tail.opcode) then

      /*處理有條件分支塊*/

      Split_JCCBlk(blk,p_blk,dispatch)

      else

      while blk.succ(0) != dispatch do

      /*拷貝并追加指令*/

      Copy_AppendMinsns(blk,p_blk)

      blk←get_mblock(blk.succ(0))

      end while

      Copy_AppendMinsns(blk,p_blk)

      /*修復(fù)Goto指令*/

      ChangeGoto(p_blk, p_blk.succ(0))

      p_blk.mark_lists_dirty()

      end if

      end if

      end for

      end for

      在算法2中,核心思想是復(fù)制并重組被復(fù)用的真實(shí)塊,這得益于準(zhǔn)確的真實(shí)塊識別,否則分發(fā)器會干擾分割效果。當(dāng)分割操作完成后,程序流程回歸常規(guī)情況,兼容了常規(guī)反混淆流程,在降低控制流重建難度的同時,提升了反混淆的準(zhǔn)確率。

      2.3 控制流重建

      根據(jù)真實(shí)塊更新的平坦化變量值和映射表重建控制流程。在常規(guī)的控制流重建階段,需要考慮以下2種情況:

      1) 真實(shí)塊無分支:如圖2中Block4所示,真實(shí)塊Block4不存在條件分支。由Block4的尾指令開始向上掃描mov指令,當(dāng)源操作數(shù)為常量類型且目的操作數(shù)為平坦化變量時,該源操作數(shù)即為當(dāng)前真實(shí)塊的平坦化常量。最后修改Block4的尾部goto指令,將無條件跳轉(zhuǎn)目標(biāo)更新為映射表中對應(yīng)的編號。

      2) 真實(shí)塊有分支:如圖2中Block7、8、9所示,真實(shí)塊Block7存在條件分支會影響到Block9中平坦化變量的賦值情況,因此Block8與Block9的跳轉(zhuǎn)目標(biāo)不同。于是將Block9的指令復(fù)制到Block8的尾部,接著與無分支的操作類似。如圖5所示,由映射表計算出真實(shí)目標(biāo)基本塊塊號,并修復(fù)goto指令目的操作數(shù)為該塊號,即可完成重建。

      圖5 有條件分支重建

      3 實(shí)驗(yàn)評估與對比分析

      選取 C/C++經(jīng)典混淆基準(zhǔn)[23]和公開的高危安全漏洞作為數(shù)據(jù)集,采用控制流程圖相似度、語義等價、偽代碼相似度作為評估指標(biāo),對提出的BinDeob進(jìn)行實(shí)驗(yàn)評估。最后從反混淆操作語言、指令集架構(gòu)支持、對抗反符號執(zhí)行、對抗反模擬執(zhí)行、對抗定制化混淆、恢復(fù)函數(shù)偽代碼、平均CFG相似度7個方面,將BinDeob與Yadegari[5]、BARF[20]、DiANa[10]、SATURN[14]反混淆框架進(jìn)行對比分析。

      3.1 實(shí)驗(yàn)環(huán)境

      測試環(huán)境為LLVM-8.0.1、NDK 21.1.6352462、Visual Studio 2019、IDA pro 7.5 Service Pack 3及O-LLVM反混淆框架BinDeob。計算機(jī)配置為Windows 10 20H2、Intel?CoreTMi7-9750H CPU @ 2.60 GHz、RAM 32 GiB。

      3.2 數(shù)據(jù)集

      為了全面評估BinDeob的有效性,選取2個構(gòu)建覆蓋率高的可靠開源數(shù)據(jù)集。

      1)C/C++經(jīng)典混淆基準(zhǔn):C/C++混淆基準(zhǔn)被廣泛應(yīng)用于混淆器及反混淆系統(tǒng)的評估,包括常見的基礎(chǔ)算法、哈希函數(shù)和小型程序(包含IF,WHILE和FOR語句的組合)。使用其中的98個基準(zhǔn)程序,同時又將每個程序編譯為arm32、arm64、x86、x64四種架構(gòu)的可執(zhí)行文件,最后從多個指標(biāo)評估BinDeob的有效性。

      2) 公開的高危安全漏洞:選取較有代表性的Microsoft Windows本地提權(quán)漏洞 (CVE-2021-1732)[24],可以更嚴(yán)格評估BinDeob對抗真實(shí)威脅的有效性。該漏洞由微軟公司披露于2021年2月,影響多種不同版本的Windows系統(tǒng)。普通權(quán)限的應(yīng)用程序可利用該漏洞提升至System權(quán)限,被官方評為高危漏洞。

      3.3 評估指標(biāo)

      評估指標(biāo)采用控制流程圖相似度、語義等價、偽代碼相似度。

      1) 控制流程圖(control flow graph,簡稱CFG)相似度。CFG相似度被廣泛用作混淆與反混淆評估的標(biāo)準(zhǔn)[5,10,14,25-26]。采用Hu等[28]提出的算法計算2個CFG之間的相似度,文獻(xiàn)[29]證明該算法是最好的CFG比較算法之一。給定2個控制流程圖G1和G2,此算法使用最大二分匹配來計算G1與G2的頂點(diǎn)之間的對應(yīng)關(guān)系。設(shè)σ(G1,G2)為2個控制流圖G1與G2之間的編輯距離,|Ni|是Gi的節(jié)點(diǎn)數(shù),|Ei|是Gi的邊數(shù),則相似度計算式為

      (1)

      相似度為介于0和1之間的實(shí)數(shù),數(shù)值1說明這2個圖形是完全相同的,而數(shù)值0說明它們是完全不同的。

      2) 語義等價(semantic equivalence,簡稱SE)。語義等價評估指標(biāo)與文獻(xiàn)[10]相同,只計算CFG相似度不足以證明反混淆后的函數(shù),在語義上與原始函數(shù)等效[10]。給定反混淆后的偽代碼以不同的輸入并獲取輸出結(jié)果,最后與源代碼同等操作下的結(jié)果進(jìn)行比較。

      3) 偽代碼相似度(pseudocode similarity,簡稱PCS)。引入偽代碼相似度作為重要的評估指標(biāo)之一。在逆向工程中,靜態(tài)分析二進(jìn)制文件最快最好的辦法是用IDA強(qiáng)大的反編譯功能將匯編指令轉(zhuǎn)換為偽代碼。因此,不論使用哪種反混淆方案,在真實(shí)的逆向場景中都會將反混淆結(jié)果轉(zhuǎn)換成偽代碼。通過引入反混淆后的偽代碼與原始源代碼得到相似度,可以直觀反映反混淆效果。但是該指標(biāo)過于苛刻,因?yàn)榧词共唤?jīng)過混淆,由匯編指令反編譯得到的偽代碼也會與原始源代碼存在差距。在對比了多個代碼相似度比對工具后發(fā)現(xiàn),即使變量名稱發(fā)生更改,源代碼克隆檢測工具CCFindeX[27]仍可準(zhǔn)確提取并計算代碼相似度,因此選用CCFinderX計算偽代碼相似度。該工具最初是由Toshiro Kamiya開發(fā),并在論文中介紹和證明了其有效性[30],它是對先前工具CCFinder的優(yōu)化版本。

      3.4 評估C、C++經(jīng)典混淆基準(zhǔn)

      如表1、2所示,“Sim1”列表示混淆后函數(shù)CFG與原始函數(shù)CFG之間的相似度,“Sim2”列表示反混淆后函數(shù)CFG與原始函數(shù)CFG之間的相似度。實(shí)驗(yàn)結(jié)果表明,反混淆后平均CFG相似度約為0.989,語義等價平均為100%。

      表1 BinDeob在C、C++數(shù)據(jù)集的反混淆結(jié)果(ARM32 ARM64)

      表2 BinDeob在C、C++數(shù)據(jù)集的反混淆結(jié)果(x86 x64)

      圖6為測試程序中的SelectSort函數(shù)在反混淆前后的CFG變化。原始函數(shù)僅有12個基本塊,但經(jīng)過混淆后基本塊數(shù)量暴漲至243個,同時,調(diào)用關(guān)系也變得十分混亂。對于被混淆的函數(shù),無論進(jìn)行靜態(tài)分析還是動態(tài)調(diào)試,逆向所花費(fèi)時間成本都將數(shù)十倍提升。如圖6(c)所示,經(jīng)過BinDeob處理后,基本塊數(shù)量又降至13個,且CFG與原始CFG幾乎一致。實(shí)際上,圖6(c)中5、13塊等價于圖6(a)中12塊,最終CFG相似度由0.085提升至0.966。另外如表3所示,Sim1列數(shù)據(jù)越小說明被混淆的函數(shù)越復(fù)雜,Sim2列數(shù)據(jù)越大則說明反混淆效果越顯著,對比結(jié)果表明,BinDeob在更加復(fù)雜的混淆情況下仍比DiANa的反混淆效果出眾。綜上所述,在ARM32、ARM64、x86、x64架構(gòu)中,BinDeob均能表現(xiàn)出色的反混淆效果。

      圖6 SelectSort函數(shù)CFG

      表3 DiANa與BinDeob在ARM32的對比結(jié)果

      3.5 評估公開的高危漏洞

      評估公開的高危系統(tǒng)漏洞樣本能最大程度反映BinDeob框架對抗實(shí)際威脅的能力。用開源的漏洞代碼[31]對該代碼中最重要的6個函數(shù)進(jìn)行實(shí)驗(yàn)評估。

      如表4所示,混淆后的平均CFG相似度為0.125,反混淆后的平均CFG相似度顯著提升為0.983,同時,原始源代碼與反混淆得到的偽代碼的相似度平均值為0.976。這說明BinDeob可以有效對抗實(shí)際威脅,尤其是對于要求非常高的偽代碼相似度指標(biāo),BinDeob仍能達(dá)到很好的效果。

      3.6 對比分析

      由表5可知,在指令集架構(gòu)支持、對抗定制化混淆、恢復(fù)函數(shù)偽代碼的對比中,BinDeob擁有絕對優(yōu)勢,而且平均CFG相似度優(yōu)于表5中的其余框架。另外,根據(jù)表4的實(shí)驗(yàn)數(shù)據(jù),反混淆后得到的平均偽代碼相似度高達(dá)97.6%,直觀反映了反混淆后偽代碼的可讀性和準(zhǔn)確性。這些都說明該反混淆框架比表5中其他幾個框架擁有更優(yōu)秀的反混淆性能。

      表4 CVE-2021-1732實(shí)驗(yàn)結(jié)果

      表5 反混淆性能對比結(jié)果

      4 結(jié)束語

      提出了一種基于IDA microcode的O-LLVM控制流反混淆框架BinDeob,通過針對定制化混淆的真實(shí)塊識別算法及復(fù)用塊分割算法重建嚴(yán)重混淆的控制流。目前,BinDeob可以很好地處理ARM32、ARM64、x86、x64架構(gòu)可執(zhí)行文件的O-LLVM控制流混淆。相對于參考文獻(xiàn)中提出的其他框架,BinDeob擁有多架構(gòu)支持、高擴(kuò)展性、高CFG還原度、靈活對抗定制化混淆等諸多優(yōu)勢。另外,由BinDeob反混淆得到的偽代碼與原始函數(shù)源代碼相似度高達(dá)97.6%,反混淆后與原始未混淆的程序流程圖相似度高達(dá)98.9%。這些都表明BinDeob相比其他框架具有更出色的性能。

      雖然在O-LLVM控制流反混淆中,BinDeob表現(xiàn)出色,但由于缺乏動態(tài)運(yùn)算功能,BinDeob僅適用于靜態(tài)分析的方案。在字符串加密、間接跳轉(zhuǎn)、指令虛擬化等混淆中,基于模擬執(zhí)行或符號執(zhí)行的動態(tài)分析方案占據(jù)主導(dǎo)地位。賦予BinDeob框架動態(tài)對抗能力是下一步的研究重點(diǎn)。

      猜你喜歡
      基本塊控制流常量
      科學(xué)照亮世界
      ——卡文迪什測定萬有引力常量
      基于級聯(lián)森林的控制流錯誤檢測優(yōu)化算法
      抵御控制流分析的Python 程序混淆算法
      距離與權(quán)重相結(jié)合的導(dǎo)向式灰盒模糊測試方法
      工控系統(tǒng)中PLC安全漏洞及控制流完整性研究
      電子科技(2021年2期)2021-01-08 02:25:58
      抵御控制流分析的程序混淆算法
      一種檢測控制流錯誤的多層分段標(biāo)簽方法
      低氧低分壓環(huán)境下泡塑吸附火焰原子吸收光譜法測定常量金
      西藏科技(2015年1期)2015-09-26 12:09:20
      基于控制流隱藏的代碼迷惑
      論常量函數(shù)的充分必要條件
      抚顺市| 铜梁县| 壶关县| 密云县| 逊克县| 安化县| 峨眉山市| 贵定县| 德格县| 甘孜县| 会同县| 泰安市| 如东县| 屯昌县| 从化市| 余姚市| 时尚| 搜索| 台南县| 阜南县| 旬邑县| 揭阳市| 德江县| 公安县| 盘山县| 田东县| 察隅县| 利辛县| 嘉禾县| 凤山市| 新安县| 建水县| 营山县| 昭觉县| 梨树县| 紫云| 溧阳市| 隆回县| 隆安县| 保康县| 洞口县|