Ⅰ 什麼叫緩沖區溢出
緩沖區溢出
緩沖區是內存中存放數據的地方。在程序試圖將數據放到計算機內存中的某一位置,但沒有足夠空間時會發生緩沖區溢出。
緩沖區是程序運行時計算機內存中的一個連續的塊,它保存了給定類型的數據。問題隨著動態分配變數而出現。為了不用太多的內存,一個有動態分配變數的程序在程序運行時才決定給他們分配多少內存。如果程序在動態分配緩沖區放入太多的數據會有什麼現象?它溢出了,漏到了別的地方。一個緩沖區溢出應用程序使用這個溢出的數據將匯編語言代碼放到計算機的內存中,通常是產生root許可權的地方。單單的緩沖區溢出,並不會產生安全問題。只有將溢出送到能夠以root許可權運行命令的區域才行。這樣,一個緩沖區利用程序將能運行的指令放在了有root許可權的內存中,從而一旦運行這些指令,就是以root許可權控制了計算機。總結一下上面的描述。緩沖區溢出指的是一種系統攻擊的手段,通過往程序的緩沖區寫超出其長度的內容,造成緩沖區的溢出,從而破壞程序的堆棧,使程序轉而執行其它指令,以達到攻擊的目的。據統計,通過緩沖區溢出進行的攻擊占所有系統攻擊總數的80%以上。造成緩沖區溢出的原因是程序中沒有仔細檢查用戶輸入的參數。例如下面程序:
example0.c
-----------------------------------------------------------
void function(char *str) {
char buffer[16];
strcpy(buffer,str);
}
-----------------------------------------------------------
上面的strcpy()將直接把str中的內容到buffer中。這樣只要str的長度大於16,就會造成buffer的溢出,使程序運行出錯。存在象strcpy這樣的問題的標准函數還有strcat(),sprintf(),vsprintf(),gets(),scanf(),以及在循環內的getc(),fgetc(),getchar()等。在C語言中,靜態變數是分配在數據段中的,動態變數是分配在堆棧段的。緩沖區溢出是利用堆棧段的溢出的。一個程序在內存中通常分為程序段,數據端和堆棧三部分。程序段里放著程序的機器碼和只讀數據,這個段通常是只讀,對它的寫操作是非法的。數據段放的是程序中的靜態數據。動態數據則通過堆棧來存放。在內存中,它們的位置如下:
/――――――――\ 內存低端
|程序段|
|―――――――――|
|數據段|
|―――――――――|
|堆棧|
\―――――――――/內存高端
堆棧是內存中的一個連續的塊。一個叫堆棧指針的寄存器(SP)指向堆棧的棧頂。堆棧的底部是一個固定地址。堆棧有一個特點就是,後進先出。也就是說,後放入的數據第一個取出。它支持兩個操作,PUSH和POP。PUSH是將數據放到棧的頂端,POP是將棧頂的數據取出。在高級語言中,程序函數調用和函數中的臨時變數都用到堆棧。參數的傳遞和返回值是也用到了堆棧。通常對局部變數的引用是通過給出它們對SP的偏移量來實現的。另外還有一個基址指針(FP,在Intel晶元中是BP),許多編譯器實際上是用它來引用本地變數和參數的。通常,參數的相對FP的偏移是正的,局部變數是負的。當程序中發生函數調用時,計算機做如下操作:首先把參數壓入堆棧;然後保存指令寄存器(IP)中的內容,做為返回地址(RET);第三個放入堆棧的是基址寄存器(FP);然後把當前的棧指針(SP)拷貝到FP,做為新的基地址;最後為本地變數留出一定空間,把SP減去適當的數值。
下面舉個例子:
example1.c:
------------------------------------------------------------
void function(int a, int b, int c) {
char buffer1[5];
char buffer2[10];
}
void main() {
function(1,2,3);
}
-----------------------------------------------------------
為了理解程序是怎樣調用函數function()的,使用-S選項,在Linux下,用gcc進行編譯,產生匯編代碼輸出:
$ gcc -S -o example1.s example1.c
看看輸出文件中調用函數的那部分:
pushl $3
pushl $2
pushl $1
call function
這就將3個參數壓到堆棧里了,並調用function()。指令call會將指令指針IP壓入堆棧。在返回時,RET要用到這個保存的IP。在函數中,第一要做的事是進行一些必要的處理。每個函數都必須有這些過程:
pushl %ebp
movl %esp,%ebp
subl $20,%esp
這幾條指令將EBP,基址指針放入堆棧。然後將當前SP拷貝到EBP。然後,為本地變數分配空間,並將它們的大小從SP里減掉。由於內存分配是以字為單位的,因此,這里的buffer1用了8位元組(2個字,一個字4位元組)。Buffer2用了12位元組(3個字)。所以這里將ESP減了20。這樣,現在,堆棧看起來應該是這樣的。
低端內存高端內存
buffer2 buffer1 sfp ret a b c
< ------ [ ][ ][ ][ ][ ][ ][ ]
棧頂棧底
緩沖區溢出就是在一個緩沖區里寫入過多的數據。那怎樣利用呢,看
一下下面程序:
example2.c
-----------------------------------------------------------
void function(char *str) {
char buffer[16];
strcpy(buffer,str);
}
void main() {
char large_string[256];
int i;
for( i = 0; i < 255; i++)
large_string[i] = 'A';
function(large_string);
}
------------------------------------------------------------
這個程序是一個經典的緩沖區溢出編碼錯誤。函數將一個字元串不經過邊界檢查,拷貝到另一內存區域。當調用函數function()時,堆棧如下:
低內存端buffer sfp ret *str高內存端
< ------ [ ][ ][ ][ ]
棧頂棧底
很明顯,程序執行的結果是"Segmentation fault (core mped)"或類似的出錯信息。因為從buffer開始的256個位元組都將被*str的內容'A'覆蓋,包括sfp, ret,甚至*str。'A'的十六進值為0x41,所以函數的返回地址變成了0x41414141, 這超出了程序的地址空間,所以出現段錯誤。可見,緩沖區溢出允許我們改變一個函數的返回地址。通過這種方式,可以改變程序的執行順序。
Ⅱ 緩沖區溢出的簡介
緩沖區溢出攻擊有多種英文名稱:buffer overflow,buffer overrun,smash the stack,trash the stack,scribble the stack, mangle the stack, memory leak,overrun screw;它們指的都是同一種攻擊手段。第一個緩沖區溢出攻擊--Morris蠕蟲,發生在1988年,由羅伯特,莫里斯(R ob。rtMorris)製造,它曾造成全世界6000多台網路伺服器癱瘓。
Ⅲ 緩沖區溢出怎麼解決
1重啟後一定不要取消殺毒,讓殺毒軟體在進入XP界面前先殺個毒,
2如果下載不了殺毒軟體就在另外一台機子上下載360修復專家(或者'windows清理助手'或'惡意軟體清理助手'),如果不行再一項一項的殺,不要怕麻煩,除非你想重做系統。
(如果再打不開可以把360.exe改成360.scr 然後運行安裝,安裝好之後,把360的主程序的後綴名也要改成*.scr 這樣在運行 。因為scr和exe的初始化不一樣。。所以改後綴名即可。。然後在360裡面安裝一個專殺工具~!記得,要先斷網哦~)!
3,運行安全360,修復IE ,清理一下,然後到安全模式下殺毒。這問題我也剛才遇到一般就可以解決。
然後給系統減負.
Ⅳ 緩沖區溢出的問題
N=2,Student
student[N],這時只有student[0]和student[1]兩個數組元素,而
for(i=1;i<=N;i++)
{
cout<<"請輸入第"<<i<<"位學生的成績:"<<endl;
student[i].SetScore();
}
里i是從1開始算得就會出現student[2],當然會溢出了.
Ⅳ 緩沖區溢出的基本原理是什麼
緩沖區溢出的原理:
通過往程序的緩沖區寫超出其長度的內容,造成緩沖區的溢出,從而破壞程序的堆棧,使程序轉而執行其它指令,以達到攻擊的目的。造成緩沖區溢出的原因是程序中沒有仔細檢查用戶輸入的參數。例如下面程序:
void function(char *str) {
char buffer[16];
strcpy(buffer,str);
}
上面的strcpy()將直接吧str中的內容到buffer中。這樣只要str的長度大於16,就會造成buffer的溢出,使程序運行出錯。存在象strcpy這樣的問題的標准函數還有strcat(),sprintf(),vsprintf(),gets(),scanf()等。
漏洞:
緩沖區溢出攻擊的目的在於擾亂具有某些特權運行的程序的功能,這樣可以使得攻擊者取得程序的控制權,如果該程序具有足夠的許可權,那麼整個主機就被控制了。一般而言,攻擊者攻擊root程序,然後執行類似「exec(sh)」的執行代碼來獲得root許可權的shell。為了達到這個目的,攻擊者必須達到如下的兩個目標:
在程序的地址空間里安排適當的代碼。
通過適當的初始化寄存器和內存,讓程序跳轉到入侵者安排的地址空間執行。
可以根據這兩個目標來對緩沖區溢出攻擊進行分類。
以上內容參考:網路-緩沖區溢出
Ⅵ 緩沖區溢出是什麼意思
為了便於理解,我們不妨打個比方。緩沖區溢出好比是將十磅的糖放進一個只能裝五磅的容器里。一旦該容器放滿了,餘下的部分就溢出在櫃台和地板上,弄得一團糟。由於計算機程序的編寫者寫了一些編碼,但是這些編碼沒有對目的區域或緩沖區——五磅的容器——做適當的檢查,看它們是否夠大,能否完全裝入新的內容——十磅的糖,結果可能造成緩沖區溢出的產生。如果打算被放進新地方的數據不適合,溢得到處都是,該數據也會製造很多麻煩。但是,如果緩沖區僅僅溢出,這只是一個問題。到此時為止,它還沒有破壞性。當糖溢出時,櫃台被蓋住。可以把糖擦掉或用吸塵器吸走,還櫃台本來面貌。與之相對的是,當緩沖區溢出時,過剩的信息覆蓋的是計算機內存中以前的內容。除非這些被覆蓋的內容被保存或能夠恢復,否則就會永遠丟失。
在丟失的信息里有能夠被程序調用的子程序的列表信息,直到緩沖區溢出發生。另外,給那些子程序的信息——參數——也丟失了。這意味著程序不能得到足夠的信息從子程序返回,以完成它的任務。就像一個人步行穿過沙漠。如果他依賴於他的足跡走回頭路,當沙暴來襲抹去了這些痕跡時,他將迷失在沙漠中。這個問題比程序僅僅迷失方向嚴重多了。入侵者用精心編寫的入侵代碼(一種惡意程序)使緩沖區溢出,然後告訴程序依據預設的方法處理緩沖區,並且執行。此時的程序已經完全被入侵者操縱了。
入侵者經常改編現有的應用程序運行不同的程序。例如,一個入侵者能啟動一個新的程序,發送秘密文件(支票本記錄,口令文件,或財產清單)給入侵者的電子郵件。這就好像不僅僅是沙暴吹了腳印,而且後來者也會踩出新的腳印,將我們的迷路者領向不同的地方,他自己一無所知的地方。
緩沖區溢出的處理
你屋子裡的門和窗戶越少,入侵者進入的方式就越少……
由於緩沖區溢出是一個編程問題,所以只能通過修復被破壞的程序的代碼而解決問題。如果你沒有源代碼,從上面「堆棧溢出攻擊」的原理可以看出,要防止此類攻擊,我們可以:
1、開放程序時仔細檢查溢出情況,不允許數據溢出緩沖區。由於編程和編程語言的原因,這非常困難,而且不適合大量已經在使用的程序;
2、使用檢查堆棧溢出的編譯器或者在程序中加入某些記號,以便程序運行時確認禁止黑客有意造成的溢出。問題是無法針對已有程序,對新程序來講,需要修改編譯器;
3、經常檢查你的操作系統和應用程序提供商的站點,一旦發現他們提供的補丁程序,就馬上下載並且應用在系統上,這是最好的方法。但是系統管理員總要比攻擊者慢一步,如果這個有問題的軟體是可選的,甚至是臨時的,把它從你的系統中刪除。舉另外一個例子,你屋子裡的門和窗戶越少,入侵者進入的方式就越少。
Ⅶ 緩沖區溢出是怎麼回事怎麼解決啊
緩沖區是內存中存放數據的地方。在程序試圖將數據放到計算機內存中的某一位置,但沒有足夠空間時會發生緩沖區溢出。
Ⅷ 緩沖區溢出的概念
計算機程序一般都會使用到一些內存,這些內存或是程序內部使用,或是存放用戶的輸入數據,這樣的內存一般稱作緩沖區。溢出是指盛放的東西超出容器容量而溢出來了,在計算機程序中,就是數據使用到了被分配內存空間之外的內存空間。而緩沖區溢出,簡單的說就是計算機對接收的輸入數據沒有進行有效的檢測(理想的情況是程序檢查數據長度並不允許輸入超過緩沖區長度的字元),向緩沖區內填充數據時超過了緩沖區本身的容量,而導致數據溢出到被分配空間之外的內存空間,使得溢出的數據覆蓋了其他內存空間的數據。
Ⅸ 緩沖區溢出怎麼辦
Microsoft Internet Explorer plugin.ocx在某些配置環境下存在緩沖區溢出漏洞。程序中的Load()方法可以被提供一個第三方的文件類型,而Load()方法並沒有對其進行充分的邊界檢查,攻擊者可以通過提供一個指向第三方文件的惡意的URL導致緩沖區溢出而執行任意指令,進一步的研究發現這是一個plugin.ocx中的堆溢出
http://..com/question/5118119.html?si=1
2)這是Windows XP SP2新增的一項安全保護功能DEP。當出現緩沖區溢出的時候,DEP將被自動激活並對系統起保護作用。Rundll32.exe在%systemroont%\system32下,這個文件起到調用其他DLL文件並完成DLL裡面指定的涵數的作用。你的問題可能是被調用的DLL文件在設計上有問題,觸發了DEP功能導致執行被終止,要解決這個問題,一是可以進入「系統屬性→高級」,點擊性能下的設置按鈕,然後選擇數據執行保護,選擇「為除下列程序之外的所有程序和服務啟動DEP」,然後點擊添加按鈕,將%systemroont%\system32\rundll32.exe添加進列表,點擊確定重啟即可。第二個方法是徹底關閉DEP,具體操作可以參考http://support.microsoft.com/kb/875352/en-us。
你把explorer.exe 添加到「DEP 例外列表設置」中試試看這種情況還會不會發生。這個程序一般在你系統盤的window目錄下,也就是你的XP所在目錄。 DEP主要是起到數據執行保護的功能,一般情況下不會是病毒。
Ⅹ 電腦緩沖區溢出怎麼解決
清理系統垃圾呀,虛擬內存改到其它盤