首先要知道什麼是緩衝區,緩衝區,簡單說來是一塊連續的計算機記憶體區域, 可以儲存相同資料型別的多個例項。
你一定用strcpy拷貝過字串吧?那,如果拷貝時目的字串的緩衝區的長度小於源字串的長度,會發生什麼呢?對,源字串中多餘的字元會覆蓋掉程序的其它資料。這種現象就叫緩衝區溢位。根據被覆蓋資料的位置的不同,緩衝區溢位分為靜態儲存區溢位、棧溢位和堆溢位三種。而發生溢位後,程序可能的表現也有三種:一是執行正常,這時,被覆蓋的是無用資料,並且沒有發生訪問違例;二是執行出錯,包括輸出錯誤和非法操作等;第三種就是受到攻擊,程式開始執行有害**,此時,哪些資料被覆蓋和用什麼資料來覆蓋都是攻擊者精心設計的。一般情況下,靜態儲存區和堆上的緩衝區溢位漏洞不大可能被攻擊者利用,而棧上的漏洞則具有極大的危險性。
緩衝區溢位是指當電腦程式向緩衝區內填充的資料位數超過了緩衝區本身的容量。溢位的資料覆蓋在合法資料上。理想情況是,程式檢查資料長度並且不允許輸入超過緩衝區長度的字串。但是絕大多數程式都會假設資料長度總是與所分配的儲存空間相匹配,這就為緩衝區溢位埋下隱患。作業系統所使用的緩衝區又被稱為堆疊,在各個操作程序之間,指令被臨時儲存在堆疊當中,堆疊也會出現緩衝區溢位。
標準c語言具有許多複製和新增字串的函式,這使得標準c語言很難進行邊界檢查。c++略微好一些,但是仍然存在緩衝區溢位。一般情況下,覆蓋其他資料區的資料是沒有意義的,最多造成應用程式錯誤,但是,如果輸入的資料是經過「黑客」或者病毒精心設計的,覆蓋緩衝區的資料恰恰是「黑客」或者病毒的入侵程式**,一旦多餘位元組被編譯執行,「黑客」或者病毒就有可能為所欲為,獲取系統的控制權。
首先我們用dev-c++編譯如下c語言程式 分析這個程式我們把10個「a」儲存在bigbuff中 但是我們只分配5bit去存放 由於c語言具有許多複製和新增字串的函式(如以下的strcpy函式),這使得標準c語言很難進行邊界檢查,因此造成了緩衝區溢位。
我們將編譯好的overflow.exe可執行程式拖入虛擬機器中 用ollydbg開啟,如下圖所示,olldbg的左上部分是反彙編編輯視窗,右上部分是暫存器視窗,左下部分是資料區視窗,右下部分是堆疊視窗。
我們使用f4執行到選定的位置
然後單步除錯 到strcpy()執行完 這樣就造成了一次緩衝區溢位
了解攻擊原理是為了能更好的進行防禦,最後簡要的說明一下如何防範這類攻擊的發生。
(1)關閉不需要的特權程式。
(2)及時給系統和服務程式漏洞打補丁。
(3)強制寫正確的**。
(4)通過作業系統使得緩衝區不可執行,從而阻止攻擊者植入攻擊**。
(5)利用編譯器的邊界檢查來實現緩衝區的保護,這個方法使得緩衝區溢位不可能出現,從而完全消除了緩衝區溢位的威脅,但是代價比較大。
(6)在程式指標失效前進行完整性檢查。
(7)改進系統內部安全機制。
緩衝區溢位
緩衝區溢位是指當電腦程式向緩衝區內填充的資料位數超過了緩衝區本身的容量。溢位的資料覆蓋在合法資料上。理想情況是,程式檢查資料長度並且不允許輸入超過緩衝區長度的字串。但是絕大多數程式都會假設資料長度總是與所分配的儲存空間相匹配,這就為緩衝區溢位埋下隱患。作業系統所使用的緩衝區又被稱為堆疊,在各個操作程...
緩衝區溢位
緩衝區溢位,簡單的說就是計算機對接收的輸入資料沒有進行有效的檢測 理想的情況是程式檢查資料長度並不允許輸入超過緩衝區長度的字元 向緩衝區內填充資料時超過了緩衝區本身的容量,而導致資料溢位到被分配空間之外的記憶體空間,使得溢位的資料覆蓋了其他記憶體空間的資料。通過往程式的緩衝區寫超出其長度的內容,造成...
緩衝區溢位 棧溢位
1 緩衝區概念 緩衝區 buffer 又稱為快取,它是記憶體空間的一部分。也就是說,在記憶體空間中預留了一定的儲存空間,這些儲存空間用來緩衝輸入或輸出的資料,這部分預留的空間就叫做緩衝區。使用緩衝區有兩個好處 1 減少實際物理讀寫次數 2 緩衝區在建立時就被分配記憶體,這塊記憶體區域一直被重用,可以...