亚洲日本免费-啊轻点灬太粗太长了三男一女-麻豆av电影在线观看-日韩一级片毛片|www.grbbt.com

Wikileaks公布的CIA“Marble”框架分析

作者:ADLab

CIA泄漏仍在持續(xù)發(fā)酵中,維基解密正在持續(xù)放出越來越多的資料來展示CIA武器庫的威力。最近維基解密公布了CIA的代碼混淆框架Marble,該框架通過選擇的算法對代碼中的字符串進(jìn)行重新編碼,用以增加代碼的分析難度。這套代碼不僅僅可以混淆英文字符串,還可以混淆包括中文、俄文、韓語、阿拉伯語等多種語言。

Marble由4部分組成:Mibster、Mender、Validator、Marbles,其中Marbles是加密算法池,程序會從其中眾多算法中選擇一種算法來對字符串進(jìn)行加密。

Marble概述

Marble框架如下圖,當(dāng)一個項(xiàng)目想要用Marble進(jìn)行混淆時,可以在編譯該項(xiàng)目時對項(xiàng)目的預(yù)先生成事件和后期生成事件進(jìn)行設(shè)置,在編譯之前預(yù)先生成事件啟動,會調(diào)用mibster從算法池中選擇一種算法對項(xiàng)目中的字符串進(jìn)行加工,并生成一個recepit供Validator程序進(jìn)行驗(yàn)證,在項(xiàng)目編譯好之后,后期生成事件啟動,該事件會調(diào)用Mender來還原混淆的代碼。當(dāng)這一切做完之后可以使用Validator程序?qū)ι傻腂inary進(jìn)行驗(yàn)證。

1

Mibster的實(shí)現(xiàn)

首先我們來看整個框架最主要的程序Mibster,其主要流程為:

  • 從算法池中選擇混淆算法。
  • 保存源文件并生成混淆后的文件。
  • 生成xml報告。

Mibster邏輯實(shí)現(xiàn)流程如下:

2

1選擇算法

Mibster首先會通過函數(shù)“ChooseMarble”來從算法池中選擇一種算法,在文件“Marble.h”中保存著算法的集合。文件“Marble.h”如下圖共支持100多種算法:

3

函數(shù)“ChooseMarble”分為兩種情況來選擇算法。

  • 隨機(jī)選擇。所有算法引用前都被“//”注釋。首先會遍歷算法池中所有的算法,然后使用結(jié)構(gòu)“OPTION_NODE”把所有的算法做成一個鏈表,然后隨機(jī)在鏈表中選擇一個算法作為混淆算法。
  • 自定義算法。存在沒有被“//”注釋的算法引用。直接選擇這個沒有被注釋的算法作為混淆算法并保存算法信息到局部變量“pChosenNode”中。

函數(shù)“ChooseMarble”中算法選擇邏輯如下:

4

在函數(shù)“ChooseMarble”中會判斷局部變量“pChosenNode”是否被賦值,來判斷有無自定義混淆算法。

4

在選擇好混淆算法后通過調(diào)用函數(shù)“SetScrambler”來初始化算法類。在函數(shù)“SetScrambler”中通過字符串比較尋找要初始化的對象。如下圖:

6

2生成混淆文件

算法初始化完成后調(diào)用函數(shù)“GenerateModifiedFiles”來生成混淆的文件。函數(shù)函數(shù)“GenerateModifiedFiles”首先會遞歸遍歷目標(biāo)文件夾(需要混淆的工程),然后尋找.c、.cpp和.h擴(kuò)展名的文件。找到源碼文件后調(diào)用函數(shù)“ProcessFile”對文件做混淆運(yùn)算。具體流程如下:

如果在遍歷過程中遇到了文件夾,則遞歸調(diào)用此函數(shù)。

7

如果是文件的話,觀察其后綴名,程序的混淆對象是c和c++的工程,如果屬于這種工程的代碼,則進(jìn)行混淆,并排除所有匹配“Marble.*”文件。

