尹小康,劉鎏,劉龍,劉勝利
PPC和MIPS指令集下二進(jìn)制代碼中函數(shù)參數(shù)個(gè)數(shù)的識(shí)別方法
尹小康,劉鎏,劉龍,劉勝利
(數(shù)學(xué)工程與先進(jìn)計(jì)算國家重點(diǎn)實(shí)驗(yàn)室,河南 鄭州 450001)
函數(shù)參數(shù)個(gè)數(shù)的識(shí)別有助于函數(shù)原型的恢復(fù),是進(jìn)行數(shù)據(jù)流分析以及其他安全分析的基礎(chǔ)。為了提高對(duì)函數(shù)參數(shù)個(gè)數(shù)識(shí)別的準(zhǔn)確率,提出一種依據(jù)函數(shù)調(diào)用關(guān)系的投票機(jī)制來確定函數(shù)參數(shù)個(gè)數(shù)的算法—— Findargs。Findargs從PPC和MIPS指令集的函數(shù)調(diào)用特點(diǎn)出發(fā),利用函數(shù)調(diào)用關(guān)系和參數(shù)傳遞分析,識(shí)別函數(shù)參數(shù)的個(gè)數(shù),為函數(shù)原型的恢復(fù)提供幫助。為了評(píng)估Findargs的識(shí)別效果,選取大型的二進(jìn)制文件進(jìn)行了測(cè)試,并與radare2進(jìn)行了對(duì)比。實(shí)驗(yàn)結(jié)果表明,F(xiàn)indargs具有更高的準(zhǔn)確率。對(duì)于PPC指令集,其準(zhǔn)確率達(dá)到90.3%;對(duì)于MIPS指令集,其準(zhǔn)確率為86%。
靜態(tài)分析;函數(shù)調(diào)用分析;參數(shù)個(gè)數(shù)識(shí)別;投票機(jī)制
二進(jìn)制分析在安全研究中具有重大意義,在安全分析中的應(yīng)用主要有:二進(jìn)制代碼審計(jì)[1]、控制流完整性分析[2]、污點(diǎn)分析[3-4]、符號(hào)執(zhí)行[5-6]、漏洞修復(fù)[7]、代碼重用[8]、漏洞挖掘[9-11]等。在高級(jí)語言中,函數(shù)名、函數(shù)的參數(shù)個(gè)數(shù)、參數(shù)類型、函數(shù)的返回值等信息能夠有效幫助理解函數(shù)的功能。源代碼經(jīng)過編譯器編譯丟失了如高級(jí)語言C/C++中的數(shù)據(jù)類型、數(shù)據(jù)結(jié)構(gòu)、語義以及控制結(jié)構(gòu)等信息,這給研究者分析二進(jìn)制代碼造成了諸多障礙。因此,如何從二進(jìn)制代碼中恢復(fù)出丟失的信息成為二進(jìn)制分析的關(guān)鍵。對(duì)二進(jìn)制程序進(jìn)行逆向分析的第一步是對(duì)函數(shù)的識(shí)別,確定函數(shù)的起始位置、結(jié)束位置、函數(shù)的調(diào)用方式,以及函數(shù)的參數(shù)個(gè)數(shù)。二進(jìn)制代碼逆向分析的準(zhǔn)確率影響后續(xù)安全分析的正確性。
函數(shù)參數(shù)個(gè)數(shù)的準(zhǔn)確識(shí)別是進(jìn)行函數(shù)原型識(shí)別的基礎(chǔ),是進(jìn)行數(shù)據(jù)流分析以及其他安全分析的前提。由于精簡過的二進(jìn)制程序中的符號(hào)表等信息被移除,無法直接獲得函數(shù)入口等相關(guān)信息[12],增加了對(duì)二進(jìn)制可執(zhí)行文件進(jìn)行分析的難度。Caballero等[13]提出了X86指令集下基于動(dòng)態(tài)分析的二進(jìn)制函數(shù)接口識(shí)別方法。在無源代碼和符號(hào)表的情況下,該方法對(duì)二進(jìn)制代碼進(jìn)行動(dòng)態(tài)分析,獲取函數(shù)的原型,以達(dá)到重用二進(jìn)制函數(shù)的目的。由于動(dòng)態(tài)分析無法獲取全面的信息,因此識(shí)別效果較差。radare2[14]是最新的二進(jìn)制分析工具,它擁有強(qiáng)大的分析功能,支持對(duì)不同架構(gòu)語言的反匯編,在“aaa”命令中實(shí)現(xiàn)了對(duì)二進(jìn)制函數(shù)分析的功能,在對(duì)PPC和MIPS指令集的二進(jìn)制函數(shù)進(jìn)行分析時(shí),發(fā)現(xiàn)函數(shù)參數(shù)個(gè)數(shù)的識(shí)別效果比較差。
為提高函數(shù)參數(shù)個(gè)數(shù)的識(shí)別準(zhǔn)確率,本文提出并實(shí)現(xiàn)了一種基于函數(shù)調(diào)用關(guān)系的函數(shù)參數(shù)個(gè)數(shù)識(shí)別算法——Findargs,用于識(shí)別PPC和MIPS指令集下二進(jìn)制可執(zhí)行代碼中函數(shù)的參數(shù)個(gè)數(shù)。該方法結(jié)合PPC和MIPS指令集下函數(shù)參數(shù)的傳遞規(guī)則,通過分析函數(shù)調(diào)用時(shí)寄存器以及棧的使用情況,獲取二進(jìn)制函數(shù)的參數(shù)個(gè)數(shù)。為了提高識(shí)別的準(zhǔn)確率,F(xiàn)indargs分析獲得所有的函數(shù)調(diào)用關(guān)系,然后對(duì)每個(gè)函數(shù)的調(diào)用者進(jìn)行了分析,并通過投票機(jī)制,選取最有可能的參數(shù)個(gè)數(shù)。Findargs適用于對(duì)大型固件的分析,并且函數(shù)被調(diào)用的次數(shù)越多,準(zhǔn)確率越高。本文的主要工作如下。
1) 分析了函數(shù)參數(shù)識(shí)別的問題,并提出了二進(jìn)制可執(zhí)行代碼中二進(jìn)制函數(shù)參數(shù)個(gè)數(shù)識(shí)別的概念。
2) 提出并實(shí)現(xiàn)了基于函數(shù)調(diào)用關(guān)系的函數(shù)參數(shù)個(gè)數(shù)識(shí)別算法——Findargs。Findargs使用靜態(tài)分析的方法,無須動(dòng)態(tài)執(zhí)行二進(jìn)制文件,適用性較好。
3) 選取大型的嵌入式系統(tǒng)固件,對(duì)該算法進(jìn)行了評(píng)估,并與現(xiàn)有的二進(jìn)制分析工具radare2進(jìn)行了對(duì)比。實(shí)驗(yàn)結(jié)果表明,F(xiàn)indargs具有更高的準(zhǔn)確率。
二進(jìn)制函數(shù)是在二進(jìn)制可執(zhí)行文件中,通過函數(shù)識(shí)別技術(shù)識(shí)別出具有函數(shù)入口和出口的代碼片段。與高級(jí)語言中的函數(shù)類似,二進(jìn)制函數(shù)同樣具有函數(shù)名、函數(shù)參數(shù)、函數(shù)返回值等。
參數(shù)傳遞指令序列是在函數(shù)調(diào)用指令前用于傳遞函數(shù)參數(shù)等信息的一段代碼片段。
函數(shù)參數(shù)個(gè)數(shù)識(shí)別的目的是識(shí)別二進(jìn)制函數(shù)中函數(shù)傳遞參數(shù)的個(gè)數(shù),用于分析在二進(jìn)制函數(shù)調(diào)用時(shí)參數(shù)的傳遞情況,進(jìn)而分析程序的數(shù)據(jù)流的傳遞情況。
函數(shù)參數(shù)的傳遞一般有3種方式[16]:棧傳遞、寄存器傳遞與全局變量進(jìn)行隱式參數(shù)傳遞。通過棧傳遞參數(shù),需要對(duì)參數(shù)的入棧順序進(jìn)行約定,并對(duì)棧的平衡方式進(jìn)行約定,最終確定由調(diào)用者還是被調(diào)用者來恢復(fù)棧平衡。對(duì)于使用寄存器傳遞參數(shù)來說,同樣需要確定哪些寄存器用于傳遞參數(shù),以及參數(shù)傳遞的順序,并且需要確定當(dāng)參數(shù)個(gè)數(shù)大于可用于傳遞參數(shù)的寄存器數(shù)時(shí),如何進(jìn)行參數(shù)傳遞。對(duì)于全局變量進(jìn)行隱式參數(shù)傳遞來說,通過設(shè)置全局變量來共享變量,在一個(gè)函數(shù)內(nèi)對(duì)該變量的修改會(huì)影響其他函數(shù)中該變量的值。對(duì)于使用全局變量進(jìn)行隱式參數(shù)傳遞,需要進(jìn)行數(shù)據(jù)流分析,才能從二進(jìn)制可執(zhí)行代碼中識(shí)別出全局變量。
函數(shù)參數(shù)調(diào)用中常用的調(diào)用約定共有4種:_cdecl(C規(guī)范)、pascal、stdcall與fastcall。表1詳細(xì)展示了各個(gè)調(diào)用約定的參數(shù)傳遞方式和傳遞順序以及平衡棧者。由表1可知,_cdecl、pascal、stdcall均使用棧進(jìn)行參數(shù)的傳遞,fastcall利用處理器中寄存器的優(yōu)勢(shì)使用寄存器和棧來傳遞參數(shù)。
表1 常見的函數(shù)調(diào)用約定
下面對(duì)常用的調(diào)用約定的參數(shù)傳遞方式進(jìn)行詳細(xì)介紹。
(1)使用棧傳遞參數(shù)
棧作為一種先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu)被廣泛地應(yīng)用。在調(diào)用函數(shù)時(shí),通過將參數(shù)壓入棧中將參數(shù)傳遞給子程序。函數(shù)調(diào)用結(jié)束后,對(duì)棧進(jìn)行平衡操作,將?;謴?fù)到函數(shù)調(diào)用前的狀態(tài)。當(dāng)函數(shù)具有多個(gè)參數(shù)時(shí),需要對(duì)參數(shù)的傳遞順序進(jìn)行約定,以及確定由函數(shù)調(diào)用者或者子程序來恢復(fù)棧的平衡。當(dāng)函數(shù)具有多個(gè)參數(shù)時(shí),_cdecl和stdcall約定參數(shù)的傳遞順序采用由右至左的順序,pascal約定參數(shù)傳遞順序采用由左至右的順序。對(duì)于棧的平衡方式,_cdecl是調(diào)用者對(duì)棧進(jìn)行平衡,而pascal、stdcall和fastcall使用子程序?qū)_M(jìn)行平衡。圖1為利用棧進(jìn)行函數(shù)參數(shù)的傳遞,該參數(shù)傳遞方式是從右至左,首先將第二個(gè)參數(shù)壓入棧中,然后將第一個(gè)參數(shù)壓入棧中,在使用參數(shù)時(shí)通過ebp或者sp進(jìn)行尋址。
圖1 利用棧進(jìn)行函數(shù)參數(shù)傳遞
Figure 1 Function arguments passing with stack
(2)使用寄存器傳遞參數(shù)
使用寄存器進(jìn)行參數(shù)傳遞具有快速高效的特點(diǎn),尤其當(dāng)函數(shù)的參數(shù)個(gè)數(shù)較少時(shí),直接將參數(shù)放入寄存器中進(jìn)行讀取,減少了一定的內(nèi)存操作。處理器中擁有多個(gè)寄存器,可以選擇部分寄存器用于函數(shù)參數(shù)的傳遞。由表1可知,fastcall采用寄存器和棧進(jìn)行函數(shù)參數(shù)的傳遞。當(dāng)函數(shù)參數(shù)較少時(shí),直接使用寄存器傳遞參數(shù),當(dāng)函數(shù)參數(shù)超過可用參數(shù)寄存器時(shí),則將多余的參數(shù)通過棧來傳遞。使用棧傳遞參數(shù)時(shí),約定了參數(shù)的傳遞順序和棧平衡操作者。對(duì)于fastcall,參數(shù)的傳遞順序因編譯器的不同而不同,但都是通過子程序來平衡棧。
表2列舉了PPC和MIPS指令集中約定可用于傳遞參數(shù)的寄存器。在PPC指令集中,寄存器r3作為函數(shù)的第一個(gè)參數(shù),剩余的參數(shù)分別依次放入r4 ~ r10,由此可知,PPC指令集中可用寄存器最多傳遞8個(gè)參數(shù)。在MIPS指令集下,分別使用編號(hào)為4 ~ 7的寄存器來傳遞參數(shù),名稱分別為$a0 ~ $a3,因此,MIPS指令集下可通過寄存器來傳遞參數(shù)的個(gè)數(shù)最大為4,多余的參數(shù)需要通過棧進(jìn)行傳遞。
表2 PPC和MIPS指令集參數(shù)傳遞方式
下面以sub_801FDFA4和sub_600746B8函數(shù)參數(shù)的傳遞方式為例,具體分析PPC和MIPS指令集下函數(shù)參數(shù)的傳遞過程。在PPC指令下用于傳遞參數(shù)的寄存器為r3~r10,在調(diào)用函數(shù)sub_801FDFA4時(shí)使用了r3~r8寄存器,因此函數(shù)的參數(shù)個(gè)數(shù)為6。對(duì)于函數(shù)sub_600746B8,則為MIPS指令下的函數(shù),用于傳遞參數(shù)的寄存器為$a0~$a3,在調(diào)用函數(shù)sub_600746B8時(shí),在這段指令中使用了$a1, $a2, $a3寄存器以及進(jìn)行了兩壓?!皊w $v0, 0x40+var_30($sp)”和“sw $s2, 0x40+var_2C($sp)”。參數(shù)寄存器的使用具有以下事實(shí):參數(shù)寄存器是按照順序使用的,當(dāng)后一個(gè)寄存器用于傳遞參數(shù)時(shí),前一個(gè)寄存器必定用于傳遞參數(shù)??芍?a0也用于傳遞參數(shù),共有6個(gè)參數(shù)。PPC指令、MIPS指令下函數(shù)調(diào)用參數(shù)的傳遞分別如圖2、圖3所示。
圖2 PPC指令下函數(shù)調(diào)用參數(shù)的傳遞
Figure 2 Function arguments passing in PPC instruction
圖3 MIPS指令下函數(shù)參數(shù)調(diào)用的傳遞
Figure 3 Function arguments passing in MIPS instruction
圖4 函數(shù)參數(shù)識(shí)別算法——Findargs
Figure 4 Function argument identification algorithm—Findargs
本節(jié)對(duì)二進(jìn)制函數(shù)參數(shù)的識(shí)別算法進(jìn)行詳細(xì)介紹。二進(jìn)制可執(zhí)行文件的函數(shù)參數(shù)個(gè)數(shù)識(shí)別算法——Findargs的流程如圖4所示。
對(duì)函數(shù)邊界的識(shí)別是二進(jìn)制分析的基礎(chǔ),需采用的函數(shù)邊界識(shí)別方法是FRwithMBA[17],通過分析二進(jìn)制可執(zhí)行代碼,提取出函數(shù)的邊界,包括起始地址和結(jié)束地址,用于函數(shù)調(diào)用關(guān)系的分析。
函數(shù)調(diào)用關(guān)系的分析在二進(jìn)制逆向分析中具有重要作用,如用于惡意代碼分析[18]與分類[19]、計(jì)算代碼相似性[20-21]等,本文將函數(shù)的調(diào)用關(guān)系用于函數(shù)參數(shù)個(gè)數(shù)的識(shí)別。函數(shù)調(diào)用關(guān)系的分析是函數(shù)控制流圖生成以及研究數(shù)據(jù)流的基礎(chǔ),函數(shù)調(diào)用關(guān)系圖(FCG,function call graph)對(duì)理解大型程序有很大幫助,F(xiàn)CG反映了函數(shù)的結(jié)構(gòu)、可擴(kuò)展性等信息。
按照分析目標(biāo)的不同,函數(shù)調(diào)用關(guān)系的分析可以分為源碼層面和二進(jìn)制層面;按照分析方式的不同,函數(shù)調(diào)用關(guān)系分析可以分為靜態(tài)分析和動(dòng)態(tài)分析。靜態(tài)分析依賴于對(duì)目標(biāo)語言的理解水平,對(duì)目標(biāo)語言中的函數(shù)調(diào)用指令分析的全面性,能夠遍歷分析所有分支,但是無法獲取間接函數(shù)調(diào)用的關(guān)系。動(dòng)態(tài)分析是借助函數(shù)運(yùn)行時(shí)的信息進(jìn)行分析,在程序運(yùn)行時(shí),能夠獲得相對(duì)于靜態(tài)分析更多的信息,但是對(duì)于程序未執(zhí)行到的分支則無法進(jìn)行分析。本文主要研究的是使用靜態(tài)分析方式分析二進(jìn)制可執(zhí)行代碼中的函數(shù)調(diào)用關(guān)系,獲取比較全面的函數(shù)直接調(diào)用關(guān)系,用于后續(xù)的函數(shù)參數(shù)的識(shí)別。
與函數(shù)的邊界識(shí)別一樣,對(duì)二進(jìn)制代碼中函數(shù)關(guān)系的分析可以采用線性掃描的方式或者遞歸下降回溯掃描的方式。對(duì)后續(xù)的參數(shù)識(shí)別只需要取函數(shù)調(diào)用的第一層關(guān)系即可。因此,函數(shù)調(diào)用關(guān)系的分析采用靜態(tài)分析的方式,結(jié)合函數(shù)的邊界,采用線性掃描的技術(shù)對(duì)整個(gè)代碼段進(jìn)行分析。函數(shù)的邊界為函數(shù)的起始和結(jié)束地址,在每次解析函數(shù)調(diào)用關(guān)系時(shí),將整個(gè)函數(shù)的可執(zhí)行代碼取出進(jìn)行解析,通過解析生成格式為{函數(shù)地址:子程序1,子程序2,子程序3,…,子程序}的形式。在對(duì)所有的函數(shù)分析完成后,將格式轉(zhuǎn)換為{子程序:調(diào)用者1,調(diào)用者2,調(diào)用者3,…,調(diào)用者}的形式用于后續(xù)的函數(shù)參數(shù)的識(shí)別。
函數(shù)調(diào)用前的一段指令是對(duì)參數(shù)進(jìn)行傳遞的指令,為了分析函數(shù)參數(shù)傳遞的情況,只需對(duì)函數(shù)調(diào)用前的一段長度的指令進(jìn)行分析,這段代碼為參數(shù)傳遞指令序列。函數(shù)調(diào)用前,父函數(shù)會(huì)將調(diào)用子程序時(shí)需要的參數(shù)根據(jù)函數(shù)調(diào)用約定放入寄存器中或者壓入棧中。對(duì)二進(jìn)制函數(shù)指令序列進(jìn)行掃描分析,識(shí)別出其中的函數(shù)調(diào)用指令。選取函數(shù)調(diào)用前的一段指令序列作為函數(shù)參數(shù)傳遞指令序列,對(duì)參數(shù)傳遞指令序列進(jìn)行分析,主要包括兩個(gè)方面:對(duì)參數(shù)寄存器的使用情況和棧操作的情況進(jìn)行分析。對(duì)參數(shù)寄存器的使用情況分析主要是分析參數(shù)傳遞指令中使用了哪些參數(shù)寄存器,對(duì)于PPC指令主要分析r3 ~ r10寄存器的使用情況,對(duì)于MIPS指令則主要分析$a0 ~ $a3寄存器的使用情況。對(duì)于棧操作的指令分析,主要分析在參數(shù)傳遞指令中是否進(jìn)行了壓棧操作來傳遞參數(shù)。
對(duì)于函數(shù)參數(shù)的傳遞,有以下情況:對(duì)于未使用棧進(jìn)行參數(shù)傳遞的函數(shù),函數(shù)參數(shù)個(gè)數(shù)不會(huì)超過參數(shù)寄存器的個(gè)數(shù),因?yàn)楫?dāng)參數(shù)寄存器足夠時(shí),必定會(huì)使用參數(shù)寄存器來傳遞參數(shù);并且當(dāng)后一個(gè)參數(shù)寄存器用于傳遞參數(shù)時(shí),前一個(gè)參數(shù)寄存器必定也用來傳遞參數(shù),如在PPC指令下進(jìn)行參數(shù)傳遞時(shí),如果r5寄存器被用于傳遞參數(shù),那么前面的r3和r4寄存器也一定被用于傳遞參數(shù)。
由于編譯器的優(yōu)化,函數(shù)參數(shù)的傳遞位置可能發(fā)生改變,函數(shù)參數(shù)的傳遞會(huì)遠(yuǎn)離函數(shù)調(diào)用指令,因此僅對(duì)單個(gè)的函數(shù)調(diào)用進(jìn)行參數(shù)識(shí)別會(huì)出現(xiàn)識(shí)別錯(cuò)誤的情況。為解決參數(shù)識(shí)別錯(cuò)誤的問題,本文提出采用多函數(shù)調(diào)用分析的方法,即當(dāng)該函數(shù)存在多個(gè)調(diào)用者時(shí),對(duì)每個(gè)調(diào)用者都進(jìn)行函數(shù)參數(shù)傳遞分析,獲得該函數(shù)的參數(shù)個(gè)數(shù),然后使用基于投票的方法,選擇函數(shù)參數(shù)個(gè)數(shù)出現(xiàn)頻率最多的為函數(shù)參數(shù)的個(gè)數(shù)。
通過對(duì)函數(shù)的調(diào)用關(guān)系的分析,能夠得到{子程序:調(diào)用者1,調(diào)用者2,調(diào)用者3,…,調(diào)用者}的函數(shù)調(diào)用關(guān)系。為了更準(zhǔn)確地獲得函數(shù)參數(shù)的個(gè)數(shù),本文首先分別計(jì)算函數(shù)的調(diào)用者中傳遞的參數(shù)個(gè)數(shù);然后基于投票的機(jī)制,對(duì)函數(shù)的參數(shù)個(gè)數(shù)進(jìn)行投票,獲得票數(shù)最多的為函數(shù)的參數(shù)個(gè)數(shù);最后運(yùn)用函數(shù)參數(shù)個(gè)數(shù)識(shí)別算法進(jìn)行函數(shù)參數(shù)個(gè)數(shù)的識(shí)別。
函數(shù)參數(shù)個(gè)數(shù)識(shí)別算法——Findargs如下。
1) 對(duì)參數(shù)變量進(jìn)行初始化,設(shè)置函數(shù)參數(shù)個(gè)數(shù)數(shù)組[],并對(duì)數(shù)組[]中元素初始化為0;
2) 從函數(shù)調(diào)用關(guān)系集中取出一個(gè)元素,進(jìn)行函數(shù)參數(shù)個(gè)數(shù)的識(shí)別,當(dāng)取出所有元素后,結(jié)束執(zhí)行,進(jìn)行步驟5);
調(diào)用函數(shù)Func_37326dc8的函數(shù)關(guān)系如圖5所示。
由圖5可知共有9個(gè)函數(shù)調(diào)用了該函數(shù),為了準(zhǔn)確識(shí)別函數(shù)Func_37326dc8的參數(shù)個(gè)數(shù),對(duì)調(diào)用函數(shù)Func_37326dc8的這9個(gè)函數(shù)進(jìn)行參數(shù)傳遞分析,最終選取出現(xiàn)次數(shù)最多的數(shù)為函數(shù)的參數(shù)個(gè)數(shù)。其中,根據(jù)函數(shù)Func_3092dabc傳遞的參數(shù)分析函數(shù)Func_37326dc8的參數(shù)個(gè)數(shù)為2,而對(duì)剩余的8個(gè)函數(shù)進(jìn)行參數(shù)傳遞分析獲得的函數(shù)Func_37326dc8的參數(shù)個(gè)數(shù)為3,因此函數(shù)Func_37326dc8的參數(shù)個(gè)數(shù)為3。經(jīng)驗(yàn)證結(jié)果正確。
本節(jié)對(duì)Findargs的函數(shù)參數(shù)識(shí)別效果進(jìn)行評(píng)估,并與現(xiàn)有的工具radare2進(jìn)行對(duì)比。實(shí)驗(yàn)所用計(jì)算機(jī)的配置為Intel R CoreTM 6-core 3.7 GHz i7-8700K CPU and 32 GB RAM。radare2的版本為radare2 2.7.0-git 18197 @ linux-x86-64 git.2.6.0- 32-g3c8d7d53f。
4.2.1 庫函數(shù)的識(shí)別效果
為了驗(yàn)證函數(shù)參數(shù)個(gè)數(shù)的識(shí)別效果,需要選取擁有大量函數(shù)并且調(diào)用關(guān)系多樣的二進(jìn)制代碼。本文選取了路由器固件C2600-IPBA SEM-12.3(6f).BIN(PPC指令集)和C2900- UNIVERSALK9 - M-15.7(3)M2.BIN(MIPS指令集)為測(cè)試樣本,逆向分析得到二進(jìn)制中的C語言庫函數(shù),對(duì)函數(shù)參數(shù)個(gè)數(shù)的識(shí)別效果進(jìn)行驗(yàn)證,C語言部分庫函數(shù)的參數(shù)個(gè)數(shù)識(shí)別對(duì)比如表3所示。從表中可以看出該方法能夠準(zhǔn)確識(shí)別出函數(shù)的參數(shù)個(gè)數(shù)。
表3 C語言部分庫函數(shù)參數(shù)個(gè)數(shù)識(shí)別效果對(duì)比
“—”表示未在PPC指令集的二進(jìn)制文件中發(fā)現(xiàn)此函數(shù)
圖5 調(diào)用函數(shù)Func_37326dc8的函數(shù)關(guān)系
Figure 5 The reference relation of function Func_37326dc8
由表3可知,F(xiàn)indargs對(duì)于常用庫函數(shù)的識(shí)別的效果較好,原因是庫函數(shù)調(diào)用的次數(shù)比較多,并且函數(shù)的參數(shù)個(gè)數(shù)較少,使用參數(shù)寄存器能夠滿足所有參數(shù)的傳遞。
4.2.2 未知函數(shù)的識(shí)別效果
為了能夠更準(zhǔn)確地評(píng)估Findargs的識(shí)別效果,本文從路由器固件中C2600-IPBASE- M-12.3(6f).BIN和C3725-I-M-12.3(1a).BIN逆向分析獲得函數(shù)的參數(shù)個(gè)數(shù),分別使用Findargs和radare2進(jìn)行了參數(shù)個(gè)數(shù)的識(shí)別,識(shí)別結(jié)果如表4所示。實(shí)驗(yàn)結(jié)果表明,與radare2相比,F(xiàn)indargs具有更高的準(zhǔn)確率。對(duì)于PPC指令集,F(xiàn)indargs準(zhǔn)確率達(dá)到90.3%;對(duì)于MIPS指令集,識(shí)別的準(zhǔn)確率較低,達(dá)到86.0%。在實(shí)驗(yàn)中,F(xiàn)indargs的輸出結(jié)果為函數(shù)的起始地址和參數(shù)個(gè)數(shù)對(duì)。而radare2首先通過命令“aaa”對(duì)二進(jìn)制可執(zhí)行文件進(jìn)行分析,然后通過“afll”命令輸出到文本中,并使用Python腳本對(duì)輸出的結(jié)果進(jìn)行提取以獲得函數(shù)的參數(shù)個(gè)數(shù)。
表4 函數(shù)參數(shù)識(shí)別結(jié)果
4.2.3 函數(shù)調(diào)用次數(shù)對(duì)識(shí)別效果的影響
為了更好地展示Findargs的識(shí)別效果和函數(shù)調(diào)用次數(shù)對(duì)參數(shù)個(gè)數(shù)識(shí)別準(zhǔn)確率的影響,本文依據(jù)函數(shù)的調(diào)用次數(shù)對(duì)這些函數(shù)進(jìn)行了分類統(tǒng)計(jì)。對(duì)PPC和MIPS指令集分別統(tǒng)計(jì)了上述的300個(gè)函數(shù),分類統(tǒng)計(jì)結(jié)果為:對(duì)于PPC指令集,函數(shù)調(diào)用次數(shù)大于或等于2次的共有139個(gè),函數(shù)調(diào)用次數(shù)大于或等于3次的共有77個(gè),函數(shù)調(diào)用次數(shù)大于或等于4次的共有54個(gè);對(duì)于MIPS指令集,函數(shù)調(diào)用次數(shù)大于或等于2次的共有144個(gè),函數(shù)調(diào)用次數(shù)大于或等于3次的共有105個(gè),函數(shù)調(diào)用次數(shù)大于或等于4次的共有76個(gè)。函數(shù)調(diào)用次數(shù)對(duì)函數(shù)參數(shù)個(gè)數(shù)識(shí)別的影響如表5所示,其中,多調(diào)用分析是對(duì)所有的調(diào)用者進(jìn)行分析識(shí)別準(zhǔn)確的函數(shù)個(gè)數(shù),單調(diào)用分析是只分析其中的一個(gè)函數(shù)調(diào)用進(jìn)行分析識(shí)別準(zhǔn)確的函數(shù)個(gè)數(shù)。
表6展示了不同調(diào)用次數(shù)下的函數(shù)參數(shù)個(gè)數(shù)的識(shí)別準(zhǔn)確率。由表中數(shù)據(jù)可知,函數(shù)調(diào)用次數(shù)越多,函數(shù)參數(shù)個(gè)數(shù)的識(shí)別準(zhǔn)確率越高,并且多調(diào)用分析的效果好于單調(diào)用分析。
4.2.4 函數(shù)參數(shù)個(gè)數(shù)對(duì)識(shí)別效果的影響
為了研究函數(shù)參數(shù)個(gè)數(shù)對(duì)參數(shù)識(shí)別準(zhǔn)確率的影響,本文對(duì)不同參數(shù)個(gè)數(shù)的函數(shù)進(jìn)行了統(tǒng)計(jì)(如表7所示),分別計(jì)算了識(shí)別的準(zhǔn)確率(如表8所示)。由表可知,函數(shù)的參數(shù)個(gè)數(shù)一般小于6個(gè)。整體上來說,在此范圍(參數(shù)小于6)內(nèi)函數(shù)識(shí)別的準(zhǔn)確率較高,由于PPC有8個(gè)參數(shù)寄存器,基本能夠滿足函數(shù)進(jìn)行參數(shù)的傳遞。對(duì)于MIPS指令而言,在參數(shù)個(gè)數(shù)大于4時(shí),需要借助棧進(jìn)行參數(shù)的傳遞,使用棧進(jìn)行參數(shù)的傳遞比使用參數(shù)寄存器傳遞復(fù)雜,因此識(shí)別的準(zhǔn)確率略低。后續(xù)將考慮結(jié)合數(shù)據(jù)流分析追蹤參數(shù)的使用情況來提高M(jìn)IPS指令集下函數(shù)參數(shù)個(gè)數(shù)識(shí)別的準(zhǔn)確率。此外,經(jīng)過分析函數(shù)調(diào)用的位置同樣影響函數(shù)參數(shù)個(gè)數(shù)的識(shí)別準(zhǔn)確率,位于函數(shù)頭部的函數(shù)調(diào)用由于借用了上層函數(shù)的調(diào)用參數(shù),沒有明顯的傳參行為,因此對(duì)存在此類函數(shù)調(diào)用的函數(shù)的識(shí)別準(zhǔn)確率較低。
表5 函數(shù)參數(shù)個(gè)數(shù)識(shí)別效果隨調(diào)用次數(shù)的變化情況
表6 不同調(diào)用次數(shù)下函數(shù)參數(shù)的識(shí)別準(zhǔn)確率
表7 函數(shù)識(shí)別個(gè)數(shù)隨函數(shù)參數(shù)個(gè)數(shù)的變化
表8 函數(shù)識(shí)別準(zhǔn)確率隨參數(shù)個(gè)數(shù)的變化
函數(shù)的參數(shù)個(gè)數(shù)作為函數(shù)原型中的一個(gè)重要特征,能夠輔助后續(xù)的二進(jìn)制程序分析。本文提出了二進(jìn)制函數(shù)參數(shù)個(gè)數(shù)分析算法——Findargs,來識(shí)別PPC和MIPS指令集下二進(jìn)制代碼中函數(shù)的參數(shù)個(gè)數(shù)。實(shí)驗(yàn)結(jié)果表明,F(xiàn)indargs具有較高的準(zhǔn)確率,對(duì)于PPC指令集的二進(jìn)制可執(zhí)行文件,識(shí)別準(zhǔn)確率達(dá)到90.3%;對(duì)于MIPS指令集的二進(jìn)制可執(zhí)行文件,識(shí)別準(zhǔn)確率稍低,為86.0%。并且,本文與現(xiàn)有的工具radare2進(jìn)行了對(duì)比,結(jié)果表明Findargs具有更高的準(zhǔn)確率。
由于Findargs依賴于對(duì)參數(shù)寄存器的分析,對(duì)于_cdecl、pascal、stdcall僅使用棧進(jìn)行參數(shù)傳遞的方式適用性較差,但對(duì)多函數(shù)調(diào)用關(guān)系依據(jù)投票來選擇最準(zhǔn)確的參數(shù)個(gè)數(shù)的機(jī)制可以應(yīng)用到其他3種參數(shù)傳遞規(guī)范。這3種參數(shù)個(gè)數(shù)分析方法可以應(yīng)用到對(duì)fastcall參數(shù)傳遞方式的分析。當(dāng)使用fastcall進(jìn)行參數(shù)傳遞時(shí),函數(shù)調(diào)用傳遞的參數(shù)個(gè)數(shù)超過參數(shù)寄存器個(gè)數(shù)時(shí),參數(shù)傳遞的方式與上述3種方式相同。后續(xù)將考慮通過數(shù)據(jù)流分析追蹤參數(shù)的使用情況,來提高參數(shù)個(gè)數(shù)識(shí)別的準(zhǔn)確率。
[1] DURDEN T. Automated vulnerability auditing in machine code[J]. Phrack Magazine, 2007, 64.
[2] ABADI M, BUDIU M, ERLINGSSON ú, et al. Control-flow integrity principles, implementations, and applications[J]. ACM Transactions on Information and System Security (TISSEC), 2009, 13(1): 4.
[3] CLAUSE J, LI W, ORSO A. Dytan: a generic dynamic taint analysis framework[C]//International Symposium on Software Testing and Analysis. 2007: 196-206.
[4] NEWSOME J, SONG D X. Dynamic taint analysis for automatic detection, analysis, and signature generation of exploits on commodity software[C]//NDSS. 2005: 3-4.
[5] STAATS M, PASAREANU C. Parallel symbolic execution for structural test generation[C]//The 19th International Symposium on Software Testing and Analysis. 2010: 183-194.
[6] LI H, KIM T, BAT-ERDENE M, et al. Software vulnerability detection using backward trace analysis and symbolic execution[C]//2013 International Conference on Availability, Reliability and Security. 2013: 446-454.
[7] PERKINS J H, KIM S, LARSEN S, et al. Automatically patching errors in deployed software[C]//The ACM SIGOPS 22nd Symposium on Operating Systems Principles. 2009: 87-102.
[8] SHACHAM H. The geometry of innocent flesh on the bone: return-into-libc without function calls (on the x86)[C]//ACM Conference on Computer and Communications Security. 2007: 552-561.
[9] SONG D, BRUMLEY D, YIN H, et al. BitBlaze: a new approach to computer security via binary analysis[C]//International Conference on Information Systems Security. 2008: 1-25.
[10] SHOSHITAISHVILI Y, WANG R, SALLS C, et al. Sok:(state of) the art of war: offensive techniques in binary analysis[C]//2016 IEEE Symposium on Security and Privacy (SP). 2016: 138-157.
[11] 李珍, 鄒德清, 王澤麗, 等. 面向源代碼的軟件漏洞靜態(tài)檢測(cè)綜述[J]. 網(wǎng)絡(luò)與信息安全學(xué)報(bào), 2019, 5(1): 1-14.
LI Z, ZOU D Q, WANG Z L, et al. Survey on static software vulnerability detection for source code[J]. Chinese Journal of Network and Information Security, 2019, 5(1): 1-14.
[12] MENG X, MILLER B P. Binary code is not easy[C]//The 25th International Symposium on Software Testing and Analysis. 2016: 24-35.
[13] CABALLERO J, JOHNSON N M, MCCAMANT S, et al. Binary code extraction and interface identification for security applications[R]. California Univ Berkeley Dept of Electrical Engineering and Computer Science, 2009.
[14] Radare. The official radare2 book (1st edition)[EB].
[15] BAO T, BURKET J, WOO M, et al. BYTEWEIGHT: learning to recognize functions in binary code[C]//The 23rd USENIX Security Symposium. 2014: 845-860.
[16] 段鋼. 加密與解密 (第四版) [M]. 北京: 電子工業(yè)出版社, 2018: 104-105.
DUAN G. Encryption and decryption (4th edition) [M]. Beijing: Publishing House of Electronics Industry, 2018: 104-105.
[17] YIN X, LIU S, LIU L, et al. Function recognition in stripped binary of embedded devices[J]. IEEE Access, 2018, 6: 75682-75694.
[18] HU X, CHIUEH T, SHIN K G. Large-scale malware indexing using function-call graphs[C]//The 16th ACM Conference on Computer and communications security. 2009: 611-620.
[19] HASSEN M, CHAN P K. Scalable function call graph-based malware classification[C]//The Seventh ACM on Conference on Data and Application Security and Privacy. 2017: 239-248.
[20] HUANG D X, TANG Y, WANG Y, et al. Toward efficient and accurate function‐call graph matching of binary codes[J]. Concurrency and Computation: Practice and Experience, 2018, 31(21).
[21] KONG D, YAN G. Discriminant malware distance learning on structural information for automated malware classification[C]//The 19th ACM SIGKDD International Conference on Knowledge Discovery and Data Mining. 2013: 1357-1365.
Function argument number identification instripped binary under PPC and MIPS instruction set
YIN Xiaokang, LIU Liu, LIU Long, LIU Shengli
State Key Laboratory of Mathematical Engineering and Advanced Computing, Zhengzhou 450001, China
The identification of the number of function argument contributes to the recovery of the function prototype and is the basis for data flow analysis and other security analysis. In order to improve the accuracy of the recognition of the number of function parameters, an algorithm (Findargs) which determines the number of parameters of the function according to the voting mechanism of the function call relationship was proposed. Findargs starts from the function call characteristics of PPC and MIPS instruction set, and uses function call relationship combined with argument pass analysis to identify the number of function arguments, which can help to recover function prototype. In order to evaluate the recognition effect of Findargs, a large binary file was selected and tested it with radare2. The experiments results show that Findargs has higher accuracy, and the accuracy rate for PPC instruction set reaches 90.3%. For MIPS instruction set, the accuracy rate is 86%.
static analysis, function call resolve, argument number identification, voting mechanism
s: The National Key R&D Program of China (2016YFB0801505), Science & Technology Commission Foundation Strengthening Project (2019-JCJQ-ZD-113)
TP309
A
10.11959/j.issn.2096?109x.2020047
尹小康(1994-),男,河南周口人,數(shù)學(xué)工程與先進(jìn)計(jì)算國家重點(diǎn)實(shí)驗(yàn)室博士生,主要研究方向?yàn)榫W(wǎng)絡(luò)空間安全和逆向工程。
劉鎏(1998-),女,安徽合肥人,主要研究方向?yàn)榫W(wǎng)絡(luò)空間安全。
劉龍(1983-),男,河南尉氏人,數(shù)學(xué)工程與先進(jìn)計(jì)算國家重點(diǎn)實(shí)驗(yàn)室副教授,主要研究方向?yàn)榫W(wǎng)絡(luò)空間安全和機(jī)器學(xué)習(xí)。
劉勝利(1973-),男,河南周口人,博士,數(shù)學(xué)工程與先進(jìn)計(jì)算國家重點(diǎn)實(shí)驗(yàn)室教授,主要研究方向?yàn)榫W(wǎng)絡(luò)空間安全。
論文引用格式:尹小康, 劉鎏, 劉龍, 等. PPC和MIPS指令集下二進(jìn)制代碼中函數(shù)參數(shù)個(gè)數(shù)的識(shí)別方法[J]. 網(wǎng)絡(luò)與信息安全學(xué)報(bào), 2020, 6(4): 95-103.
YIN X K, LIU L, LIU L, et al. Function argument number identification in stripped binary under PPC and MIPS instruction set[J]. Chinese Journal of Network and Information Security, 2020, 6(4): 95-103.
2019?07?29;
2019?10?13
劉勝利,mr.shengliliu@gmail.com
國家重點(diǎn)研發(fā)計(jì)劃基金(2016YFB0801505);科技委基礎(chǔ)加強(qiáng)項(xiàng)目(2019-JCJQ-ZD-113)