當前位置:首頁 » 文件管理 » 緩存區溢出

緩存區溢出

發布時間: 2022-01-30 10:06:42

㈠ 什麼叫緩沖區溢出

緩沖區溢出
緩沖區是內存中存放數據的地方。在程序試圖將數據放到計算機內存中的某一位置,但沒有足夠空間時會發生緩沖區溢出。

緩沖區是程序運行時計算機內存中的一個連續的塊,它保存了給定類型的數據。問題隨著動態分配變數而出現。為了不用太多的內存,一個有動態分配變數的程序在程序運行時才決定給他們分配多少內存。如果程序在動態分配緩沖區放入太多的數據會有什麼現象?它溢出了,漏到了別的地方。一個緩沖區溢出應用程序使用這個溢出的數據將匯編語言代碼放到計算機的內存中,通常是產生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, 這超出了程序的地址空間,所以出現段錯誤。可見,緩沖區溢出允許我們改變一個函數的返回地址。通過這種方式,可以改變程序的執行順序。

㈡ 如何防止緩沖區溢出

緩沖區溢出主要是一個 C/C++ 問題。盡管在通常情況下它很容易修補。但它們仍然是一種對安全代碼的威脅。不管是用戶也好,程序的攻擊者也好,當提供的數據長度大於應用程序預期的長度時,便會發生緩沖區溢出,此時數據會溢出到內部存儲器空間。有兩種緩沖區溢出不明顯且難以修復。一是開發人員沒有預料到外部提供的數據會比內部緩沖區大。溢出導致了內存中其他數據結構的破壞,這種破壞通常會被攻擊者利用,以運行惡意代碼。二是數組索引錯誤也會造成緩沖區下溢和超限,但這種情況沒那麼普遍。請看以下 C++ 代碼片段: void DoSomething(char *cBuffSrc, DWORD cbBuffSrc)
{
char cBuffDest[32];
memcpy(cBuffDest,cBuffSrc,cbBuffSrc);
}

問題在哪裡呢?事實上,如果 cBuffSrc 和 cbBuffSrc 來自可信賴的源(例如不信任數據並因此而驗證數據的有效性和大小的代碼),則這段代碼沒有任何問題。然而,如果數據來自不可信賴的源,也未得到驗證,那麼攻擊者(不可信賴源)很容易就可以使 cBuffSrc 比 cBuffDest 大,同時也將 cbBuffSrc 設定為比 cBuffDest 大。當 memcpy 將數據復制到 cBuffDest 中時,來自 DoSomething 的返回地址就會被更改,因為 cBuffDest 在函數的堆棧框架上與返回地址相鄰,此時攻擊者即可通過代碼執行一些惡意操作。彌補的方法就是不要信任用戶的輸入,並且不信任 cBuffSrc 和 cbBuffSrc 中攜帶的任何數據:

void DoSomething(char *cBuffSrc, DWORD cbBuffSrc)
{
const DWORD cbBuffDest = 32;
char cBuffDest[cbBuffDest];

#ifdef _DEBUG
memset(cBuffDest, 0x33, cbBuffSrc);
#endif
memcpy(cBuffDest, cBuffSrc, min(cbBuffDest, cbBuffSrc));
}

此函數展示了一個能夠減少緩沖區溢出的正確編寫的函數的三個特性。首先,它要求調用者提供緩沖區的長度。當然,您不能盲目相信這個值!接下來,在一個調試版本中,代碼將探測緩沖區是否真的足夠大,以便能夠存放源緩沖區。如果不能,則可能觸發一個訪問沖突並把代碼載入調試器。在調試時,您會驚奇地發現竟有如此多的錯誤。最後也是最重要的是,對 memcpy 的調用是防禦性的,它不會復制多於目標緩沖區存放能力的數據

㈢ 緩沖區溢出是怎麼回事怎麼解決啊

緩沖區是內存中存放數據的地方。在程序試圖將數據放到計算機內存中的某一位置,但沒有足夠空間時會發生緩沖區溢出。

㈣ 路由器的緩存溢出導致是什麼意思

存溢出又稱為緩沖溢出,讓我們先從討論什麼是緩沖區開始,緩沖區指一個
程序的記憶范圍(領域),該領域是用來儲存一些數據,如電腦程序信息,中間
計算結果,或者輸入參數。把數據調入緩沖區之前,程序應該驗證緩沖區有足夠的長度以容納所有這些調入的數據。否則,數據將溢出緩沖區並覆寫在鄰近的數據上,當它運行時,就如同改寫了程序。
假如溢出的數據是隨意的,那它就不是有效的程序代碼,當它試圖執行這些隨
意數據時,程序就會失敗。另一方面,假如數據是有效的程序代碼,程序將會按照數據提供者所設定的要求執行代碼和新的功能。

㈤ 關於電腦!什麼是「緩沖區溢出」

什麼是緩沖區溢出

單的說就是程序對接受的輸入數據沒有進行有效的檢測導致錯誤,後果可能造成程序崩潰或者執行攻擊者的命令,詳細的資料可以看unsecret.org的漏洞利用欄目 。
緩沖區溢出的概念

