两个人的电影免费视频_国产精品久久久久久久久成人_97视频在线观看播放_久久这里只有精品777_亚洲熟女少妇二三区_4438x8成人网亚洲av_内谢国产内射夫妻免费视频_人妻精品久久久久中国字幕

一種內(nèi)存變量分布動(dòng)態(tài)發(fā)現(xiàn)方法

文檔序號(hào):9375219閱讀:231來(lái)源:國(guó)知局
一種內(nèi)存變量分布動(dòng)態(tài)發(fā)現(xiàn)方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明主要涉及一種軟件(可執(zhí)行文件)變量分析方法,更確切地是涉及軟件分 析中在缺乏源代碼情況下動(dòng)態(tài)推測(cè)內(nèi)存變量分布的方法。
【背景技術(shù)】
[0002] 內(nèi)存變量分析,是軟件分析,尤其是漏洞分析、惡意分析中重要的組成部分。在源 代碼存在的情況下,可以直接分析源代碼中的變量,從而獲得內(nèi)存變量分布。但對(duì)于缺乏源 代碼的二進(jìn)制可執(zhí)行文件,對(duì)其內(nèi)存變量分布的獲得顯得極為困難。
[0003] 數(shù)據(jù)結(jié)構(gòu)反向工程與內(nèi)存分布發(fā)現(xiàn)類(lèi)似。DIVINE通過(guò)使用值集分析和指針?lè)治?算法來(lái)恢復(fù)變量實(shí)體,可以識(shí)別棧中88%的變量和堆中89%的變量。但我們的方法更輕量 級(jí)。IDA Pro使用一個(gè)樸素的算法來(lái)推導(dǎo)內(nèi)存分布,但是對(duì)于全局變量和棧只能針對(duì)有限 的模式(如" [esp+offset] "或" [ebp. offset] ")。并沒(méi)有考慮本地變量在堆中通過(guò)指針、 結(jié)構(gòu)等進(jìn)行訪問(wèn)。Laika在圖像中識(shí)別潛在的指針來(lái)估計(jì)對(duì)象位置和大小,然后通過(guò)塊類(lèi) 型類(lèi)似的序列來(lái)檢測(cè)對(duì)象。Reward在一個(gè)已知的函數(shù)(如系統(tǒng)調(diào)用)被調(diào)用時(shí)首先識(shí)別 參數(shù)的類(lèi)型,然后,在程序動(dòng)態(tài)執(zhí)行過(guò)程中傳遞類(lèi)型信息。但是,它依靠類(lèi)型來(lái)獲得初始類(lèi) 型。如果數(shù)據(jù)結(jié)構(gòu)沒(méi)有在一個(gè)眾所周知的函數(shù)中直接或間接顯示,這些數(shù)據(jù)類(lèi)型就不會(huì)被 識(shí)別。實(shí)際上,內(nèi)部的變量和數(shù)據(jù)結(jié)構(gòu)在程序中占有很大比例。Howard從二進(jìn)制代碼中動(dòng) 態(tài)提取數(shù)據(jù)結(jié)構(gòu)。與Howard相比,我們的方法是一個(gè)輕量級(jí)方法,無(wú)需對(duì)所有指令進(jìn)行分 析。這樣,我們的方法不僅提高了效率,而且降低了處理過(guò)程中的誤報(bào)率。
[0004] 不變量的產(chǎn)生可以分析程序流程中不改變值的變量,一定程度上與本專(zhuān)利申請(qǐng)相 關(guān)。Daikon從程序執(zhí)行過(guò)程中檢測(cè)不變量,通過(guò)插入源程序來(lái)跟蹤感興趣的變量,然后運(yùn)行 插入的程序并輸入一些測(cè)試集,并推導(dǎo)插入變量和推導(dǎo)出的變量,這些變量在源程序中都 沒(méi)有出現(xiàn)。這個(gè)方法被用在多個(gè)安全領(lǐng)域中,如邏輯漏洞檢測(cè)、行為模型產(chǎn)生等。但是這些 方法有一些不足:1)它們使用隨機(jī)輸入來(lái)產(chǎn)生程序路徑,因此覆蓋率不高。2)它們需要手 動(dòng)指出要分析的變量。3)它們從路徑中分析變量,而我們的方法通過(guò)分析二進(jìn)制內(nèi)存操作 發(fā)現(xiàn)可能的內(nèi)存分布。WIT將內(nèi)存操作集的指令看作不變量和插入代碼來(lái)阻止修改不在集 合中的對(duì)象。我們使用該方法作為標(biāo)記指令。
[0005] 上述方法存在自動(dòng)化程度不高、分析方法復(fù)雜的問(wèn)題,本發(fā)明主要對(duì)指令執(zhí)行過(guò) 程分析,提出一種內(nèi)存變量分布動(dòng)態(tài)發(fā)現(xiàn)方法,解決在缺乏源代碼情況下,實(shí)現(xiàn)與某指令相 關(guān)的動(dòng)態(tài)推測(cè)內(nèi)存。

