DataCon2020 惡意代碼分析冠軍 writeup
1 賽題回顧
2 最終排名(部分)
3 啟發與思路
4 算法與模型
4.5 函數名(CG圖)
4.6 復賽模型融合
4.4.1 Section信息
4.4.2 字符匹配
4.4.3 Yara匹配
4.4.4 Opcode
4.4.5 其他布爾信息
4.1 灰度圖
4.2 直方圖
4.3 PE靜態特征模型
4.4 特征工程
5 結果與改進
5.1 復賽結果
5.2 改進方向
6 后記
7 參考資料
1 賽題回顧
【比賽官網】:datacon.qianxin.com
2070年,GY市將舉辦冬季奧運會,將會吸引了全球100多個國家的運動員、政要、眾多媒體齊聚。冬季奧運會將會成為很多國際網絡恐怖組織、黑客組織的關注目標,安全形勢十分嚴峻。為了保證冬季奧運會的順利舉行,大會組委會成立了”重保小組“,針對全市重點單位、會議相關單位網站、系統進行護網攻防演練。小組將根據攻防演練的流量數據,分析并處置可能存在的各種安全威脅,保證大會的順利進行。假設您是”重保小組“的成員,請您結合攻防演練的流量數據,溯源分析處置各類的安全事件,同時幫助大會及時準確地找出可能存在的安全威脅。
【方向五】:惡意代碼分析
賽事期間各類體育賽事一票難求,暗網中出現了很多高價倒賣門票的不法行為,一度使得虛擬貨幣市場交易十分火爆,挖礦型惡意代碼的數量也呈爆發式增長,不少個人用戶、企業用戶受到感染,淪為免費礦工。為對抗挖礦木馬,需要針對近期互聯網上流行的惡意軟件進行深入分析,研究并設計挖礦型惡意代碼的檢測方法,保衛廣大用戶的財產安全!
【考察能力】:系統安全相關知識、程序分析與特征提取能力(如逆向分析或機器學習算法)
【方向介紹】
冬奧會期間各類體育賽事一票難求,暗網中出現了很多高價倒賣門票的不法行為,一度使得虛擬貨幣市場交易十分火爆,挖礦型惡意代碼的數量也呈爆發式增長,不少個人用戶、企業用戶受到感染,淪為免費礦工。為對抗挖礦木馬,需要針對近期互聯網上流行的惡意軟件進行深入分析,研究并設計挖礦型惡意代碼的檢測方法,保衛廣大用戶的財產安全!
2 最終排名(部分)
本次比賽我們戰隊在惡意代碼分析方向獲得初賽第三,復賽第一的成績,最終為**該方向冠軍**。

3 啟發與思路
- 挖礦軟件常見套路[1]

資格賽中獲得的啟發
①~②:需要關注虛擬機、調試軟件、反編譯軟件、逆向分析工具和殺軟名
③~⑤:需要關注系統關鍵路徑、注冊表
⑥~⑦:需要關注域名、IP、端口、錢包地址、可見字符串
⑧
⑩:同③⑤逆向工程中得到的思路
通過逆向分析,發現許多樣本函數名包含數據貨幣名、密碼學算法名(哈希算法)
- 很多帶殼樣本:UPX、Pelite、VMP……

- 白樣本含有很多其他類別惡意程序,如病毒、外掛……

4 算法與模型
本次初賽、附加賽與復賽我們隊使用的五種算法或模型相關代碼見文末**閱****讀全文**,思路如下(其中在復賽中因為有性能的需求,部分模型未使用):
4.1 灰度圖
PE文件二進制每一個字節對應一個像素,最后縮放成固定大小的灰度圖。這是最常見也容易實現的模型,在惡意代碼檢測中已經廣泛使用。
但我們僅在初賽時使用,原因如下:
文件大小差異較大,縮放比例不一致。
給定的樣本集中包含許多加殼樣本,使得數據分布被打亂,黑白特征不明顯。
預處理時間較長。
4.2 直方圖
這也是除了灰度圖外一種不需要解析PE文件格式來進行提取學習的特征方法,我們主要使用兩類直方圖:
字節直方圖:
統計字節0-255出現個數
字節熵直方圖[2]:
滑動一個1024字節的窗口,步長為256字節
計算每個1024字節窗口的熵
統計滑動窗口的(字節,熵值)對,最后轉換成1x256維的特征向量

