文獻標識碼: A
DOI:10.16157/j.issn.0258-7998.171175
中文引用格式: 魏驍,劉仁輝,,許鳳凱. 基于靜態(tài)二進制分析的工控協(xié)議逆向解析[J].電子技術應用,,2018,44(3):126-130.
英文引用格式: Wei Xiao,,Liu Renhui,,Xu Fengkai. Reverse analysis of industrial control protocol based on static binary analysis[J]. Application of Electronic Technique,2018,,44(3):126-130.
0 引言
工業(yè)控制系統(tǒng)(Industrial Control Systems,ICS)是工業(yè)生產(chǎn)的基礎,,ICS的安全直接關系到經(jīng)濟,、社會發(fā)展的穩(wěn)定和國家安全。與其他計算機系統(tǒng)不同,,工業(yè)控制系統(tǒng)中存在著大量的私有非標準非公開協(xié)議[1],,而通信協(xié)議作為工控設備間信息交互的基礎,其安全性是工控系統(tǒng)安全的重要組成部分,,研究工控協(xié)議解析技術對提高工業(yè)控制系統(tǒng)安全性具有重要意義,。
傳統(tǒng)的協(xié)議逆向分析方法需要耗費大量的時間和人力。目前,,協(xié)議自動化逆向解析領域主要有兩種方法:一種是基于網(wǎng)絡報文序列分析的方法,,另一種是基于程序執(zhí)行軌跡的方法?;诰W(wǎng)絡報文序列分析的方法對于文本協(xié)議處理效果比較好,,但是缺乏針對性對協(xié)議的語義分析[2],尤其在面對工業(yè)控制環(huán)境中普遍存在的多層封裝的應用層協(xié)議時有些力不從心,;而基于執(zhí)行軌跡方法以動態(tài)二進制程序分析為基礎,包括Polyglot,、AutoFormat,、Tupni、Prospex等方法,,這些方法要求樣本的覆蓋率,,需要對程序反復地運行調(diào)試[3],但調(diào)試過程中對代碼的直接修改嚴重破壞了工控系統(tǒng)的穩(wěn)定性,,雖然這種方法解析結果更為準確,,但并不適合工業(yè)控制系統(tǒng)要求高穩(wěn)定、高實時的實際情況,。
針對以上問題,,本文提出了一種基于靜態(tài)二進制分析的工控協(xié)議解析方法,此方法以只讀的方式訪問二進制文件,,既能獲取協(xié)議語義,,又能保證不破壞工控系統(tǒng)的穩(wěn)定性。分析的結果除提供協(xié)議信息以外,,還可以在通信協(xié)議健壯性測試平臺中作為fuzzing測試模塊的輸入,,解決普通的fuzzing系統(tǒng)在面對私有協(xié)議時無法有針對性地構造測試樣本的問題,。
1 總體設計
本文將此工控協(xié)議解析方法作為工業(yè)控制系統(tǒng)健壯性測試平臺的一個子系統(tǒng)來加以介紹,協(xié)議健壯性測試平臺結構如圖1所示,。
當今的ICS中越來越廣泛地使用了基于x86平臺的Windows操作系統(tǒng),,故本文中的方法在實現(xiàn)時主要針對Windows操作系統(tǒng),反匯編引擎使用Hex-Rays公司的IDA Pro,。IDA Pro是一款強大的靜態(tài)二進制分析工具,,能夠提供功能豐富的IDC函數(shù)庫(IDA Pro的一種原生腳本語言)和軟件開發(fā)包(Software Development Kit,SDK)[4],。
協(xié)議解析子系統(tǒng)主要包括以下子模塊:文件掃描子模塊,、協(xié)議提取子模塊和格式化處理子模塊。其中,,協(xié)議解析模塊包括數(shù)據(jù)預處理階段,、交叉引用分析階段、協(xié)議幀重構階段,、語義提取階段,;格式化處理模塊的輸出既可以作為測試平臺模糊測試模塊的輸入,為模糊測試樣本數(shù)據(jù)的構造提供參考,,又可以作為測試平臺交互模塊的輸入,,為用戶提供圖形化的結果展現(xiàn)。協(xié)議解析模塊的子模塊結構如圖2所示,。
2 文件掃描模塊
掃描模塊的掃描目標是組態(tài)軟件等運行于通用計算機的工控軟件,。通常,工控軟件體積較為龐大,,由眾多功能模塊構成,,但協(xié)議分析只需要其中的通信模塊,對ICS軟件的所有功能模塊執(zhí)行協(xié)議解析算法不但會增加時間開銷,,也會降低分析的準確度,。掃描模塊的主要作用就是定位協(xié)議分析的對象,為協(xié)議分析模塊過濾掉與通信無關的操作,。
文件掃描子模塊有兩種實現(xiàn)方式,,一種是遠程掃描,掃描進程運行于測試平臺,,通過遠程讀取工程師站或操作員站上的ICS軟件可執(zhí)行文件并進行分析來實現(xiàn)過濾操作,;另一種是以硬件插卡的方式通過USB接口在工控機本地執(zhí)行掃描進程,并收集掃描結果反饋給測試平臺,。這兩種實現(xiàn)方式的區(qū)別在于掃描進程的運行位置不同,,遠程掃描對工控機沒有性能影響,但需要工控機打開文件訪問權限,;本地掃描在掃描過程中可能會占用一定的CPU時間,,但不需要額外的權限,,其具體差異如表1所示。
以上兩種實現(xiàn)方法在算法本質(zhì)上是沒有區(qū)別的,,都是通過讀取動態(tài)鏈接庫(Dynami Link Library,,DLL)文件的導入表和導入函數(shù)表來查找和預測DLL涉及到的操作。一般來講,,涉及到TCP協(xié)議通信則需要導入WS2_32.dll中的send和recv函數(shù),,UDP協(xié)議則需要導入WS2_32.dll中的sendto和recvfrom函數(shù)[5],通過掃描模塊搜索到的某協(xié)議通信模塊的導入表以及導入函數(shù)如圖3所示,。另外,,通過掃描并過濾WriteFile等系統(tǒng)調(diào)用還可以找到ICS軟件自己封裝的一些發(fā)包和封包函數(shù),通過這些函數(shù)還可以解析那些不基于TCP/IP的工控協(xié)議,,如基于COM串口的工控協(xié)議,,這是基于網(wǎng)絡流量的協(xié)議分析方法無法做到的。
3 協(xié)議提取模塊
協(xié)議解析模塊基于IDA Pro的IDC腳本和SDK來實現(xiàn),,以IDA腳本或IDA插件的形式提供協(xié)議解析服務,。
3.1 數(shù)據(jù)預處理
ICS使用的軟件種類繁雜,在實現(xiàn)結構上也是千差萬別,,有些廠商在設計軟件時并沒有嚴格地遵循模塊化設計的原則,,軟件通信模塊沒有獨立地封裝在DLL中,而是與其他的功能代碼混雜在一起放入DLL,,甚至分散在多個DLL中,。數(shù)據(jù)預處理針對這種情況,通過讀取IDA Pro反匯編后的匯編代碼,,對DLL中的函數(shù)進行標記處理,,剔除與通信過程無關的函數(shù)。對于無法確定的函數(shù),,則選擇保留處理,。
篩選算法同時使用兩種標準,,第一種標準的依據(jù)是向上的代碼交叉引用,,利用了函數(shù)調(diào)用的層次結構;第二種標準的思想源自于動態(tài)二進制逆向分析中常用的污點算法,,經(jīng)過修改后基于數(shù)據(jù)交叉引用實現(xiàn),,用于此處的靜態(tài)二進制分析場景[6]。
定義 二元組f(N,,F(xiàn))表示DLL中的一個函數(shù),,其中,N為函數(shù)名,,F(xiàn)為標記,,取值從UNKNOW,、STAY、DELETE中枚舉,。
篩選算法的基本流程如下:
(1)將目標DLL中的函數(shù)(包括DllMain,、導出函數(shù)和內(nèi)部函數(shù))f加入到函數(shù)集合S中初始的標記F均為DELETE。
(2)使用第一種標準,,以發(fā)送,、接收數(shù)據(jù)包的函數(shù)地址為底層起點,使用IDC函數(shù)Rfirst和Rnext訪問其所有的引用函數(shù)fn(N,,F(xiàn)),,并將fn(N,F(xiàn))的標記F置為STAY,。
(3)迭代執(zhí)行步驟(2),,直至所有引用了起點函數(shù)的函數(shù)標記均被置為STAY。
(4)使用第二種標準,,以步驟(2)中底層函數(shù)的參數(shù)中使用的內(nèi)存緩沖區(qū)為污點源,,逆序搜索被標記為污點的內(nèi)存區(qū)域的訪問位置,如果有fn(N,,F(xiàn))中引用了污點內(nèi)存區(qū)域,,則將fn(N,F(xiàn))的標記F置為STAY,;如果代碼中存在以污點內(nèi)存為左值的賦值操作,,則將作為右值的內(nèi)存區(qū)域也標記為污點內(nèi)存,并記錄污點傳播的關系,,系統(tǒng)為S中的每個fn(N,,F(xiàn))維護一個污點關系數(shù)據(jù)結構func_pollut,數(shù)據(jù)結構內(nèi)容如表2所示,;如果函數(shù)fn(N,,F(xiàn))沒有顯示地引用污點內(nèi)存區(qū)域且其引用的其他內(nèi)存位置無法直接判斷是否與污點內(nèi)存有關,則將fn(N,,F(xiàn))的標記F置為UNKNOW,。
(5)迭代執(zhí)行步驟(4)。枚舉集合S中的函數(shù),,刪除所有標記F為DELETE的函數(shù)元素,,此時的集合S則為待處理的目標集合。
3.2 交叉引用分析
從軟件逆向工程的角度來看,,被不同的上層函數(shù)引用次數(shù)越多的底層函數(shù)通用性越好,,封裝程度越高,在設計協(xié)議封裝和解析的軟件模塊中,則往往表現(xiàn)為在函數(shù)中處理了某一類通用性較強的幀結構,,比如攜帶數(shù)據(jù)載荷的幀和心跳幀,;而被不同的上層函數(shù)引用次數(shù)較少,甚至僅在某一處有過引用的函數(shù),,在協(xié)議封裝和解析的軟件模塊中往往完成一些連接建立,、通信對端認證等控制類的操作,這一類幀屬于控制幀,。
協(xié)議解析系統(tǒng)在交叉引用分析階段的主要工作是調(diào)用IDC函數(shù)獲取交叉引用信息并將信息歸類存儲在數(shù)據(jù)結構func_info中,,某協(xié)議的函數(shù)依賴關系如圖4所示。通過對獲得的引用數(shù)據(jù)進行統(tǒng)計來推斷函數(shù)類型,,并將推斷結果作為協(xié)議幀分類階段的輸入,。結構func_info的內(nèi)容如表2所示。
函數(shù)類型推斷使用的分界值與協(xié)議的復雜度有關,,一般來說,,與控制幀相關的函數(shù)與底層函數(shù)間的距離短,被調(diào)用的次數(shù)少,,調(diào)用底層函數(shù)的次數(shù)多,。經(jīng)過實驗對比,具體的分界點取值為距底層函數(shù)的距離為2,、被調(diào)用次數(shù)為1,、調(diào)用底層函數(shù)次數(shù)為3~5時,系統(tǒng)具有較高準確度,,系統(tǒng)在此處預留配置接口,,用戶可以根據(jù)協(xié)議復雜度指定分界點取值。另外,,通過IDA Pro自帶的WinGraph32應用程序系統(tǒng)可以獲得較為直觀的函數(shù)依賴圖形,,依賴圖直接作為模塊的一項輸出結果呈現(xiàn)給用戶,用戶可以根據(jù)自己的判斷為系統(tǒng)指定重點分析的模塊或校正系統(tǒng)的推測結果,,提高解析精準度,。
3.3 協(xié)議幀重構
協(xié)議幀重構階段以前兩個階段中獲得的函數(shù)依賴關系和對函數(shù)類型的推定為參考,判斷函數(shù)代碼特征,,對目標協(xié)議中存在的幀進行重構與分類,。算法中涉及到的函數(shù)代碼特征主要包括距底層函數(shù)的距離是否為1、是否存在較多的幻數(shù)賦值操作,、是否定長等,。一個典型的控制幀組幀操作如圖5所示,,可以看到明顯存在較多的幻數(shù)賦值操作,。
幀重構的算法流程如下:
(1)將幀集合A初始化為空集,將函數(shù)集合S中標記F為STAY和UNKNOW的函數(shù)按照上一階段獲取的func_info結構的route_len域值升序排列,存儲到順序表D中,。
(2)從順序表D中取出一個函數(shù)fn(N,,F(xiàn)),如果fn(N,,F(xiàn))的函數(shù)距為1,,檢查底層函數(shù)調(diào)用參數(shù),并在本函數(shù)的代碼中檢索緩沖區(qū)長度參數(shù)的數(shù)據(jù)引用,,如果緩沖區(qū)長度為定值,,且該值與集合A中所有定長幀的幀長都不相同,則創(chuàng)建一個定長幀,,幀長度為緩沖區(qū)長度,,并將該幀加入到集合A中。
(3)如果步驟(2)中無法確定緩沖區(qū)長度為定值,,則創(chuàng)建一個不定長幀,,將該幀加入到集合A中。
(4)針對步驟(2)或步驟(3)中新加的幀,,從底層函數(shù)調(diào)用地址處向上檢索代碼,,直至函數(shù)頭或另一次底層函數(shù)調(diào)用,對所有的幻數(shù)賦值操作,,直接將字段長度和幻數(shù)值記錄到新加的幀的對應結構中,;對于變量賦值操作,記錄字段長度后字段值暫時以符號代替,。統(tǒng)計幻數(shù)賦值數(shù)量H和變量賦值數(shù)量B,,如果H>2B,則將此幀標記為控制幀,,否則標記為數(shù)據(jù)幀,。
(5)如果fn(N,F(xiàn))的函數(shù)距不為1,,檢索函數(shù)代碼,,記錄所有的對污點內(nèi)存區(qū)塊的幻數(shù)賦值操作,檢索完畢后訪問其func_pollut結構,,通過污染源所在的函數(shù)編號在集合A中檢索對應的幀結構,,并以幻數(shù)值替代幀結構中相應位置的符號。
(6)重復執(zhí)行步驟(2),,直到順序表D中的所有函數(shù)均被訪問,。
算法執(zhí)行完畢后,集合A中的幀即是經(jīng)過初步構造后的協(xié)議幀,,此時的幀結構記錄了初步字段結構和常量字段值,。
3.4 語義提取
協(xié)議的語義信息主要包括分隔符,、關鍵字、校驗域,、長度域,、指示域等,通過檢索處理協(xié)議幀的字段的二進制代碼是否存在相關的特征,,可以提取到協(xié)議幀的語義信息[7],。例如:校驗域通常伴隨著大量的移位運算;關鍵字和分隔符會涉及到常量賦值操作,,它們的主要區(qū)別在于關鍵字通常為一般數(shù)據(jù),,分隔符的值通常可以映射成ASCII表中的的特定字符,;長度域也會涉及到常量賦值操作,,但對于同一類幀結構來說,不同的調(diào)用點常量值一般不同,。
對于一些無法提取比較顯著的特征的代碼段,,系統(tǒng)選擇的策略是直接提取相關的二進制代碼,轉(zhuǎn)儲到文件后在數(shù)據(jù)結構中記錄該二進制代碼段與對應的協(xié)議字段的關聯(lián)關系,。
3.5 格式化處理
以上過程處理得到的協(xié)議格式有可能存在冗余,,同一種變長幀由于個別字段值不同而被記錄為兩種或多種幀,另外,,幀之間的邏輯關系信息也不完整,。在格式化處理模塊,系統(tǒng)通過比對集合中幀的已知語義來實現(xiàn)去冗余,,不定長幀之間雖然長度和某些字段值不完全相同,,但只要通過語義對比發(fā)現(xiàn)已知語義重復率超過閥值,就判定兩種幀應是同一種幀,,對二者執(zhí)行合并操作,。
最后,系統(tǒng)通過對集合中的幀進行格式化處理,,將協(xié)議信息以一種標準的格式輸出到結果文件,。模糊測試模塊通過讀取文件獲取協(xié)議的幀結構和語義等信息,并針對協(xié)議結構構造測試用例,。
4 實驗與分析
協(xié)議解析系統(tǒng)的主體部分,、語義提取和格式化處理通過C語言實現(xiàn),數(shù)據(jù)預處理和交叉引用分析通過IDC腳本實現(xiàn),,協(xié)議幀重構通過C語言調(diào)用IDA Pro SDK實現(xiàn),。
在實驗中,將獨立實現(xiàn)的系統(tǒng)應用于分析組態(tài)王軟件提供的某私有協(xié)議的驅(qū)動程序,,成功獲取了部分協(xié)議格式,,利用得到的協(xié)議格式可以實現(xiàn)與設備的簡單互通,,證明了方法的正確性和有效性。經(jīng)解析,,該協(xié)議在連接建立時考慮了協(xié)議版本的識別,實驗分析得到的協(xié)議幀如圖6所示,。
另外,,在對某DCS系統(tǒng)進行滲透測試的項目中,本協(xié)議解析系統(tǒng)作為協(xié)議健壯性測試平臺的一個模塊,,為模糊測試模塊提供了參考,。模糊測試模塊以協(xié)議解析系統(tǒng)的輸出作為輸入,根據(jù)解析結果,,針對此DCS系統(tǒng)的應用層協(xié)議生成了80組測試用例,,在測試過程中多次造成了目標系統(tǒng)的通信異常,證明了該方法的實用性,。模糊測試結果示例如圖7所示,,圖中的曲線為系統(tǒng)心跳幀攜帶的正弦數(shù)據(jù)流,測試開始后可明顯觀測到心跳幀發(fā)生中斷和錯序,。
5 結束語
本文介紹了一種通信協(xié)議逆向解析方法,,該方法結合靜態(tài)二進制代碼分析工具,將動態(tài)污點算法思想應用于靜態(tài)二進制分析過程,,實現(xiàn)了對工控協(xié)議的逆向解析并為模糊測試提供了參考,,實驗結果證明了方法的有效性。該方法具有對被測系統(tǒng)影響小,、針對性較強的特點,,適用于工業(yè)控制環(huán)境,具有較強的實用價值,。
參考文獻
[1] 吳禮發(fā),,洪征,潘璠.網(wǎng)絡協(xié)議逆向分析及應用[M].北京:國防工業(yè)出版社,,2016.
[2] 羅杰.基于動態(tài)二進制分析的網(wǎng)絡協(xié)議逆向方法研究[D].武漢:華中科技大學,,2014.
[3] 何永君.基于動態(tài)二進制分析平臺的協(xié)議逆向解析技術研究[D].鄭州:解放軍信息工程大學,2010.
[4] EAGLE C.The IDA Pro book: The unofficial guide to the world’s most popular disassembler second edition[M].No Starch Press,,2010.
[5] CUI W,,PEINADO M,CHEN K,,et al.Tupni:automatic reverse engineering of input formats[C].ACM Conference on Computer and Communications Security.ACM,,2008:391-402.
[6] 劉豫,聶眉寧,,蘇璞睿,,等.基于可回溯動態(tài)污點分析的攻擊特征生成方法[J].通信學報,,2012,33(5):21-28.
[7] 潘璠.基于高階屬性文法的協(xié)議逆向關鍵技術研究[D].南京:解放軍理工大學,,2013.
作者信息:
魏 驍,,劉仁輝,許鳳凱
(華北計算機系統(tǒng)工程研究所,,北京100083)