【發(fā)明內(nèi)容】

[0006] 針對(duì)上述問(wèn)題,本發(fā)明的目的在于能夠在不需要源碼的情況下,通過(guò)對(duì)目標(biāo)軟件 動(dòng)態(tài)分析,從而發(fā)現(xiàn)與某程序語(yǔ)句相關(guān)的內(nèi)存變量分布發(fā)現(xiàn)方法。由于內(nèi)存變量結(jié)構(gòu)隨著 程序的運(yùn)行可能隨時(shí)發(fā)生變化,因此在動(dòng)態(tài)分析過(guò)程中需要確定某條程序語(yǔ)句,并觀察程 序執(zhí)行到該語(yǔ)句時(shí)刻內(nèi)存變量分布情況。具體分析過(guò)程如下:首先,選擇程序中需要分析的 目標(biāo)語(yǔ)句。例如該語(yǔ)句是漏洞可能存在的語(yǔ)句,或者是惡意代碼所需要的敏感操作。其次, 生成能夠使得程序到達(dá)該目標(biāo)語(yǔ)句的輸入。由于程序運(yùn)行過(guò)程與外界輸入密切相關(guān),不同 的輸入可能使得程序執(zhí)行不同的路徑。為了能夠使得程序到達(dá)目標(biāo)指令,需要構(gòu)建特定的 輸入。第三,當(dāng)程序以構(gòu)建的特定輸入執(zhí)行,對(duì)程序中被執(zhí)行的目標(biāo)語(yǔ)句進(jìn)行分析,獲得內(nèi) 存變量結(jié)構(gòu)。具體實(shí)現(xiàn)流程如下:
[0007] 1)根據(jù)目標(biāo)語(yǔ)句選取內(nèi)存:由于內(nèi)存變量分布隨著程序運(yùn)行隨時(shí)變化,因此我們 僅關(guān)心某個(gè)時(shí)刻程序的內(nèi)存變量分布情況,如某條程序語(yǔ)句運(yùn)行時(shí)刻等。這在軟件安全漏 洞檢測(cè)、惡意代碼檢測(cè)中具有重要應(yīng)用價(jià)值。例如我們檢測(cè)緩沖區(qū)溢出漏洞時(shí),可以關(guān)注在 潛在錯(cuò)誤指令發(fā)生的檢測(cè)點(diǎn)位置操作的相關(guān)內(nèi)存變量分布情況。
[0008] 2)生成到目標(biāo)語(yǔ)句的路徑:當(dāng)我們得到候選的目標(biāo)語(yǔ)句位置(即檢測(cè)點(diǎn)位置),我 們產(chǎn)生一個(gè)路徑到達(dá)這個(gè)位置,然后分析程序執(zhí)行到這個(gè)位置時(shí)刻的內(nèi)存變量分布情況。 首先,產(chǎn)生一個(gè)從起始指令語(yǔ)句位置到目標(biāo)語(yǔ)句位置的靜態(tài)路徑,然后沿著這個(gè)靜態(tài)路徑 動(dòng)態(tài)地運(yùn)行程序,并記錄所有依靠這個(gè)輸入相關(guān)的約束條件。通過(guò)解決這些約束,我們可以 獲得合適的輸入,使得程序運(yùn)行到目標(biāo)位置。
[0009] 3)內(nèi)存變量分布推導(dǎo):當(dāng)步驟2)得到的輸入進(jìn)入程序,我們觀測(cè)在程序中指令是 如何在內(nèi)存上操作的,然后產(chǎn)生目標(biāo)指令相關(guān)的內(nèi)存變量分布信息。例如,若目標(biāo)是識(shí)別緩 沖區(qū)溢出漏洞,我們就需要首先識(shí)別緩沖區(qū)邊界,即緩沖區(qū)及其鄰居。我們使用兩步方法 來(lái)推斷內(nèi)存變量分布。首先,識(shí)別在檢測(cè)點(diǎn)被寫(xiě)的內(nèi)存塊m。通過(guò)這種方式,我們不需要分 析每條指令,僅需找到操作內(nèi)存塊m的指令。接著,我們這些指令中推導(dǎo)可能的內(nèi)存變量分 布,忽略沒(méi)有在m上操作的指令。
[0010] 與現(xiàn)有技術(shù)相比,本發(fā)明的積極效果為:
[0011] 本發(fā)明自動(dòng)化程度高,能夠同時(shí)分析堆和棧中的內(nèi)存變量,屬于一種輕量級(jí)方法, 無(wú)需對(duì)所有指令進(jìn)行分析,能夠在缺乏源代碼情況下,實(shí)現(xiàn)與某指令相關(guān)的動(dòng)態(tài)推測(cè)內(nèi)存。
【附圖說(shuō)明】
[0012] 圖1為基本框架圖;
[0013] 圖2為舉例1中代碼的內(nèi)存分布情況;
[0014] 圖3為舉例1中可能的內(nèi)存分布。
【具體實(shí)施方式】
[0015] 首先我們分析一個(gè)例子,說(shuō)明內(nèi)存變量分布識(shí)別。
[0016] 舉例1 :我們有如下二進(jìn)制代碼,我們對(duì)其進(jìn)行分析。
[0017]
[0018] 通過(guò)分析可知,由于sizein大于0x100程序?qū)⑼顺觯钱?dāng)sizein等于0x100時(shí), 循環(huán)中b[0x100 ]將獲得用戶(hù)輸入。圖2為舉例1中相應(yīng)代碼在Microsoft Visual Studio 2005運(yùn)行時(shí)內(nèi)存中分布情況,而b實(shí)際的空間是從b[0]到b [0x99],此時(shí),緩沖區(qū)溢出,如 果相鄰內(nèi)存是重要字段,比如size,然后后面舉例1中13行,根據(jù)這個(gè)size再次申請(qǐng)內(nèi)存, 就可以分配任意大小的緩沖區(qū),惡意用戶(hù)可以植入代碼,給用戶(hù)帶來(lái)很大安全威脅。
[0019] 因此,如圖1所示一種動(dòng)態(tài)發(fā)現(xiàn)內(nèi)存分布進(jìn)行漏洞檢測(cè)的方法主要包括三部分: 內(nèi)存選取、路徑產(chǎn)生和內(nèi)存變量分布推導(dǎo)。本發(fā)明的方法可以在缺乏源代碼的情況下,選取 所關(guān)注的錯(cuò)誤指令發(fā)生的檢測(cè)點(diǎn)位置操作相關(guān)內(nèi)存,然后產(chǎn)生一個(gè)可以達(dá)到這個(gè)位置的路 徑輸入,最后找到一個(gè)輸入到達(dá)該檢測(cè)點(diǎn),獲得相關(guān)內(nèi)存變量分布情況。具體過(guò)程如下:
[0020] 1)內(nèi)存選取。我們需要從整個(gè)內(nèi)存塊中選取合適的部分。不同類(lèi)型的漏洞可能 有不同的指令特征。在二進(jìn)制代碼中錯(cuò)誤指令的位置被稱(chēng)為檢測(cè)位置(check position)。 因此,我們關(guān)注在check positions處的內(nèi)存操作。例如check position可以隨意選取一 條可能引發(fā)漏洞的指令,例如循環(huán)內(nèi)部的賦值指令。
[0021]
[0022] 2)路牷嚴(yán)生。為/嚴(yán)生一個(gè)從程序起始指令(寫(xiě)作Is)到目標(biāo)指令(寫(xiě)作Ie)的 路徑,我們首先產(chǎn)生一個(gè)從Is到Ie的靜態(tài)路徑。然后沿著靜態(tài)路徑動(dòng)態(tài)運(yùn)行程序,并記錄 依據(jù)輸入數(shù)據(jù)的所有約束條件。通過(guò)解決這些約束,我們可以獲得合適的輸入數(shù)據(jù),直接讓 程序運(yùn)行到Ie。一個(gè)程序調(diào)用路徑P由多個(gè)不同子程序Pi構(gòu)成,我們產(chǎn)生一個(gè)程序調(diào)用路 徑P,它從起始指令所在的子程序Ps到目標(biāo)指令所在的子程序Pe。假設(shè)Is在程序Ps中, Ie在程序Pe中。我們考慮使用兩步方法來(lái)產(chǎn)生靜態(tài)路徑:A)產(chǎn)生從Ps到Pe的程序調(diào)用 路徑P ;B)對(duì)于P中每?jī)蓚€(gè)臨近的節(jié)點(diǎn)Pi和Pj產(chǎn)生分支路徑Bij。如果Is和Ie是在相 同程序中(如Ps = Pe),我們可以省略步驟A,僅使用步驟B來(lái)產(chǎn)生分支路徑。
[0023] A)程序調(diào)用路徑產(chǎn)生
[0024] 假設(shè)有兩個(gè)子程序Ps和Pe (Ps辛Pe)。我們的目標(biāo)是在Ps和Pe中產(chǎn)生程序調(diào)用 路徑P。我們首先通過(guò)分析目標(biāo)程序中的指令調(diào)用產(chǎn)生一個(gè)直接調(diào)用圖Gc。具體生成方法 如下:將包括程序入口的子程序作為第一個(gè)節(jié)點(diǎn),若該子程序包括調(diào)用指令(call指令), 將被調(diào)用的子程序作為節(jié)點(diǎn),添加從第一個(gè)節(jié)點(diǎn)到該節(jié)點(diǎn)的邊;之后以此類(lèi)推,對(duì)這兩個(gè)子 程序繼續(xù)分析,直至產(chǎn)生這個(gè)程序的整個(gè)調(diào)用圖為止。注意循環(huán)調(diào)用會(huì)使得Gc循環(huán)。我們 排除那些Gc中向后的邊。然后我們可以從Ps到Pe直接通過(guò)調(diào)用圖可達(dá)性分析即:掃描圖 中所有節(jié)點(diǎn)和邊,找到可以聯(lián)通Ps和Pe的路徑,產(chǎn)生一個(gè)程序調(diào)用路徑P。非直接調(diào)用使 得結(jié)果不完整。非直接調(diào)用的目的主要由硬件和軟件環(huán)境決定,程序語(yǔ)言的特征,如虛擬函 數(shù)和輸入數(shù)據(jù)。動(dòng)態(tài)分析通過(guò)使用種子輸入來(lái)獲得大部分簡(jiǎn)介調(diào)用的目的地址,包括前兩 種類(lèi)型和第三種類(lèi)型的一部分目的地址。我們使用種子輸入來(lái)分析程序中的間接調(diào)用目的 地址。雖然這是不完全的,但是我們可以使用更多的輸入數(shù)據(jù)來(lái)優(yōu)化結(jié)果。
[0025] B)分支路徑產(chǎn)生
[0026] 假設(shè)Ii和Ij是相同子程序中的兩個(gè)指令。為了找到一個(gè)分支路徑B從Ii到I j, 我們應(yīng)該首先發(fā)現(xiàn)一個(gè)指令路徑I從Ii到Ij。我們依據(jù)Ii和Ij所在子程序產(chǎn)生一個(gè)控 制流圖Gf,排除圖中循環(huán)的向后的路徑。控制流圖Gf中每個(gè)節(jié)點(diǎn)是一條指令,每條邊是指 令之間的流向關(guān)系。例如若指令a后跟著b,則有一條從a到b的邊;如果a指令是跳轉(zhuǎn)指 令,并跳向c,則有一條從a到c的邊。我們還是用直接圖可達(dá)性分析來(lái)獲取I。注意間接 跳轉(zhuǎn)會(huì)使得結(jié)果不完整,有點(diǎn)類(lèi)似間接調(diào)用。我們使用上述方法來(lái)解決這個(gè)問(wèn)題。分支路 徑B是指令路徑I的子集。我們只保持I中的分支路徑來(lái)產(chǎn)生B。實(shí)際上,并不是B中所有 分支節(jié)點(diǎn)都是必須的。我們?nèi)サ舴种Ч?jié)點(diǎn)中兩個(gè)均達(dá)到Ij的分支。通過(guò)這個(gè)方式,我們得 到Ii和Ij之間的分支路徑B。
[0027] 3)內(nèi)存變量分布推導(dǎo)。當(dāng)一個(gè)輸入進(jìn)入程序,我們觀測(cè)在程序中指令是如何在內(nèi) 存上操作的,然后產(chǎn)生指令相關(guān)的內(nèi)存變量分布信息。為了能夠有效推導(dǎo)出內(nèi)存變量分布 情況,我們首先定義了一些規(guī)則,這些規(guī)則主要用于識(shí)別不同的內(nèi)存單元,然后依據(jù)這些規(guī) 貝1J,我們可以進(jìn)行優(yōu)化,使用兩步方法推導(dǎo)獲得相應(yīng)的內(nèi)存變量分布情況。
[0028] A)基本規(guī)則
[0029] 當(dāng)一個(gè)輸入進(jìn)入程序,我們觀察程序中指令在內(nèi)存中的操作。然后我們從這些指 令產(chǎn)生相應(yīng)的內(nèi)存分布。
[0030] 表1顯示了內(nèi)存操作的規(guī)則。當(dāng)一個(gè)新的內(nèi)存塊M被分配,我們指定一個(gè)屬性CM 到其屬性集(標(biāo)記為ε (M))。CM是指基本屬性,它的值等于M的內(nèi)存地址。如果一個(gè)內(nèi)存 塊沒(méi)有被分配,就沒(méi)有該屬性。內(nèi)存分配操作包括堆分配
當(dāng)前第1頁(yè)1 2 
網(wǎng)友詢(xún)問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
龙泉市| 永宁县| 新泰市| 濮阳市| 麻江县| 阿合奇县| 左云县| 育儿| 大连市| 林州市| 望奎县| 嵩明县| 湾仔区| 通道| 汉源县| 兴山县| 原阳县| 循化| 和田市| 绥德县| 上栗县| 金沙县| 孝感市| 威远县| 西乌珠穆沁旗| 界首市| 玉门市| 兴宁市| 临夏县| 丽水市| 冕宁县| 年辖:市辖区| 新竹县| 汨罗市| 屯昌县| 开封市| 手游| 修文县| 且末县| 龙南县| 靖安县|