1. 程式人生 > 其它 >帶你瞭解幾種二進位制程式碼相似度比較技術

帶你瞭解幾種二進位制程式碼相似度比較技術

摘要:二進位制分析技術通常被用來對應用進行安全審計、漏洞檢測等,通過分析學術界近20年發表的上百篇學術論文來分析二進位制程式碼相似度比較都有采用了哪些具體技術,二進位制程式碼相似度比較的技術挑戰是什麼,後續的研究方向是什麼,希望此文能給做這方面技術研究人做參考。

本文分享自華為雲社群《二進位制程式碼相似度比較研究技術彙總》,作者:安全技術猿 。

在對二進位制應用程式進行安全分析過程中,二進位制程式碼相似度比較技術是重要的技術手段之一,基於此技術,可以實現對惡意程式碼極其變種的追蹤,已知漏洞檢測、補丁存在性檢測。該技術基礎理論依據是如果原始碼中存在的屬性(惡意程式碼、已知漏洞、漏洞修復補丁)即使相同原始碼編譯出不同的二進位制程式碼(cpu架構、OS、編譯選項等會直接導致編譯出來的二進位制會存在較大的差別),這些屬性在二進位制程式碼中也是存在的(好像是廢話,不然編譯構建工具就有問題了)。因此若在一個樣本二進位制檔案中已知存在上述型別的屬性,如果發現另外一個待檢測二進位制程式碼和樣本二進位制程式碼相似,那麼可以認為待檢測二進位制程式碼也存在相同型別的屬性。

我們知道編譯生成二進位制程式碼的影響因素非常的多,同一套原始碼基於不同因素的組合可以生成非常多不同二進位制程式。

CPU架構:X86、ARM、MIPS、PPC、RISC-V;

架構位數:32bits、64bits;

OS:Linux、Windows、Android、鴻蒙、VxWork;

編譯選項:O0~O3;

安全編譯選項:BIND_NOW、NX、PIC、PIE、RELRO、SP、FS、Ftrapv等;

按這些選項可以有5x2x5x4x8 =1600個組合,從中可以看出二進位制程式碼相似度比較技術不管是學術界還是工業界來說都是一個挑戰技術。但是基於廣闊的應用前景,20多年來學術界一直在不停的探索和研究新的方法想來解決這個技術挑戰,並且也取得了一定的成果,下面就該方面的技術進行一些梳理,讓大家對二進位制程式碼相似度比較技術有一個大致的瞭解。

原始碼到二進位制程式碼的生成過程

從原始碼編譯生成二進位制過程中,有很多有助於理解程式碼意圖的資訊會被丟失,比如:函式名稱、變數名稱、資料結構定義、變數型別定義、註釋資訊等;因為二進位制程式碼是給CPU執行用的,因此這些資訊對計算機來說不是必須的,但這些資訊對人類來理解程式碼是有很大幫助的,這就大大的提升了二進位制程式碼語義理解的難度。其次,為了更好的保護二進位制程式碼的智慧財產權或最大程度的提升對二進位制程式碼的理解難度,還會對二進位制程式碼進行混淆處理,使得混淆後的二進位制程式碼與編譯器編譯出來的二進位制之間又存在很大的不同。

從歷史發表的二進位制程式碼相似度比較技術論文統計來看,有61種二進位制程式碼相似性比較方法,這些在不同研究場所發表的數百篇論文涵蓋了電腦保安、軟體工程、程式語言和機器學習等電腦科學領域,主要發表在IEEE S&P、ACM CCS、USENIX Security、NDSS、ACSAC、RAID、ESORICS、ASIACCS、DIMVA、ICSE、FSE、ISSTA、ASE、MSR等頂級刊物上。

根據上述論文得到如下統計資料:

輸入比較:一對一(21種)、一對多(30種)、多對多(10種);

比較方法:大多數方法使用單一型別的比較:相似性(42種)、等效性(5種)和相同(2種);即使方法中僅使用一種型別的比較,它也可能有不同的輸入比較不同;

分析粒度:分為輸入粒度、方法粒度;有8中不同的比較粒度,分別是指令級、基本快、函式以及相關集合、執行軌跡、程式。最常見的輸入粒度是函式(26個),然後是整個程式(25個)和相關的基本塊(4)。最常見的方法粒度是函式(30個),然後是基本塊(20);

語法相似性:通過語法方法來捕獲程式碼表示的相似性,更具體地說,它們比較指令序列。最常見的是序列中的指令在虛擬地址空間中是連續的,屬於同一函式。

語義相似性:語義相似性是指所比較的程式碼是否具有類似的效果,而語法相似性則是指程式碼表示中的相似性。其中有26種計算語義相似度的方法。它們中的大多數以基本塊粒度捕獲語義,因為基本塊是沒有控制流的直線程式碼。有三種方法用於捕獲語義:指令分類、輸入-輸出對和符號公式。

結構相似度:結構相似性計算二進位制程式碼的圖表示上的相似性。它位於句法和語義相似性之間,因為圖可以捕獲同一程式碼的多個句法表示,並可以用語義資訊註釋。結構相似性可以在不同的圖上計算。常見的有控制流圖CFG、過程間控制流圖ICFG、呼叫圖CG;(子)圖同構—大多數結構相似性方法是檢查圖同構的變化,其中涉及到方法有K子圖匹配、路徑相似性、圖嵌入。

基於特徵的相似度:計算相似性的常見方法(28種)是將一段二進位制程式碼表示為向量或一組特徵,使得類似的二進位制程式碼具有相似的特徵向量或特徵集。這裡應用最多的是利用機器學習來實現。

Hash匹配相似度:對於多維向量資料相似度快速匹配,通常使用區域性敏感hash演算法LSH來實現。

跨架構比較方法:對不同CPU架構二進位制程式碼的相似度比較,通常跨體系結構方法通過計算語義相似性來實現。方法之一是通過轉換成與架構無關的中間語言IR來處理(7種),另外一種是使用基於特徵的相似性方法(9種)。

分析型別:從分析型別來看有:靜態分析、動態分析、資料流分析3種類型;

歸一化方法:語法相似性方法通常會對指令進行規範化,來儘量減少語法上的差異;有33種方法使用指令規範化。具體的包括運算元移除法、運算元歸一化法、助記符歸一化法。

論文發表的時間、發表刊物、技術方法彙總

不同二進位制程式碼相似度比較方法的具體應用情況

從上表中可以看出二進位制程式碼相似度比較主要應用於漏洞查詢,其次是補丁分析惡意程式碼分析

針對上述不同的技術方法,分別從魯棒性、準確度評估與比較、效能指標3個維度進行評測,結果如下:

總結:

二進位制程式碼相似性比較技術隨著研究的持續進行,學術界雖然取得的一定的進步和成果,但仍然還有很多挑戰在等著攻克,小片段的二進位制程式碼比較,原始碼與二進位制的相似度比較、資料相似度比較、語義關係、可擴充套件性、混淆、比較方法等等都是後續需要持續研究的方向。

參考文獻:

《A Survey of Binary Code Similarity》

可以試試下面的漏掃服務,看看系統是否存在安全風險:>>>漏洞掃描服務

點選關注,第一時間瞭解華為雲新鮮技術~