8

在找到符合規(guī)則的文件后調(diào)用函數(shù)“ProcessFile”對文件進(jìn)行混淆。這個函數(shù)會搜索文件中所有包含“ARBLE”的關(guān)鍵字,來尋找要混淆的字符串。

關(guān)鍵字“ARBLE”其實(shí)是CIA自定義的一種數(shù)據(jù)類型的后綴。這個類型的聲明在文件“Marble.h”中。

9

函數(shù)“ProcessFile”中尋找到關(guān)鍵字“ARBLE”后會判斷關(guān)鍵字前面一個字符來判斷是否是自定義的數(shù)據(jù)類型。只有自定義的“WARBLE”和“CARBLE”數(shù)據(jù)類型中的值才會被混淆,而“BARBLE”則未處理。

10

函數(shù)“ProcessFile”使用 “EDG”的庫函數(shù)“MISCMemorySearch_NSS::FindIndexOfSequenceInMemory”來尋找關(guān)鍵字。

11

當(dāng)在被混淆程序的代碼中找到一個需要被混淆的字符串定義后,就將這個字符串加入到一個待混淆字符串列表中,并繼續(xù)尋找下一個待混淆字符串。

同時,我們還會對被混淆的源文件生成一個后綴名為.Marble的副本用于后續(xù)處理。

12

之后,對待混淆字符串列表做循環(huán)。

13

While循環(huán)中首先定位每個待混淆字符串的內(nèi)容并賦值給pNode。

14

15

接著程序會根據(jù)開始選擇的算法對字符串進(jìn)行加密處理,并將其保存到一塊臨時內(nèi)存中。

16

17

當(dāng)沒有需要加密的字符串時,再將這塊臨時內(nèi)存寫回文件。

18

這就是整個混淆文件生成過程。加密前后數(shù)據(jù)對比。混淆前:

19

混淆后:

20

混淆后的文件中寫入了反混淆算法和密鑰,使用這個字符串時會通過解密算法還原出字符串的內(nèi)容然后再使用。

3生成報告

當(dāng)所有的混淆工作都完成后會使用函數(shù)“GenerateReceipt”生成xml格式的混淆報告。這個文件保存在設(shè)置的輸出目錄中,文件名為“MarbleReceipt.xml”。

在這個文件中記錄了混淆的算法、被混淆的文件和被混淆的字符串等信息。

21

Mender和Validator

Mender程序是專門用于將混淆后的源代碼還原用的程序,該程序在還原過程中使用到了mibster生成的*.Marble文件,其做法是遍歷被混淆的目標(biāo)工程文件夾,當(dāng)遇到*.Marble文件時,就將其中的全部內(nèi)容拷貝給相應(yīng)的被混淆的文件。

22

Validator是Marble框架中用來檢測混淆是否被正確使用的程序,該程序用mibster產(chǎn)生的receipt來驗(yàn)證混淆的字符串是否正確的被生成到Binary中。其過程也并不復(fù)雜,首先通過msxml16庫來讀取receipt中的信息(主要是OriginalHex,即被混淆的字符串的hex信息),并將其處理后賦值給描述字符串的節(jié)點(diǎn)中并鏈入鏈表。

23

接著讀取生成的文件,并循環(huán)遍歷字符串鏈表,看鏈表中的每一條字符串是否都出現(xiàn)在了生成文件中。

24

總結(jié)

CIA的“Marble”只是靜態(tài)的對指定字符串做了簡單的混淆,在研究人員做靜態(tài)分析的時候會加大分析人員的工作量。在動態(tài)分析的時候由于會調(diào)用解密函數(shù)所以作用不是很大。雖然算法池中算法很多,但是加密強(qiáng)度不高,調(diào)用解密函數(shù)可以較容易還原出原文。

上一篇:詳解CVE-2017-0199:Microsoft Office RTF 漏洞

下一篇:啟明星辰ADLab勒索軟件專題報告(上篇)