面向返回的編程作為混淆技術(shù)的制作方法
【技術(shù)領(lǐng)域】
[0001]本文涉及一種用于混淆計算機軟件的功能的方法以及計算機系統(tǒng)。
【背景技術(shù)】
[0002]試圖攔截計算機程序的操作和防止攔截攻擊的努力在日益復雜的攻擊和防止或響應(yīng)該攻擊的方法之間已經(jīng)發(fā)展為激烈的競賽。目前一項用于防止攔截攻擊的技術(shù)是將存儲器中的地址標注為可執(zhí)行的地址或數(shù)據(jù)地址。通常,攻擊包括將攻擊者生成的代碼引入到存儲器中的地址,然后將控制流轉(zhuǎn)向到這些存儲器地址。通過限制用戶寫入數(shù)據(jù)地址同時僅允許執(zhí)行可執(zhí)行的地址,程序?qū)⒉粫?zhí)行在數(shù)據(jù)地址中發(fā)現(xiàn)的代碼。因此,攻擊者引入的代碼將不會被執(zhí)行。
[0003]然而,面向返回的編程(ROP)克服了通過限制哪些地址能夠被執(zhí)行所提供的防護,這是因為被用來攔截程序的代碼是正在被攔截的程序執(zhí)行的代碼,因此該代碼保證位于存儲器中被標注為可執(zhí)行的地址處。ROP是代碼復用類攻擊,在這種攻擊中,攻擊者控制堆棧,從而可以任意執(zhí)行在程序現(xiàn)有的二進制中發(fā)現(xiàn)的短的代碼序列(小型應(yīng)用程序)。一個很好的類比是新聞記者錯誤地引用政治家所說的話。政治家可能說我將永遠不支持這樣的改革”,但是新聞記者可能會這樣引用政治家說過的話:“我支持這樣的改革”。通過把引用的話的兩個字省略掉,引用的意思就完全改變了。類似的,通過控制堆棧并使程序的控制轉(zhuǎn)向,以使程序跳轉(zhuǎn)到在程序中已經(jīng)存在的指令的中間,這樣程序的功能會完全改變,而并不需要向程序中引入任何新的代碼。
[0004]通常,ROP使用以返回語句結(jié)束的小型應(yīng)用程序。通過使用返回指令,攔截者可以使得程序并不是以由程序規(guī)定的順序來執(zhí)行指令,而是以任意的順序來執(zhí)行指令。通過高密度的不同指令編碼,經(jīng)常可以很容易發(fā)現(xiàn)以返回語句結(jié)束的小型應(yīng)用程序,這是因為被用于表示一個指令的相同字節(jié)當被不同解析時可以代表第二個指令(例如,在x86中,^Of95 45 C3”代表“setnzb-61(% ebp) ”,而“95”、“45”、“C3” 分別代表“xchg % ebp, %eax,,、“inc % ebp”、“ret”)。
[0005]由于ROP利用程序的代碼來對付程序,因此基于ROP的攔截攻擊是非常難防止的。用于防止基于ROP的攔截攻擊的現(xiàn)有的各種解決方案包括以使發(fā)現(xiàn)代碼中的小型應(yīng)用程序的可能性最小這種方式來編譯代碼。然而,這種解決方案最多只能妨礙基于ROP的攔截攻擊,程序的功能仍然是很明顯的。因此,需要不僅只能妨礙基于ROP的攔截攻擊的解決方案。
【發(fā)明內(nèi)容】
[0006]在一個實施例中,揭示了一種用于混淆計算機軟件的功能的方法。該方法包括:確定需要用來執(zhí)行目標操作的第一指令集和用于至少一個或多個另外的操作的第二指令集。調(diào)節(jié)第二指令集以包含指令,以致通過執(zhí)行第二指令集能夠?qū)崿F(xiàn)第一指令集的功能。一旦第一指令集和第二指令集被確定并且被調(diào)節(jié),代碼庫被創(chuàng)建,代碼庫由來自第二指令集的代碼片段構(gòu)成。代碼庫中的代碼片段與需要用來實現(xiàn)第一指令集的功能的代碼相對應(yīng)。指令被添加到第二指令集中,以致當被執(zhí)行時,將會致使計算機軟件執(zhí)行來自代碼庫的指令并實現(xiàn)目標操作的功能。因此,然后當?shù)诙噶罴粓?zhí)行時,使得第一指令集的功能和第二指令集的功能都被實現(xiàn)。
[0007]在第二個實施例中揭示了一種計算機系統(tǒng),該計算機系統(tǒng)具有處理器和存儲器,該計算機系統(tǒng)被配置成確定需要用來執(zhí)行目標操作的第一指令集,然后確定用于至少一個或多個另外的操作的第二指令集。然后調(diào)節(jié)第二指令集以包含指令,以致通過執(zhí)行第二指令集能夠?qū)崿F(xiàn)第一指令集的功能。創(chuàng)建代碼庫,該代碼庫包括來自第二指令集的代碼片段,代碼片段與需要用來實現(xiàn)第一指令集的功能的代碼相對應(yīng)。然后向第二指令集中添加指令以修改堆棧,從而堆棧以將要實現(xiàn)目標操作的功能的順序來執(zhí)行指令;所述堆棧被計算機軟件使用,以執(zhí)行來自代碼庫的指令。
【附圖說明】
[0008]下面將結(jié)合附圖和具體實施例來描述本發(fā)明的實施例的各個方面和優(yōu)點。
[0009]圖1A描繪的是一部分字節(jié)流。
[0010]圖1B描繪的是以不同的偏移量開始的圖1A的字節(jié)流。
[0011]圖2是計算設(shè)備中的計算機存儲器的方框圖,圖1A和圖1B的字節(jié)流可以在執(zhí)行過程中被存儲在該計算機存儲器中。
[0012]圖3示出了根據(jù)本發(fā)明的一個實施例的計算機軟件程序的執(zhí)行,其中計算機軟件程序的一部分被混淆。
[0013]圖4是根據(jù)本發(fā)明的實施例的用于混淆計算機軟件的功能的方法的處理流程圖。
[0014]圖5是根據(jù)本發(fā)明的一個實施例的計算設(shè)備的方框圖,其中使用面向返回的編程可以混淆程序。
[0015]在本文中,相似的元件采用相似的參考標號來標識。
【具體實施方式】
[0016]應(yīng)當很容易理解的是,本文中描述的以及附圖中所示的各個實施例的組成部分可以被設(shè)計和配置成各種不同的結(jié)構(gòu)。因此,在下文中詳細描述的各個實施例并不是意欲限制本發(fā)明的范圍,而僅僅是代表各個實施例。雖然在附圖中呈現(xiàn)了實施例的各個方面,但是這些附圖并不一定是按比例繪制的。
[0017]本發(fā)明可以采用不背離其精神或?qū)嵸|(zhì)特征的其他特定形式來實現(xiàn)。本文中所描述的實施例僅用于對本發(fā)明進行說明而并非用于限制本發(fā)明。因此,本發(fā)明的范圍是由所附的權(quán)利要求來限定的,而并不是由詳細說明來限定的。在本發(fā)明的保護范圍內(nèi)所做的任何改變都是包括在本發(fā)明的保護范圍內(nèi)的。
[0018]在本文中描述的特征、優(yōu)點或類似的內(nèi)容并不表明本發(fā)明實現(xiàn)的所有特征和優(yōu)點都應(yīng)當包括在任何一個單個的實施例中。關(guān)于一個實施例描述的具體特征或優(yōu)點應(yīng)當被理解為可以包括在本發(fā)明的至少一個實施例中。因此,在本文中描述的本發(fā)明的特征、優(yōu)點或類似內(nèi)容不一定是指同一個實施例。
[0019]另外,在本文中描述的本發(fā)明的特征和優(yōu)點可以以適當?shù)姆绞浇Y(jié)合到一個或多個實施例中。本領(lǐng)域技術(shù)人員應(yīng)當理解的是,根據(jù)本文中的描述,缺少特定實施例中的一個或多個具體特征或優(yōu)點,也是同樣能夠?qū)崿F(xiàn)本發(fā)明的。在其他情況中,某些實施例中的附加特征和優(yōu)點可能并不存在于本發(fā)明的所有實施例中。
[0020]本文中所使用的“ 一個實施例”或“該實施例”表明,結(jié)合所指出的實施例描述的特征、結(jié)構(gòu)或特點包括在至少一個實施例中。因此,本文中所使用的“在一個實施例中”、“在實施例中”以及類似用語可以是指相同的實施例,但也可以不必指相同的實施例。
[0021]圖1A描繪的是根據(jù)本發(fā)明的一個實施例的字節(jié)流。該字節(jié)流由字構(gòu)成,可以包括很多類型,例如包括操作碼、整數(shù)常數(shù)、寄存器號、常量池引用以及分支偏移量。在圖1A中,黑色框102中的字當被解析時執(zhí)行一系列指令。圖1B描繪的是與圖1A中相同的字節(jié)流,黑色框104表示的以不同的偏移量開始。解析圖1B的黑色框中的字將會導致與解析圖1A的黑色框中的字所得到的不同的指令,并且可能會導致字被讀取為不同的類型(例如整數(shù)常數(shù)被讀取為操作碼)。因此,通過從不同的偏移量開始解析字節(jié)流,從相同的字節(jié)流可以執(zhí)行或?qū)崿F(xiàn)不同的指令和功能。利用這一原理,程序的字節(jié)流可以被用來使得程序執(zhí)行不期望的指令或?qū)崿F(xiàn)不期望的功能。
[0022]圖2描繪的是計算設(shè)備中的計算機存儲器的方框圖,圖1A和圖1B的字節(jié)流可以在執(zhí)行過程中被存儲在該計算機存儲器中。如圖2所示,計算機存儲器被分配為按照以下順序存儲以下種類的數(shù)據(jù):堆棧、存儲器映射、堆、未初始化的變量、初始化的變量以及程序代碼。因此,當存儲器被彈出時(按照從上到下的順序被訪問),堆棧將首先被訪問。雖然計算設(shè)備將通常為所有上面列出的種類分配存儲器,但是ROP集中在為堆棧和程序代碼分配的存儲器上。
[0023]在存儲器的堆棧部分(堆棧)中存儲的數(shù)據(jù)促進計算機程序流的執(zhí)行,并且在子程序執(zhí)行期間存儲局部變量。例如,當計算機程序的主體被執(zhí)行時,直到到達跳轉(zhuǎn)指令時才執(zhí)行指令。然后,在跳轉(zhuǎn)指令之后的指令的地址(返回地址)被推送到堆棧,程序跳轉(zhuǎn)到由跳轉(zhuǎn)指令所指定的指令,執(zhí)行子程序,所指定的指令是子程序的一部分。在子程序執(zhí)行期間,局部變量可以被推送到堆桟,在子程序結(jié)束時局部變量從堆桟中被彈出,從堆桟中彈出一個值,程序流返回到該值所指示的地址。通常,在子程序執(zhí)行期間被推送到堆棧的所有變量都被從堆棧中彈出。因此,在子程序結(jié)束時從堆棧中彈出的值是返回地址。然而,通過在堆棧上留下另外的值或者增加另外的值,可以使程序流轉(zhuǎn)向。
[0024]攻擊者可以通過利用程序的代碼中的缺陷來向堆棧中添加額外的值。例如,有一種通用技術(shù)叫做堆棧緩沖區(qū)溢出,在程序?qū)懭氡环峙浣o堆棧的存儲器內(nèi)的存儲器地址時發(fā)生堆棧緩沖區(qū)溢出。例如,如果存儲在堆棧上的變量只希望是16位的,但是得到的是32位的,則另外的16位可能被寫入到堆棧上的相鄰的存儲空間(例如之前保持返回地址的空間)中。通過利用缺陷(例如將32位傳送給16位變量)并在堆棧上重寫地址,攻擊者可以使得程序執(zhí)行不是該程序期望執(zhí)行的指定操作。
[0025]通常,攻擊者指定和利用要被執(zhí)行的指定操作和程序代碼中的缺陷。或者,根據(jù)本發(fā)明,程序本身可以指定或利用該操作和缺陷。這樣,程序可以使得ROP執(zhí)行程序的一部分操作,因此混淆了由ROP執(zhí)行的這部分程序。圖3示出了根據(jù)本發(fā)明的一個實施例的計算機軟件程序,其中計算機軟件程序的一部分被混淆。不利用ROP技術(shù)的計算機軟件程序具有主體和兩個子程序(sub5to8和sub9toll)。利用ROP技術(shù),根據(jù)本發(fā)明的一個實施例,sub9toll可以被混淆在sub5to8中。例如,參考圖1A和IB的字節(jié)流,sub5to8可以是圖1A的黑色框中的字節(jié)流(0f9545c3),sub9toll可以是圖1B的黑色框中的字節(jié)流(9545c3)。因此,跳轉(zhuǎn)到sub5to8內(nèi)的偏移量會導致sub9toll的字節(jié)流。
[0026]圖3示出了利用一個子程序(Sub5to8)的計算機軟件程序的執(zhí)行。根據(jù)本發(fā)明的實施例,sub5to8被調(diào)節(jié)以使得通過在sub5to8中找到的指令可以實現(xiàn)sub9toll的功能。當程序被執(zhí)行時,最開始的四個指令被執(zhí)行。然后,程序流移動到sub5to8,指令5-8被執(zhí)行。通過在指令5開始子程序(即非混淆操作),表面