《電子技術應用》
您所在的位置:首頁 > 通信與網(wǎng)絡 > 設計應用 > 基于靜態(tài)二進制分析的工控協(xié)議逆向解析
基于靜態(tài)二進制分析的工控協(xié)議逆向解析
2018年電子技術應用第3期
魏 驍,,劉仁輝,,許鳳凱
華北計算機系統(tǒng)工程研究所,北京100083
摘要: 針對傳統(tǒng)的協(xié)議解析方法在工業(yè)控制系統(tǒng)中的局限性,,提出了一種適用于工業(yè)控制系統(tǒng)通信協(xié)議的協(xié)議逆向分析方法。該方法的算法思想來源于動態(tài)污點算法,,算法實現(xiàn)基于靜態(tài)二進制分析平臺IDA Pro及其提供的軟件開發(fā)接口,,解析結果可直接為模糊測試提供語義參考。該算法包括預處理,、交叉引用分析,、協(xié)議幀重構和語義提取等步驟,具有針對性強,、通用性好的特點,。將算法實現(xiàn)后應用于某組態(tài)軟件,能夠得到正確的分析結果,,證明了該方法的正確性與有效性,。
中圖分類號: TP309
文獻標識碼: 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.

Reverse analysis of industrial control protocol based on static binary analysis
Wei Xiao,,Liu Renhui,Xu Fengkai
National Computer System Engineering Research Institute of China,,Beijing 100083,,China
Abstract: In view of the limitation of traditional protocol analysis method in industrial control system, this paper proposes a new protocol reverse analysis method suitable for industrial control system communication protocol. The idea of this algorithm is derived from the dynamic taint algorithm, the algorithm is based on the static binary analysis platform IDA Pro and its software development interface. The algorithm includes preprocessing, cross reference analysis, protocol frame reconstruction and semantic extraction and so on. When the algorithm is applied to a configuration software, the correct analysis results can be obtained, and this proved the correctness and the effectiveness of the method.
Key words : industrial control system,;protocol reverse;static analysis,;cross reference,;blot algorithm

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所示,。

jsj4-t1.gif

    當今的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所示,。

jsj4-t2.gif

2 文件掃描模塊

    掃描模塊的掃描目標是組態(tài)軟件等運行于通用計算機的工控軟件,。通常,工控軟件體積較為龐大,,由眾多功能模塊構成,,但協(xié)議分析只需要其中的通信模塊,對ICS軟件的所有功能模塊執(zhí)行協(xié)議解析算法不但會增加時間開銷,,也會降低分析的準確度,。掃描模塊的主要作用就是定位協(xié)議分析的對象,為協(xié)議分析模塊過濾掉與通信無關的操作,。

    文件掃描子模塊有兩種實現(xiàn)方式,,一種是遠程掃描,掃描進程運行于測試平臺,,通過遠程讀取工程師站或操作員站上的ICS軟件可執(zhí)行文件并進行分析來實現(xiàn)過濾操作,;另一種是以硬件插卡的方式通過USB接口在工控機本地執(zhí)行掃描進程,并收集掃描結果反饋給測試平臺,。這兩種實現(xiàn)方式的區(qū)別在于掃描進程的運行位置不同,,遠程掃描對工控機沒有性能影響,但需要工控機打開文件訪問權限,;本地掃描在掃描過程中可能會占用一定的CPU時間,,但不需要額外的權限,,其具體差異如表1所示。

jsj4-b1.gif

    以上兩種實現(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é)議分析方法無法做到的。

jsj4-t3.gif

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,。

jsj4-b2.gif

    (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所示。

jsj4-t4.gif

    函數(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ù)賦值操作,。

jsj4-t5.gif

    幀重構的算法流程如下:

    (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所示,。

jsj4-t6.gif

    另外,,在對某DCS系統(tǒng)進行滲透測試的項目中,本協(xié)議解析系統(tǒng)作為協(xié)議健壯性測試平臺的一個模塊,,為模糊測試模塊提供了參考,。模糊測試模塊以協(xié)議解析系統(tǒng)的輸出作為輸入,根據(jù)解析結果,,針對此DCS系統(tǒng)的應用層協(xié)議生成了80組測試用例,,在測試過程中多次造成了目標系統(tǒng)的通信異常,證明了該方法的實用性,。模糊測試結果示例如圖7所示,,圖中的曲線為系統(tǒng)心跳幀攜帶的正弦數(shù)據(jù)流,測試開始后可明顯觀測到心跳幀發(fā)生中斷和錯序,。

jsj4-t7.gif

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)

此內(nèi)容為AET網(wǎng)站原創(chuàng),,未經(jīng)授權禁止轉(zhuǎn)載。