最后連接這兩個特征向量,使用深度學習模型學習。效果好,預處理快,初賽單用這個模型便拿到93.8425分。
4.3 PE靜態特征模型
雖然提供的樣本被抹掉了樣本PE結構中的MZ、PE、導入導出表等信息,但我們只需要恢復MZ頭和”PE\0\0”即可使用常規的分析工具對PE樣本進行分析。
因為恢復也只是能解析PE文件的靜態格式和特征,并不能將其直接運行,所以只能從靜態特征入手。最后我們使用的是著名EMBER數據集[3]提到的PE文件靜態特征提取方法。雖然原文用于檢測惡意Windows PE文件,但是我們也將其移植過來檢測挖礦軟件。
原始方法提取了許多PE文件靜態特征,如下:
[?] ByteHistogram、ByteEntropyHistogram:直方圖
[?] GeneralFileInfo:調試信息、TLS段、重定位信息……
[?] HeaderFileInfo:PE頭基本所有信息
[?] ExportsInfo:導出表個數、名稱
[?] SectionInfo:Section名、大小、熵、屬性等……
[×] ImportsInfo:導入表被破壞,無法解析導入函數信息
[×] StringExtractor:字符串提取在特征工程里做,這里刪掉一是為了節省時間,二是防止特征重疊
4.4 特征工程
我們隊所用特征工程主要包括五部分,分別為:Section信息、字符匹配、Yara匹配、Opcode和其他布爾信息。
4.4.1 Section信息
節區特征是PE文件一種重要特征,過多的節區、異常的節區名、異常的資源節區個數等指標都可以指示這個PE文件的可疑程度,因此我們首先針對節區進行特征統計:
OEP所在節區名長度
OEP所在節區名一般為”.text”,如果過長或過短說明很可能被混淆
比如UPX殼OEP處節區名為”UPX1”
各可讀、可寫、可執行節區大小和熵,和各屬性節區占文件大小比例
舉例:如果可執行節區占比過小,很可能加殼了(壓縮殼)
資源節區個數
資源節區一般藏又一些壓縮數據,比如挖礦惡意載荷
節區總個數
惡意軟件節區數一般比較多
# OEP處section名長度
4.4.2 字符匹配
根據資格賽獲得的啟發,隊員們手寫相應的正則匹配模式,其中包括:
路徑、注冊表、URL、IP地址正則匹配
其中因為注冊表正則模式存在回溯問題,有的樣本存在特別長的字符串,導致一個樣本可能匹配了八分鐘,所以我們復賽簡單粗暴改成匹配字符串”reg”。
主要原因是我們認為操作注冊表必然存在相應函數,而這些函數名基本含有”reg”。
比特幣錢包地址正則匹配
主要寫了三種貨幣:
比特幣、萊特幣、門羅幣
一些重要字符串匹配
”MZ”、”PE”指示可能含別的PE文件
”pool”、”cpu”、”gpu”、”coin”則是我們認為挖礦軟件普遍存在的字符串
self.path_pattern = re.compile(b'[C-Zc-z]:(?:(?:\\\\|/)[^\\\\/:*?"<>|"\x00-\x19\x7f-\xff]+)+(?:\\\\|/)?')
4.4.3 Yara匹配
Yara規則是基于二進制文件中包含的文本或二進制字符串的描述創建的。我們首先使用Yara-Rules[4]提供的規則進行匹配,其中包括:
殼規則
包含許多已知殼的Yara匹配規則
密碼學常量規則
特別是哈希算法初始值
匹配時間略長,復賽忍痛舍棄
最后我們還使用了yarGen[5]工具,提取訓練集黑樣本特征,其原理是先解析出樣本集中的共同的字符串,然后經過白名單庫的過濾,最后通過啟發式、機器學習等方式篩選出最優的Yara規則。
根據得到的Yara規則集結果,選擇匹配度大于某一閾值的規則形成新的規則集,查看匹配黑白樣本的分布比例,篩選部分白樣本規則。
通過不斷的調整閾值參數與篩除比例,在盡可能泛化的同時匹配到更多的黑樣本,最后人工結合挖礦特征篩選出更值得關注的部分,優化規則集。
最終得到的自定義Yara規則集閾值為20,即每條規則在訓練集黑樣本中匹配樣本個數大于等于20。
4.4.4 Opcode
通過傳統逆向工具解析PE文件中的函數實在太耗時,因此我們打算通過簡單的正則搜索識別代碼中的函數,然后提取函數片段中的Opcode并保存。例如x86下,按棧匹配”push ebp; mov ebp, esp; ……; ret”如下代碼段所示。
self.m32_pat = re.compile(b'\x55\x8b\xec[^\xc3]*\xc3')
原因是發現在挖礦樣本中有大量樣本間共有的opcode特征,而白樣本中卻不明顯。因此可以統計匹配出的函數個數、opcode種類個數、平均值、方差等特征。
4.4.5 其他布爾信息
根據資格賽所提供的啟發,我們還收集了各種類別的進程名、數字貨幣名、密碼學算法名等信息,以檢測它們是否在給定PE文件內。
我們搜集了常見的殺毒軟件的進程名稱[6],以此作為挖礦軟件對殺毒軟件的檢測行為的特征。
考慮到挖礦軟件需要反分析、反調試來保證持久化,我們還以常見的調試器進程名作為挖礦軟件的反調試行為的特征,主要為我們日常使用的調試工具。
考慮到挖礦軟件會進行反沙箱對抗,我們搭建了各種不同的虛擬機軟件環境,整理了挖礦軟件可能檢測的虛擬機環境特征。
由于挖礦過程必然存在礦池,因此我們想到檢測礦池二級域名[7]來作為挖礦軟件的一個有效特征,于是編寫了爬蟲腳本通過正則匹配的方式爬取了目前常用的礦池域名300余條。
4.5 函數名(CG圖)
借鑒一篇論文[8]的思路,處理流程如下:
IDA Pro提取函數調用生成GDL(Graph Description Language)文件
GDL文件包含函數名(結點)、調用關系(邊),如下述代碼段
這樣可以對函數調用次數進行排序,作為一種序列信息進行訓練
graph: {
初賽使用效果不錯,復賽因IDA Pro耗時過長放棄。
4.6 復賽模型融合
這方面我們隊員涉獵較少,可能選擇的模型和融合的方式還有改進的空間,歡迎各位看客交流學習。
5 結果與改進
5.1 復賽預測結果
在判分前主辦方提供了1k個測試樣本,我們使用這1k個樣本進行檢驗與測試,最終耗時大約為1min20s,得分為95.52分。
因此預估判分用的1w多個樣本耗時在20min上下,扣掉0.2分后與最終的95.38十分接近,證明了我們所用方法泛化能力以及穩定性。
5.2 改進方向
特征工程中我們提取的Opcode序列僅用了統計特征,我們也可以將其當作一種序列信息,使用NLP方法訓練學習。
提供的樣本中還是含有很多加殼樣本的,因此我們可以對Yara匹配出的加殼樣本進行單獨處理。
特征工程的完善,例如:
任務計劃名: Drivers、WebServers、DnsScan
Powershell、Vbs腳本
端口,特別是高端口(>10000)
……
6 后記
戰隊所在的信工所六室威脅情報與威脅發現團隊主要針對在線流量、落地樣本(載荷)、安全日志、威脅情報等網絡空間典型威脅數據進行分析,研究威脅情報智能處理、對抗性惡意代碼分析、可疑網絡/終端行為檢測挖掘的技術與系統,培養具備高級威脅對抗分析技能的人才。同時,團隊還建設和運營了國家網絡空間威脅情報共享開放平臺CNTIC(公眾號cntic2017), 研制了大規模惡意代碼智能分析平臺iMAS 以及網絡惡意通信檢測系統,均已應用于國家有關部門和地區的實際工作中。我們歡迎有識之士(學生或員工)加入,聯系方式jiangzhengwei#iie.ac.cn。
7 參考資料
挖礦軟件常見套路
Deep Neural Network Based Malware Detection Using Two Dimensional Binary Program Features
EMBER: An Open Dataset for Training Static PE Malware Machine Learning Models
Yara-Rules / rules
Neo23x0 / yarGen
BrownFly / findAV
Mining Pools Live Monitoring Tools
DeepCG: Classifying Metamorphic Malware Through Deep Learning of Call Graphs