我電腦提示我"緩存溢出"怎么辦啊?高手教教我
你把菜單欄里“工具”—“配置”里面的第一項“常規(guī)”里的“磁盤緩存”設小些試一下!
設小些,一般是1024KB或是2048KB,和文件長度沒有關系的,這個“緩存”的意思就是每當下載1024KB或2048KB的時候再存到你的硬盤里,之前是存在緩存里的。
些Sasr代碼(可以說是插件或木馬之類)穿過未打補丁的防火墻,到達沒有防護的服務器。當代碼進入沒有防護服務器的內(nèi)存時,它馬上執(zhí)行緩存器溢出,將服務器系統(tǒng)級的控制權交給了遠端的主機,實現(xiàn)在企業(yè)網(wǎng)內(nèi)的遠程控制。
卡巴六正是針對Web瀏覽器或者其他最終用戶網(wǎng)絡應用的的漏洞防御,并可以檢測和防止受保護計算機上運行的任何應用遭受緩存溢出攻擊,防治計算機收到傷害,你拒絕的時候沒有“以后都這樣操作”的提示嗎?如果沒有,建議不要瀏覽該網(wǎng)頁了!
溫馨提醒:上網(wǎng)的時候最好不要用IE上網(wǎng),因為80%病毒都是針對IE的(也就是WINDOW),如果使用第三方面的瀏覽器,將會大大降低中毒的幾率!
緩沖區(qū)溢出的基本原理是什么
緩沖區(qū)溢出的原理:
通過往程序的緩沖區(qū)寫超出其長度的內(nèi)容,造成緩沖區(qū)的溢出,從而破壞程序的堆棧,使程序轉(zhuǎn)而執(zhí)行其它指令,以達到攻擊的目的。造成緩沖區(qū)溢出的原因是程序中沒有仔細檢查用戶輸入的參數(shù)。例如下面程序:
void function(char *str) {
char buffer[16];
strcpy(buffer,str);
}
上面的strcpy()將直接吧str中的內(nèi)容copy到buffer中。這樣只要str的長度大于16,就會造成buffer的溢出,使程序運行出錯。存在象strcpy這樣的問題的標準函數(shù)還有strcat(),sprintf(),vsprintf(),gets(),scanf()等。
漏洞:
緩沖區(qū)溢出攻擊的目的在于擾亂具有某些特權運行的程序的功能,這樣可以使得攻擊者取得程序的控制權,如果該程序具有足夠的權限,那么整個主機就被控制了。一般而言,攻擊者攻擊root程序,然后執(zhí)行類似“exec(sh)”的執(zhí)行代碼來獲得root權限的shell。為了達到這個目的,攻擊者必須達到如下的兩個目標:
在程序的地址空間里安排適當?shù)拇a。
通過適當?shù)某跏蓟拇嫫骱蛢?nèi)存,讓程序跳轉(zhuǎn)到入侵者安排的地址空間執(zhí)行。
可以根據(jù)這兩個目標來對緩沖區(qū)溢出攻擊進行分類。
以上內(nèi)容參考:百度百科-緩沖區(qū)溢出
電腦緩沖區(qū)溢出怎么解決
緩沖區(qū)溢出是指當計算機程序向緩沖區(qū)內(nèi)填充的數(shù)據(jù)位數(shù)超過了緩沖區(qū)本身的容量。溢出的數(shù)據(jù)覆蓋在合法數(shù)據(jù)上。理想情況是,程序檢查數(shù)據(jù)長度并且不允許輸入超過緩沖區(qū)長度的字符串。但是絕大多數(shù)程序都會假設數(shù)據(jù)長度總是與所分配的存儲空間相匹配,這就為緩沖區(qū)溢出埋下隱患。操作系統(tǒng)所使用的緩沖區(qū)又被稱為堆棧,在各個操作進程之間,指令被臨時存儲在堆棧當中,堆棧也會出現(xiàn)緩沖區(qū)溢出。 當一個超長的數(shù)據(jù)進入到緩沖區(qū)時,超出部分就會被寫入其他緩沖區(qū),其他緩沖區(qū)存放的可能是數(shù)據(jù)、下一條指令的指針,或者是其他程序的輸出內(nèi)容,這些內(nèi)容都被覆蓋或者破壞掉。可見一小部分數(shù)據(jù)或者一套指令的溢出就可能導致一個程序或者操作系統(tǒng)崩潰。
什么是緩沖區(qū)溢出
緩沖區(qū)溢出是指當計算機向緩沖區(qū)內(nèi)填充數(shù)據(jù)位數(shù)時超過了緩沖區(qū)本身的容量溢出的數(shù)據(jù)覆蓋在合法數(shù)據(jù)上,理想的情況是 程序檢查數(shù)據(jù)長度并不允許輸入超過緩沖區(qū)長度的字符,但是絕大多數(shù)程序都會假設數(shù)據(jù)長度總是與所分配的儲存空間想匹配,這就為緩沖區(qū)溢出埋下隱患.
操作系統(tǒng)所使用的緩沖區(qū)又被稱為堆棧. 在各個操作進程之間,指令會被臨時儲存在堆棧當中,堆棧也會出現(xiàn)緩沖區(qū)溢出.
緩沖區(qū)溢出有時又稱為堆棧溢出攻擊,是過去的十多年里,網(wǎng)絡安全漏洞常用的一種形式并且易于擴充。相比于其他因素,緩沖區(qū)溢出是網(wǎng)絡受到攻擊的主要原因。
例如:計算機在內(nèi)存中存儲了所有的東西,包括程序、數(shù)據(jù)和圖片。如果計算機要求用戶輸入8位字符密碼卻接收到了200位字符的密碼,多出來的字符可以寫在內(nèi)存中的其他地方。但事實并不是這樣。這就是個小錯誤。
_______________________________________________________
緩沖區(qū)溢出的處理
由于緩沖區(qū)溢出是一個編程問題,所以只能通過修復被破壞的程序的代碼而解決問題。如果你沒有源代碼,從上面“堆棧溢出攻擊”的原理可以看出,要防止此類攻擊,我們可以:
1、開放程序時仔細檢查溢出情況,不允許數(shù)據(jù)溢出緩沖區(qū)。由于編程和編程語言的原因,這非常困難,而且不適合大量已經(jīng)在使用的程序;
2、使用檢查堆棧溢出的編譯器或者在程序中加入某些記號,以便程序運行時確認禁止黑客有意造成的溢出。問題是無法針對已有程序,對新程序來講,需要修改編譯器;
3、經(jīng)常檢查你的操作系統(tǒng)和應用程序提供商的站點,一旦發(fā)現(xiàn)他們提供的補丁程序,就馬上下載并且應用在系統(tǒng)上,這是最好的方法。但是系統(tǒng)管理員總要比攻擊者慢一步,如果這個有問題的軟件是可選的,甚至是臨時的,把它從你的系統(tǒng)中刪除。舉另外一個例子,你屋子里的門和窗戶越少,入侵者進入的方式就越少。
什么叫緩沖區(qū)溢出
緩沖區(qū)溢出
緩沖區(qū)是內(nèi)存中存放數(shù)據(jù)的地方。在程序試圖將數(shù)據(jù)放到計算機內(nèi)存中的某一位置,但沒有足夠空間時會發(fā)生緩沖區(qū)溢出。
緩沖區(qū)是程序運行時計算機內(nèi)存中的一個連續(xù)的塊,它保存了給定類型的數(shù)據(jù)。問題隨著動態(tài)分配變量而出現(xiàn)。為了不用太多的內(nèi)存,一個有動態(tài)分配變量的程序在程序運行時才決定給他們分配多少內(nèi)存。如果程序在動態(tài)分配緩沖區(qū)放入太多的數(shù)據(jù)會有什么現(xiàn)象?它溢出了,漏到了別的地方。一個緩沖區(qū)溢出應用程序使用這個溢出的數(shù)據(jù)將匯編語言代碼放到計算機的內(nèi)存中,通常是產(chǎn)生root權限的地方。單單的緩沖區(qū)溢出,并不會產(chǎn)生安全問題。只有將溢出送到能夠以root權限運行命令的區(qū)域才行。這樣,一個緩沖區(qū)利用程序?qū)⒛苓\行的指令放在了有root權限的內(nèi)存中,從而一旦運行這些指令,就是以root權限控制了計算機。總結一下上面的描述。緩沖區(qū)溢出指的是一種系統(tǒng)攻擊的手段,通過往程序的緩沖區(qū)寫超出其長度的內(nèi)容,造成緩沖區(qū)的溢出,從而破壞程序的堆棧,使程序轉(zhuǎn)而執(zhí)行其它指令,以達到攻擊的目的。據(jù)統(tǒng)計,通過緩沖區(qū)溢出進行的攻擊占所有系統(tǒng)攻擊總數(shù)的80%以上。造成緩沖區(qū)溢出的原因是程序中沒有仔細檢查用戶輸入的參數(shù)。例如下面程序:
example0.c
-----------------------------------------------------------
void function(char *str) {
char buffer[16];
strcpy(buffer,str);
}
-----------------------------------------------------------
上面的strcpy()將直接把str中的內(nèi)容copy到buffer中。這樣只要str的長度大于16,就會造成buffer的溢出,使程序運行出錯。存在象strcpy這樣的問題的標準函數(shù)還有strcat(),sprintf(),vsprintf(),gets(),scanf(),以及在循環(huán)內(nèi)的getc(),fgetc(),getchar()等。在C語言中,靜態(tài)變量是分配在數(shù)據(jù)段中的,動態(tài)變量是分配在堆棧段的。緩沖區(qū)溢出是利用堆棧段的溢出的。一個程序在內(nèi)存中通常分為程序段,數(shù)據(jù)端和堆棧三部分。程序段里放著程序的機器碼和只讀數(shù)據(jù),這個段通常是只讀,對它的寫操作是非法的。數(shù)據(jù)段放的是程序中的靜態(tài)數(shù)據(jù)。動態(tài)數(shù)據(jù)則通過堆棧來存放。在內(nèi)存中,它們的位置如下:
/――――――――\ 內(nèi)存低端
|程序段|
|―――――――――|
|數(shù)據(jù)段|
|―――――――――|
|堆棧|
\―――――――――/內(nèi)存高端
堆棧是內(nèi)存中的一個連續(xù)的塊。一個叫堆棧指針的寄存器(SP)指向堆棧的棧頂。堆棧的底部是一個固定地址。堆棧有一個特點就是,后進先出。也就是說,后放入的數(shù)據(jù)第一個取出。它支持兩個操作,PUSH和POP。PUSH是將數(shù)據(jù)放到棧的頂端,POP是將棧頂?shù)臄?shù)據(jù)取出。在高級語言中,程序函數(shù)調(diào)用和函數(shù)中的臨時變量都用到堆棧。參數(shù)的傳遞和返回值是也用到了堆棧。通常對局部變量的引用是通過給出它們對SP的偏移量來實現(xiàn)的。另外還有一個基址指針(FP,在Intel芯片中是BP),許多編譯器實際上是用它來引用本地變量和參數(shù)的。通常,參數(shù)的相對FP的偏移是正的,局部變量是負的。當程序中發(fā)生函數(shù)調(diào)用時,計算機做如下操作:首先把參數(shù)壓入堆棧;然后保存指令寄存器(IP)中的內(nèi)容,做為返回地址(RET);第三個放入堆棧的是基址寄存器(FP);然后把當前的棧指針(SP)拷貝到FP,做為新的基地址;最后為本地變量留出一定空間,把SP減去適當?shù)臄?shù)值。
下面舉個例子:
example1.c:
------------------------------------------------------------
void function(int a, int b, int c) {
char buffer1[5];
char buffer2[10];
}
void main() {
function(1,2,3);
}
-----------------------------------------------------------
為了理解程序是怎樣調(diào)用函數(shù)function()的,使用-S選項,在Linux下,用gcc進行編譯,產(chǎn)生匯編代碼輸出:
$ gcc -S -o example1.s example1.c
看看輸出文件中調(diào)用函數(shù)的那部分:
pushl $3
pushl $2
pushl $1
call function
這就將3個參數(shù)壓到堆棧里了,并調(diào)用function()。指令call會將指令指針I(yè)P壓入堆棧。在返回時,RET要用到這個保存的IP。在函數(shù)中,第一要做的事是進行一些必要的處理。每個函數(shù)都必須有這些過程:
pushl %ebp
movl %esp,%ebp
subl $20,%esp
這幾條指令將EBP,基址指針放入堆棧。然后將當前SP拷貝到EBP。然后,為本地變量分配空間,并將它們的大小從SP里減掉。由于內(nèi)存分配是以字為單位的,因此,這里的buffer1用了8字節(jié)(2個字,一個字4字節(jié))。Buffer2用了12字節(jié)(3個字)。所以這里將ESP減了20。這樣,現(xiàn)在,堆??雌饋響撌沁@樣的。
低端內(nèi)存高端內(nèi)存
buffer2 buffer1 sfp ret a b c
< ------ [ ][ ][ ][ ][ ][ ][ ]
棧頂棧底
緩沖區(qū)溢出就是在一個緩沖區(qū)里寫入過多的數(shù)據(jù)。那怎樣利用呢,看
一下下面程序:
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);
}
------------------------------------------------------------
這個程序是一個經(jīng)典的緩沖區(qū)溢出編碼錯誤。函數(shù)將一個字符串不經(jīng)過邊界檢查,拷貝到另一內(nèi)存區(qū)域。當調(diào)用函數(shù)function()時,堆棧如下:
低內(nèi)存端buffer sfp ret *str高內(nèi)存端
< ------ [ ][ ][ ][ ]
棧頂棧底
很明顯,程序執(zhí)行的結果是"Segmentation fault (core dumped)"或類似的出錯信息。因為從buffer開始的256個字節(jié)都將被*str的內(nèi)容'A'覆蓋,包括sfp, ret,甚至*str。'A'的十六進值為0x41,所以函數(shù)的返回地址變成了0x41414141, 這超出了程序的地址空間,所以出現(xiàn)段錯誤??梢?,緩沖區(qū)溢出允許我們改變一個函數(shù)的返回地址。通過這種方式,可以改變程序的執(zhí)行順序。
緩存區(qū)溢出和格式化字符串攻擊主要是什么原因造成的?
緩沖區(qū)溢出是一種非常普遍、非常危險的漏洞,在各種操作系統(tǒng)、應用軟件中廣泛存在。利用緩沖區(qū)溢出攻擊,可以導致程序運行失敗、系統(tǒng)當機、重新啟動等后果。更為嚴重的是,可以利用它執(zhí)行非授權指令,甚至可以取得系統(tǒng)特權,進而進行各種非法操作。緩沖區(qū)溢出攻擊有多種英文名稱:buffer
overflow,buffer overrun,smash the stack,trash the stack,scribble the
stack, mangle the stack, memory leak,overrun
screw;它們指的都是同一種攻擊手段。第一個緩沖區(qū)溢出攻擊--Morris蠕蟲,發(fā)生在十年前,它曾造成了全世界6000多臺網(wǎng)絡服務器癱瘓。