緩沖區(qū)溢出簡要原理

緩沖區(qū)溢出簡要原理

ID:15865420

大?。?3.50 KB

頁數(shù):3頁

時間:2018-08-06

緩沖區(qū)溢出簡要原理_第1頁
緩沖區(qū)溢出簡要原理_第2頁
緩沖區(qū)溢出簡要原理_第3頁
資源描述:

《緩沖區(qū)溢出簡要原理》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。

1、緩沖區(qū)溢出緩沖區(qū)是內(nèi)存中存放數(shù)據(jù)的地方。在程序試圖將數(shù)據(jù)放到計算機(jī)內(nèi)存中的某一位置,但沒有足夠空間時會發(fā)生緩沖區(qū)溢出。緩沖區(qū)是程序運(yùn)行時計算機(jī)內(nèi)存中的一個連續(xù)的塊,它保存了給定類型的數(shù)據(jù)。問題隨著動態(tài)分配變量而出現(xiàn)。為了不用太多的內(nèi)存,一個有動態(tài)分配變量的程序在程序運(yùn)行時才決定給他們分配多少內(nèi)存。如果程序在動態(tài)分配緩沖區(qū)放入太多的數(shù)據(jù)會有什么現(xiàn)象?它溢出了,漏到了別的地方。一個緩沖區(qū)溢出應(yīng)用程序使用這個溢出的數(shù)據(jù)將匯編語言代碼放到計算機(jī)的內(nèi)存中,通常是產(chǎn)生root權(quán)限的地方。單單的緩沖區(qū)溢出,并不會產(chǎn)生安全問題。只

2、有將溢出送到能夠以root權(quán)限運(yùn)行命令的區(qū)域才行。這樣,一個緩沖區(qū)利用程序?qū)⒛苓\(yùn)行的指令放在了有root權(quán)限的內(nèi)存中,從而一旦運(yùn)行這些指令,就是以root權(quán)限控制了計算機(jī)??偨Y(jié)一下上面的描述。緩沖區(qū)溢出指的是一種系統(tǒng)攻擊的手段,通過往程序的緩沖區(qū)寫超出其長度的內(nèi)容,造成緩沖區(qū)的溢出,從而破壞程序的堆棧,使程序轉(zhuǎn)而執(zhí)行其它指令,以達(dá)到攻擊的目的。據(jù)統(tǒng)計,通過緩沖區(qū)溢出進(jìn)行的攻擊占所有系統(tǒng)攻擊總數(shù)的80%以上。造成緩沖區(qū)溢出的原因是程序中沒有仔細(xì)檢查用戶輸入的參數(shù)。例如下面程序:example0.c----------

3、-------------------------------------------------voidfunction(char*str){charbuffer[16];strcpy(buffer,str);}-----------------------------------------------------------上面的strcpy()將直接把str中的內(nèi)容copy到buffer中。這樣只要str的長度大于16,就會造成buffer的溢出,使程序運(yùn)行出錯。存在象strcpy這樣的問題的標(biāo)準(zhǔn)函數(shù)還有s

4、trcat(),sprintf(),vsprintf(),gets(),scanf(),以及在循環(huán)內(nèi)的getc(),fgetc(),getchar()等。在C語言中,靜態(tài)變量是分配在數(shù)據(jù)段中的,動態(tài)變量是分配在堆棧段的。緩沖區(qū)溢出是利用堆棧段的溢出的。一個程序在內(nèi)存中通常分為程序段,數(shù)據(jù)端和堆棧三部分。程序段里放著程序的機(jī)器碼和只讀數(shù)據(jù),這個段通常是只讀,對它的寫操作是非法的。數(shù)據(jù)段放的是程序中的靜態(tài)數(shù)據(jù)。動態(tài)數(shù)據(jù)則通過堆棧來存放。在內(nèi)存中,它們的位置如下:/――――――――內(nèi)存低端

5、程序段

6、

7、―――――――――

8、

9、

10、數(shù)據(jù)段

11、

12、―――――――――

13、

14、堆棧

15、―――――――――/內(nèi)存高端堆棧是內(nèi)存中的一個連續(xù)的塊。一個叫堆棧指針的寄存器(SP)指向堆棧的棧頂。堆棧的底部是一個固定地址。堆棧有一個特點(diǎn)就是,后進(jìn)先出。也就是說,后放入的數(shù)據(jù)第一個取出。它支持兩個操作,PUSH和POP。PUSH是將數(shù)據(jù)放到棧的頂端,POP是將棧頂?shù)臄?shù)據(jù)取出。在高級語言中,程序函數(shù)調(diào)用和函數(shù)中的臨時變量都用到堆棧。參數(shù)的傳遞和返回值是也用到了堆棧。通常對局部變量的引用是通過給出它們對SP的偏移量來實(shí)現(xiàn)的。另外還有一個基址指針(FP,在Intel芯片中

16、是BP),許多編譯器實(shí)際上是用它來引用本地變量和參數(shù)的。通常,參數(shù)的相對FP的偏移是正的,局部變量是負(fù)的。當(dāng)程序中發(fā)生函數(shù)調(diào)用時,計算機(jī)做如下操作:首先把參數(shù)壓入堆棧;然后保存指令寄存器(IP)中的內(nèi)容,做為返回地址(RET);第三個放入堆棧的是基址寄存器(FP);然后把當(dāng)前的棧指針(SP)拷貝到FP,做為新的基地址;最后為本地變量留出一定空間,把SP減去適當(dāng)?shù)臄?shù)值。下面舉個例子:example1.c:---------------------------------------------------------

17、---voidfunction(inta,intb,intc){charbuffer1[5];charbuffer2[10];}voidmain(){function(1,2,3);}-----------------------------------------------------------為了理解程序是怎樣調(diào)用函數(shù)function()的,使用-S選項,在Linux下,用gcc進(jìn)行編譯,產(chǎn)生匯編代碼輸出:$gcc-S-oexample1.sexample1.c看看輸出文件中調(diào)用函數(shù)的那部分:pushl$3

18、pushl$2pushl$1callfunction這就將3個參數(shù)壓到堆棧里了,并調(diào)用function()。指令call會將指令指針I(yè)P壓入堆棧。在返回時,RET要用到這個保存的IP。在函數(shù)中,第一要做的事是進(jìn)行一些必要的處理。每個函數(shù)都必須有這些過程:pushl%ebpmovl%esp,%ebpsubl$20,%esp這幾條指令將EBP,基址指針放入堆棧。

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動畫的文件,查看預(yù)覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時聯(lián)系客服。
3. 下載前請仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡(luò)波動等原因無法下載或下載錯誤,付費(fèi)完成后未能成功下載的用戶請聯(lián)系客服處理。