23.緩衝區溢出

一.緩衝區溢出是指當計算機向緩衝區內填充數據位數時超過了緩衝區本身的容量,溢出的數據覆蓋在合法數據上。理想的情況是:程序會檢查數據長度,而且並不允許輸入超過緩衝區長度的字符。但是絕大多數程序都會假設數據長度總是與所分配的儲存空間相匹配,這就爲緩衝區溢出埋下隱患。操作系統所使用的緩衝區,又被稱爲“堆棧”,在各個操作進程之間,指令會被臨時儲存在“堆棧”當中,“堆棧”也會出現緩衝區溢出。

二.原理

通過往程序的緩衝區寫超出其長度的內容,造成緩衝區的溢出,從而破壞程序的堆棧,使程序轉而執行其它指令,以達到***的目的。造成緩衝區溢出的原因是程序中沒有仔細檢查用戶輸入的參數。例如下面程序:
voidfunction(char*str){
charbuffer[16];strcpy(buffer,str);
}
上面的strcpy()將直接把str中的內容copy到buffer中。這樣只要str的長度大於16,就會造成buffer的溢出,使程序運行出錯。存在像strcpy這樣的問題的標準函數還有strcat()、sprintf()、vsprintf()、gets()、scanf()等。

緩衝區溢出***的目的在於擾亂具有某些特權運行的程序的功能,這樣可以使得***者取得程序的控制權,如果該程序具有足夠的權限,那麼整個主機就被控制了。

爲了達到這個目的,***者必須達到如下的兩個目標:

⒈在程序的地址空間裏安排適當的代碼。
⒉通過適當的初始化寄存器和內存,讓程序跳轉到***者安排的地址空間執行。
根據這兩個目標來對緩衝區溢出***進行分類。
三.防範方法
目前有四種基本的方法保護緩衝區免受緩衝區溢出的***和影響。
1通過操作系統使得緩衝區不可執行,從而阻止***者植入***代碼。
2強制寫正確的代碼的方法。
3利用編譯器的邊界檢查來實現緩衝區的保護。這個方法使得緩衝區溢出不可能出現,從而完全消除了緩衝區溢出的威脅,但是相對而言代價比較大。
4介紹一種間接的方法,這個方法在程序指針失效前進行完整性檢查。雖然這種方法不能使得所有的緩衝區溢出失效,但它能阻止絕大多數的緩衝區溢出***。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章