我們在做專案的過程中遇到過乙個問題:開啟底層板卡,對板卡進行讀寫的時候,板卡的控制代碼莫名奇妙改變了,而我們沒有顯式改變過它。
其實這是一類問題,就是區域性變數莫名其妙被修改。這是由於堆疊的緩衝區溢位造成的,主要現象是:1.某些區域性變數莫名其妙被改 2.函式返回的時候崩潰
主要原因是:1. 陣列越界 2.某些緩衝區拷貝函式如 sprintf ,strcpy,memcpy緩衝區溢位,在strcpy時是否注意『\0'。
我們假設程式執行的棧是滿遞減的,那麼程式在呼叫函式壓棧過程如下:過程a呼叫過程b
a的棧幀在呼叫b之前,先將b的函式引數入棧,並將返回位址入棧,最後a的%ebp入棧,然後mov %esp,%ebp,進入b的棧幀。在b的棧中首先會申請所有的區域性變數的棧空間,無論如何,陣列中靠後的數一定比靠前的數的棧位址高,如a[8]會在高棧位址,a[0]在低端位址,因此a[8]之上還有其它區域性變數,如果a陣列溢位,會覆蓋掉其它區域性變數,甚至會覆蓋掉過程b的返回位址導致程式崩潰。
以上是棧緩衝區溢位導致程式設計過程中的錯誤,還有一種情況是:某些全域性變數被修改,或者程式呼叫不正常。這個我們用凌明老師給出的圖來解釋,如下,這個過程原因是堆疊溢位,即堆疊不夠用,溢位的資料覆蓋了相鄰的全域性後者靜態資料區導致的。
分類:
計算機技術
堆疊式緩衝區溢位
通過這段 大家可以實驗一下,使用者的輸入真的把函式原先的返回位址給改變了,從而也就改變了程式的執行流向,而具體流向 也是完全可以控制的,而利用這類漏洞就是要將程式的執行流向重定向到一段執行使用者 這裡指攻擊者 希望的功能 例如種植特洛伊木馬 的機器碼處,這樣就能完全控制有這種漏洞的計算機了,當然,實...
緩衝區溢位
緩衝區溢位是指當電腦程式向緩衝區內填充的資料位數超過了緩衝區本身的容量。溢位的資料覆蓋在合法資料上。理想情況是,程式檢查資料長度並且不允許輸入超過緩衝區長度的字串。但是絕大多數程式都會假設資料長度總是與所分配的儲存空間相匹配,這就為緩衝區溢位埋下隱患。作業系統所使用的緩衝區又被稱為堆疊,在各個操作程...
緩衝區溢位
緩衝區溢位,簡單的說就是計算機對接收的輸入資料沒有進行有效的檢測 理想的情況是程式檢查資料長度並不允許輸入超過緩衝區長度的字元 向緩衝區內填充資料時超過了緩衝區本身的容量,而導致資料溢位到被分配空間之外的記憶體空間,使得溢位的資料覆蓋了其他記憶體空間的資料。通過往程式的緩衝區寫超出其長度的內容,造成...