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

一種動態(tài)堆棧內(nèi)存管理方法

文檔序號:9708659閱讀:720來源:國知局
一種動態(tài)堆棧內(nèi)存管理方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及一種動態(tài)堆棧內(nèi)存管理方法。
【背景技術(shù)】
[0002]緩沖區(qū)是程序運行時候在計算機內(nèi)存中存放數(shù)據(jù)的地方。當(dāng)程序試圖將一段數(shù)據(jù)寫到某一段內(nèi)存緩沖區(qū)中時,如果數(shù)據(jù)的長度超過緩沖區(qū)的長度,就會發(fā)生緩沖區(qū)溢出。攻擊者可以利用這一弱點對計算機進行攻擊。攻擊者把一個超過緩沖區(qū)長度的字符串寫入到緩沖區(qū)。由于寫入的超長的字符串覆蓋了相鄰的存儲單元,常常會導(dǎo)致兩種結(jié)果。一是引起程序運行失敗,嚴(yán)重的可導(dǎo)致系統(tǒng)崩潰;另外一種結(jié)果就是利用這種漏洞執(zhí)行惡意指令。如果被攻擊的程序在超級用戶權(quán)限上執(zhí)行,那么攻擊者也可以獲得系統(tǒng)超級用戶的權(quán)限。結(jié)果是一個匿名的因特網(wǎng)攻擊者往往有機會獲得一臺主機的部分或全部的控制權(quán)。緩沖區(qū)溢出攻擊已經(jīng)成為操作系統(tǒng)、數(shù)據(jù)庫,萬維網(wǎng)服務(wù)器等大型應(yīng)用程序最普遍的漏洞之一?,F(xiàn)有的解決辦法
針對上述的問題,目前為止已經(jīng)存在多種解決辦法。和本發(fā)明較為接近的主要有兩種技術(shù)。一是美國IMMUNIX公司的StackGuard技術(shù),另一個是日本IBM研究院的Proplice技術(shù),這兩種技術(shù)都是通過修改C語言的編譯器,在生成的目標(biāo)代碼中附加上緩沖區(qū)溢出檢測功能。其優(yōu)點是在原來的程序在不需要任何的改動。拿技術(shù)來說,為了探測是否有攻擊者對返回地址進行攻擊,當(dāng)一個新的函數(shù)被調(diào)用時,它將一個“canary”值(一個單字)放到返回地址的前面。如果當(dāng)函數(shù)返回時,發(fā)現(xiàn)這個的值被改變了,就證明可能有人正在試圖進行緩沖區(qū)溢出攻擊。程序會立刻響應(yīng),并將被攻擊的進程的相關(guān)信息記錄下來,然后終止被攻擊的進程。日本IBM研究院的Proplice技術(shù)在借鑒了 StackGuard技術(shù)的基礎(chǔ)上,重新安排了局部變量的順序。這樣當(dāng)字符串變量被寫入超長的字符串時,別的類型的局部變量的值不會遭到破壞,從而把攻擊的危害減少到最小程度。
[0003]但是通過分析源程序或分析使用這兩種技術(shù)編譯后的目標(biāo)程序,攻擊者可以確定運行時堆棧具體結(jié)構(gòu)。即攻擊者通過分析代碼可以確切獲得返回地址和分配的局部變量之間的相對偏移。攻擊者可以根據(jù)運行時候的堆棧結(jié)構(gòu)來改變返回地址的值,但同時并不改變“canary”的值,從而繞過StackGuard技術(shù)和Proplice技術(shù)對返回地址的保護,有效地實行緩沖區(qū)攻擊。

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