緩沖區溢出好比是將十磅的糖放進一個只能裝五磅的容器里……

堆棧溢出(又稱緩沖區溢出)攻擊是最常用的黑客技術之一。我們知道,UNIX本身以及其上的許多應用程序都是用C語言編寫的,C語言不檢查緩沖區的邊界。在某些情況下,如果用戶輸入的數據長度超過應用程序給定的緩沖區,就會覆蓋其他數據區。這稱作「堆棧溢出或緩沖溢出」。

一般情況下,覆蓋其他數據區的數據是沒有意義的,最多造成應用程序錯誤。但是,如果輸入的數據是經過「黑客」精心設計的,覆蓋堆棧的數據恰恰是黑客的入侵程序代碼,黑客就獲取了程序的控制權。如果該程序恰好是以root運行的,黑客就獲得了root許可權,然後他就可以編譯黑客程序、留下入侵後門等,實施進一步地攻擊。按照這種原理進行的黑客入侵就叫做「堆棧溢出攻擊」。

為了便於理解,我們不妨打個比方。緩沖區溢出好比是將十磅的糖放進一個只能裝五磅的容器里。一旦該容器放滿了,餘下的部分就溢出在櫃台和地板上,弄得一團糟。由於計算機程序的編寫者寫了一些編碼,但是這些編碼沒有對目的區域或緩沖區——五磅的容器——做適當的檢查,看它們是否夠大,能否完全裝入新的內容——十磅的糖,結果可能造成緩沖區溢出的產生。如果打算被放進新地方的數據不適合,溢得到處都是,該數據也會製造很多麻煩。但是,如果緩沖區僅僅溢出,這只是一個問題。到此時為止,它還沒有破壞性。當糖溢出時,櫃台被蓋住。可以把糖擦掉或用吸塵器吸走,還櫃台本來面貌。與之相對的是,當緩沖區溢出時,過剩的信息覆蓋的是計算機內存中以前的內容。除非這些被覆蓋的內容被保存或能夠恢復,否則就會永遠丟失。

在丟失的信息里有能夠被程序調用的子程序的列表信息,直到緩沖區溢出發生。另外,給那些子程序的信息——參數——也丟失了。這意味著程序不能得到足夠的信息從子程序返回,以完成它的任務。就像一個人步行穿過沙漠。如果他依賴於他的足跡走回頭路,當沙暴來襲抹去了這些痕跡時,他將迷失在沙漠中。這個問題比程序僅僅迷失方向嚴重多了。入侵者用精心編寫的入侵代碼(一種惡意程序)使緩沖區溢出,然後告訴程序依據預設的方法處理緩沖區,並且執行。此時的程序已經完全被入侵者操縱了。

入侵者經常改編現有的應用程序運行不同的程序。例如,一個入侵者能啟動一個新的程序,發送秘密文件(支票本記錄,口令文件,或財產清單)給入侵者的電子郵件。這就好像不僅僅是沙暴吹了腳印,而且後來者也會踩出新的腳印,將我們的迷路者領向不同的地方,他自己一無所知的地方。

緩沖區溢出的處理

你屋子裡的門和窗戶越少,入侵者進入的方式就越少……

由於緩沖區溢出是一個編程問題,所以只能通過修復被破壞的程序的代碼而解決問題。如果你沒有源代碼,從上面「堆棧溢出攻擊」的原理可以看出,要防止此類攻擊,我們可以:

1、開放程序時仔細檢查溢出情況,不允許數據溢出緩沖區。由於編程和編程語言的原因,這非常困難,而且不適合大量已經在使用的程序;

2、使用檢查堆棧溢出的編譯器或者在程序中加入某些記號,以便程序運行時確認禁止黑客有意造成的溢出。問題是無法針對已有程序,對新程序來講,需要修改編譯器;

3、經常檢查你的操作系統和應用程序提供商的站點,一旦發現他們提供的補丁程序,就馬上下載並且應用在系統上,這是最好的方法。但是系統管理員總要比攻擊者慢一步,如果這個有問題的軟體是可選的,甚至是臨時的,把它從你的系統中刪除。舉另外一個例子,你屋子裡的門和窗戶越少,入侵者進入的方式就越少。

㈥ 數據溢出是什麼意思

在計算機中,當要表示的數據超出計算機所使用的數據的表示範圍時,則產生數據的溢出,這種現象叫做數據溢出。

例如,一數據源不斷發送數據,進入緩存區,再從緩存埠輸出。但是若數據寫入的速率大於數據讀出的速率,那麼緩存器遲早要被數據占滿,若不採取一定措施(如暫停寫入數據),那麼數據就會溢出,這樣會導致數據的丟失。

數據溢出的的原因

當應用程序讀取用戶(也可能是惡意攻擊者)數據,試圖復制到應用程序開辟的內存緩沖區中,卻無法保證緩沖區的空間足夠時(換言之,假設代碼申請了N位元組大小的內存緩沖區,隨後又向其中復制超過N位元組的數據),內存緩沖區就可能會溢出。