[0004]為解決上述現(xiàn)有的缺點,本發(fā)明的主要目的在于提供一種實用的動態(tài)堆棧內(nèi)存管理方法,它可以同時檢測出當(dāng)前執(zhí)行程序是否正在被攻擊并可以防止被攻擊,有效地防止了攻擊者利用堆棧緩沖區(qū)溢出進行攻擊。
[0005]為達(dá)成以上所述的目的,本發(fā)明的一種動態(tài)堆棧內(nèi)存管理方法采取如下技術(shù)方案:
一種動態(tài)堆棧內(nèi)存管理方法,其特征在于,在計算機程序執(zhí)行時,每次子過程被調(diào)用并分配當(dāng)前過程的堆棧空間時,象正常情況一樣保存調(diào)用參數(shù),返回地址,但是保存幀指針和分配局部變量的時候,在幀指針和局部變量起始地址之間分配一段額外內(nèi)存空間或者在返回地址和幀指針之間額外分配一段額外內(nèi)存空間,此額外空間的大小在程序執(zhí)行的時候隨機決定,這樣堆棧內(nèi)存中返回地址和局部變量的相對位置無法通過分析源程序或編譯后的目標(biāo)程序得到,可以有效地防止利用堆棧緩沖區(qū)溢出來對計算機系統(tǒng)進行攻擊,在分配局部參數(shù)內(nèi)存空間時,在幀指針和局部變量起始地址之間多分配一段內(nèi)存空間或者在返回地址和幀指針之間多分配一段內(nèi)存空間,這樣局部變量和返回地址之間的相對偏移就增加了一段額外的長度,這段額外長度的具體大小在每次運行的時候通過產(chǎn)生一個隨機數(shù)獲得,其中額外長度的內(nèi)存緩沖區(qū)中也可以放入類似StackGuard技術(shù)中的“canary”值,從而檢測出當(dāng)前執(zhí)行程序是否正在被攻擊。
[0006]所述額外長度由隨機函數(shù)發(fā)生器子程序來實現(xiàn),計算機目標(biāo)程序執(zhí)行時具有上述權(quán)利要求1的特征,相應(yīng)的編譯器能產(chǎn)生權(quán)利要求1的特征的目標(biāo)程序。
[0007]采用如上技術(shù)方案的本發(fā)明,具有如下有益效果:
本發(fā)明可以同時檢測出當(dāng)前執(zhí)行程序是否正在被攻擊并可以防止被攻擊,有效地防止了攻擊者利用堆棧緩沖區(qū)溢出進行攻擊。
【附圖說明】
[0008]圖1傳統(tǒng)程序運行時堆棧內(nèi)存結(jié)構(gòu)和使用本技術(shù)編譯后的程序運行時堆棧內(nèi)存結(jié)構(gòu)(局部變量和返回地址之間增加了一段隨即的長度)的示意圖。
[0009]圖2普通的程序執(zhí)行時的堆棧內(nèi)存結(jié)構(gòu)。
[0010]圖3使用緩沖區(qū)攻擊后的程序執(zhí)行時的堆棧內(nèi)存結(jié)構(gòu)。
[0011]圖4使用本發(fā)明后堆棧調(diào)用時的結(jié)構(gòu)。
【具體實施方式】
[0012]為了進一步說明本發(fā)明,下面結(jié)合附圖進一步進行說明:
上面是本發(fā)明的基本原理,可以有多種實現(xiàn)方式。比如可以使用特別的內(nèi)存設(shè)備(包括軟件設(shè)備和硬件設(shè)備)來實現(xiàn)。也可以使用特別的計算機系統(tǒng)來實現(xiàn)。也可以改寫編譯器來生成具有上述功能的目標(biāo)程序??傊驹砭穹秶鷥?nèi)的各種各樣的實現(xiàn)方式都應(yīng)該包括進來。下面舉出一個示例來具體說明使用本方法的程序的執(zhí)行過程。
[0013]1.正常程序的執(zhí)行過程:
我們以圖2為例來說明正常的程序執(zhí)行流程。我們使用函數(shù)foo被函數(shù)bar調(diào)用的例子來加以說明。假設(shè)函數(shù)被調(diào)用時堆棧幀從髙地址向低地址方向增長。圖2中函數(shù)foo把環(huán)境變量ENV_STR的內(nèi)容使用C語言的庫函數(shù)getenv得到后,使用C語言的庫函數(shù)strcpy拷貝到大小為128字節(jié)的字符串?dāng)?shù)組buffer中。foo被調(diào)用后,為了保存foo的動態(tài)執(zhí)行環(huán)境,下面的信息被保存在堆棧中。調(diào)用參數(shù)、返回地址、前堆棧幀指針、局部變量。
[0014]我們下面使用SP來代表堆棧指針,使用FP來代表幀指針,使用RA來代表返回地址。
[0015]?函數(shù)foo被調(diào)用前,堆棧指針(SP)指向堆棧幀的最底部,幀指針(FP)指向的前一堆棧幀的幀指針變量(FP)。從幀指針(FP)的下一個地址到堆棧指針(SP)之間存放了函數(shù)的局部變量。
[0016]?函數(shù)foo被調(diào)用后,首先在堆棧中保存了 foo的調(diào)用參數(shù),然后保存了返回lbar的返回地址。然后保存了前一幀指針(FP)。最后分配了 foo的局部參數(shù)。此時堆棧指針(SP)指向最下位。函數(shù)化foo便可以開始執(zhí)行了。
[0017]?函數(shù)foo執(zhí)行后,函數(shù)foo執(zhí)行終了后,按照上記的相反的順序,堆棧指針(SP)和幀指針(FP)也回到了函數(shù)foo被調(diào)用前的值。然后返回到foo的返回地址以指向的程序,繼續(xù)執(zhí)行bar部分的程序。
[0018]I1.典型的緩沖區(qū)溢出攻擊方式:
函數(shù)foo的堆棧構(gòu)造很容易從foo的源程序和編譯后的目標(biāo)程序中分析出來。然后按照分析的結(jié)果來對執(zhí)行的程序進行攻擊。我們以圖3來對攻擊過程進行說明。假設(shè)攻擊者已經(jīng)改寫了環(huán)境變量,在字符串拷貝的時候,返回地址被ADDR_X給覆蓋了,而局部變量的內(nèi)容被惡意攻擊代碼覆蓋了。并且ADDR_X指向這段攻擊代碼。比如函數(shù)foo被調(diào)用后,會執(zhí)行strcpy。由于strcpy—般不會檢查輸入字符串的大小,這樣從局部變量一直到以返回地址部分都被改寫。函數(shù)foo執(zhí)行結(jié)束后,沒有返回到bar程序中繼續(xù)執(zhí)行,而是返回到了那段惡意攻擊代碼處。這樣惡意攻擊程序就掌握了主動權(quán)并開始執(zhí)行。而且由于前幀指針也被改寫了,返回到bar時正確的幀指針也無法正確得到。這樣可能會發(fā)生不可預(yù)測的執(zhí)打錯誤。
[0019]II1.利用動態(tài)堆棧內(nèi)存管理技術(shù)來防止緩沖區(qū)溢出攻擊:
我們結(jié)合圖4以函數(shù)foo被調(diào)用執(zhí)行時候的堆棧構(gòu)造過程為例來說明。首先目標(biāo)程序象正常情況一樣保存了調(diào)用參數(shù),返回地址和幀指針,但是在分配局部變量的時候,本方法會動態(tài)地分配比正常的局部變量需要的空間更大的內(nèi)存空間。比如在圖4中分配大小為alpha空間。alpha的具體大小在運行的時候隨機動態(tài)地決定。(這個大小為alpha的緩沖區(qū)也可以被用做它用)。
[0020]在增加alpha大小的緩沖區(qū)后,幀指計的值可以指向圖中虛線,也可以指向圖中實線的位置。程序?qū)㈦S之使用不同的辦法來查找調(diào)用參數(shù)和局部變量。使用本發(fā)明的堆棧內(nèi)存管理方法,即使是同一段程序,每次執(zhí)行的時候局部變量部分分配的額外空間大小可能都不一樣。通過分析源程序和編譯后的程序無法檢測出返回地址的準(zhǔn)確位置。因此很難有效地實施堆棧攻擊。
[0021]可以使用隨機函數(shù)發(fā)生器來產(chǎn)生隨機大小的額外緩沖區(qū)長度.一個具體的隨機函數(shù)發(fā)生器的例子如下所示:
static int randval=0 ; randomGenerator ()
{
If (randval=0)
{
srand (time (0)); randval=rand ( ) %100+10 ;
}
return randval ;
}o
【主權(quán)項】
1.一種動態(tài)堆棧內(nèi)存管理方法,其特征在于,在計算機程序執(zhí)行時,每次子過程被調(diào)用并分配當(dāng)前過程的堆棧空間時,象正常情況一樣保存調(diào)用參數(shù),返回地址,但是保存幀指針和分配局部變量的時候,在幀指針和局部變量起始地址之間分配一段額外內(nèi)存空間或者在返回地址和幀指針之間額外分配一段額外內(nèi)存空間,此額外空間的大小在程序執(zhí)行的時候隨機決定,這樣堆棧內(nèi)存中返回地址和局部變量的相對位置無法通過分析源程序或編譯后的目標(biāo)程序得到,可以有效地防止利用堆棧緩沖區(qū)溢出來對計算機系統(tǒng)進行攻擊,在分配局部參數(shù)內(nèi)存空間時,在幀指針和局部變量起始地址之間多分配一段內(nèi)存空間或者在返回地址和幀指針之間多分配一段內(nèi)存空間,這樣局部變量和返回地址之間的相對偏移就增加了一段額外的長度,這段額外長度的具體大小在每次運行的時候通過產(chǎn)生一個隨機數(shù)獲得,其中額外長度的內(nèi)存緩沖區(qū)中也可以放入類似StackGuard技術(shù)中的“canary”值,從而檢測出當(dāng)前執(zhí)行程序是否正在被攻擊。2.根據(jù)權(quán)利要求1所述的一種動態(tài)堆棧內(nèi)存管理方法,其特征在于,所述額外長度由隨機函數(shù)發(fā)生器子程序來實現(xiàn),計算機目標(biāo)程序執(zhí)行時具有上述權(quán)利要求1的特征,相應(yīng)的編譯器能產(chǎn)生權(quán)利要求1的特征的目標(biāo)程序。
【專利摘要】本發(fā)明公開一種動態(tài)堆棧內(nèi)存管理方法,其特征在于,在計算機程序執(zhí)行時,每次子過程被調(diào)用并分配當(dāng)前過程的堆棧空間時,象正常情況一樣保存調(diào)用參數(shù),返回地址,但是保存幀指針和分配局部變量的時候,在幀指針和局部變量起始地址之間分配一段額外內(nèi)存空間或者在返回地址和幀指針之間額外分配一段額外內(nèi)存空間,此額外空間的大小在程序執(zhí)行的時候隨機決定,這樣堆棧內(nèi)存中返回地址和局部變量的相對位置無法通過分析源程序或編譯后的目標(biāo)程序得到。本發(fā)明可以同時檢測出當(dāng)前執(zhí)行程序是否正在被攻擊并可以防止被攻擊,有效地防止了攻擊者利用堆棧緩沖區(qū)溢出進行攻擊。
【IPC分類】G06F21/52
【公開號】CN105468965
【申請?zhí)枴緾N201410413067
【發(fā)明人】何陽, 米奇
【申請人】西安慧澤知識產(chǎn)權(quán)運營管理有限公司
【公開日】2016年4月6日
【申請日】2014年8月21日
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
河北区| 宁陵县| 沅江市| 句容市| 阳谷县| 寿阳县| 田阳县| 调兵山市| 长寿区| 大姚县| 綦江县| 新绛县| 宜宾市| 汉寿县| 锡林郭勒盟| 罗城| 蓝田县| 林周县| 阜城县| 华容县| 明溪县| 珲春市| 北流市| 阜宁县| 卢龙县| 柳河县| 黄龙县| 九龙坡区| 双柏县| 靖西县| 株洲县| 读书| 闸北区| 普定县| 临邑县| 晋州市| 天长市| 灵寿县| 桃源县| 福泉市| 邯郸县|