最重要的是,C/C++編譯器開辟的內存緩沖區常常鄰近重要的數據結構。假設某個函數的堆棧緊接在在內存緩沖區後面時,其中保存的函數返回地址就會與內存緩沖區相鄰。

此時,惡意攻擊者就可以向內存緩沖區復制大量數據,從而使得內存緩沖區溢出並覆蓋原先保存於堆棧中的函數返回地址。這樣,函數的返回地址就被攻擊者換成了他指定的數值;一旦函數調用完畢,就會繼續執行「函數返回地址」處的代碼。

㈦ 緩沖區溢出的問題

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],當然會溢出了.

㈧ 什麼是緩沖區溢出

緩沖區溢出是指當計算機向緩沖區內填充數據位數時超過了緩沖區本身的容量溢出的數據覆蓋在合法數據上,理想的情況是 程序檢查數據長度並不允許輸入超過緩沖區長度的字元,但是絕大多數程序都會假設數據長度總是與所分配的儲存空間想匹配,這就為緩沖區溢出埋下隱患.

操作系統所使用的緩沖區又被稱為堆棧. 在各個操作進程之間,指令會被臨時儲存在堆棧當中,堆棧也會出現緩沖區溢出.

緩沖區溢出有時又稱為堆棧溢出攻擊,是過去的十多年裡,網路安全漏洞常用的一種形式並且易於擴充。相比於其他因素,緩沖區溢出是網路受到攻擊的主要原因。

例如:計算機在內存中存儲了所有的東西,包括程序、數據和圖片。如果計算機要求用戶輸入8位字元密碼卻接收到了200位字元的密碼,多出來的字元可以寫在內存中的其他地方。但事實並不是這樣。這就是個小錯誤。

_______________________________________________________
緩沖區溢出的處理

由於緩沖區溢出是一個編程問題,所以只能通過修復被破壞的程序的代碼而解決問題。如果你沒有源代碼,從上面「堆棧溢出攻擊」的原理可以看出,要防止此類攻擊,我們可以:

1、開放程序時仔細檢查溢出情況,不允許數據溢出緩沖區。由於編程和編程語言的原因,這非常困難,而且不適合大量已經在使用的程序;

2、使用檢查堆棧溢出的編譯器或者在程序中加入某些記號,以便程序運行時確認禁止黑客有意造成的溢出。問題是無法針對已有程序,對新程序來講,需要修改編譯器;

3、經常檢查你的操作系統和應用程序提供商的站點,一旦發現他們提供的補丁程序,就馬上下載並且應用在系統上,這是最好的方法。但是系統管理員總要比攻擊者慢一步,如果這個有問題的軟體是可選的,甚至是臨時的,把它從你的系統中刪除。舉另外一個例子,你屋子裡的門和窗戶越少,入侵者進入的方式就越少。

㈨ 路由器的緩存溢出導致是什麼意思

存溢出又稱為緩沖溢出,讓我們先從討論什麼是緩沖區開始,緩沖區指一個 程序的記憶范圍(領域),該領域是用來儲存一些數據,如電腦程序信息,中間 計算結果,或者輸入參數。把數據調入緩沖區之前,程序應該驗證緩沖區有足夠的長度以容納所有這些調入的數據。否則,數據將溢出緩沖區並覆寫在鄰近的數據上,當它運行時,就如同改寫了程序。 假如溢出的數據是隨意的,那它就不是有效的程序代碼,當它試圖執行這些隨 意數據時,程序就會失敗。另一方面,假如數據是有效的程序代碼,程序將會按照數據提供者所設定的要求執行代碼和新的功能。

㈩ 緩沖區溢出的概念

計算機程序一般都會使用到一些內存,這些內存或是程序內部使用,或是存放用戶的輸入數據,這樣的內存一般稱作緩沖區。溢出是指盛放的東西超出容器容量而溢出來了,在計算機程序中,就是數據使用到了被分配內存空間之外的內存空間。而緩沖區溢出,簡單的說就是計算機對接收的輸入數據沒有進行有效的檢測(理想的情況是程序檢查數據長度並不允許輸入超過緩沖區長度的字元),向緩沖區內填充數據時超過了緩沖區本身的容量,而導致數據溢出到被分配空間之外的內存空間,使得溢出的數據覆蓋了其他內存空間的數據。

熱點內容
超級訪問董卿 發布:2024-10-20 07:44:35 瀏覽:235
ueditor多圖上傳 發布:2024-10-20 07:43:03 瀏覽:725
三星on7配置怎麼樣 發布:2024-10-20 07:39:26 瀏覽:430
android第三方so 發布:2024-10-20 07:37:52 瀏覽:881
瀏覽器書簽文件夾 發布:2024-10-20 07:32:47 瀏覽:169
vbnet文件夾選擇 發布:2024-10-20 07:19:28 瀏覽:311
jira國內訪問慢 發布:2024-10-20 07:08:29 瀏覽:697
舊密碼在哪裡找 發布:2024-10-20 06:48:59 瀏覽:827
存儲rpo 發布:2024-10-20 06:30:03 瀏覽:232
如何看蘋果手機型號配置 發布:2024-10-20 06:29:56 瀏覽:128