1.記憶體溢位問題是 C 語言或者 C++ 語言所固有的缺陷,它們既不檢查陣列邊界,又不檢查型別可靠性(type-safety)。眾所周知,用 C/C++ 語言開發的程式由於目的碼非常接近機器核心,因而能夠直接訪問記憶體和暫存器,這種特性大大提升了 C/C++ 語言程式碼的效能。只要合理編碼,C/C++應用程式在執行效率上必然優於其它高階語言。然而,C/C++ 語言導致記憶體溢位問題的可能性也要大許多。其他語言也存在記憶體溢位問題,但它往往不是程式設計師的失誤,而是應用程式的執行時環境出錯所致。
2. 當應用程式讀取使用者(也可能是惡意攻擊者)資料,試圖複製到應用程式開闢的記憶體緩衝區中,卻無法保證緩衝區的空間足夠時(換言之,假設程式碼申請了 N 位元組大小的記憶體緩衝區,隨後又向其中複製超過 N 位元組的資料)。記憶體緩衝區就可能會溢位。想一想,如果你向 12 盎司的玻璃杯中倒入 16 盎司水,那麼多出來的 4 盎司水怎麼辦?當然會滿到玻璃杯外面了!
資料溢位
在計算機中,當要表示的資料超出計算機所使用的資料的表示範圍時,則產生資料的溢位。
溢位原因
資料型別超過了計算機字長的界限就會出現資料溢位的情況。導致記憶體溢位問題的原因有很多,比如:
(1) 使用非型別安全(non-type-safe)的語言如 C/C++ 等。
(2) 以不可靠的方式存取或者複製記憶體緩衝區。
(3)編譯器設定的記憶體緩衝區太靠近關鍵資料結構。
因素分析
1.記憶體溢位問題是 C 語言或者 C++ 語言所固有的缺陷,它們既不檢查陣列邊界,又不檢查型別可靠性(type-safety)。眾所周知,用 C/C++ 語言開發的程式由於目的碼非常接近機器核心,因而能夠直接訪問記憶體和暫存器,這種特性大大提升了 C/C++ 語言程式碼的效能。只要合理編碼,C/C++應用程式在執行效率上必然優於其它高階語言。然而,C/C++ 語言導致記憶體溢位問題的可能性也要大許多。其他語言也存在記憶體溢位問題,但它往往不是程式設計師的失誤,而是應用程式的執行時環境出錯所致。
2. 當應用程式讀取使用者(也可能是惡意攻擊者)資料,試圖複製到應用程式開闢的記憶體緩衝區中,卻無法保證緩衝區的空間足夠時(換言之,假設程式碼申請了 N 位元組大小的記憶體緩衝區,隨後又向其中複製超過 N 位元組的資料)。記憶體緩衝區就可能會溢位。想一想,如果你向 12 盎司的玻璃杯中倒入 16 盎司水,那麼多出來的 4 盎司水怎麼辦?當然會滿到玻璃杯外面了!
3. 最重要的是,C/C++編譯器開闢的記憶體緩衝區常常鄰近重要的資料結構。假設某個函式的堆疊緊接在在記憶體緩衝區後面時,其中儲存的函式返回地址就會與記憶體緩衝區相鄰。此時,惡意攻擊者就可以向記憶體緩衝區複製大量資料,從而使得記憶體緩衝區溢位並覆蓋原先保存於堆疊中的函式返回地址。這樣,函式的返回地址就被攻擊者換成了他指定的數值;一旦函式呼叫完畢,就會繼續執行“函式返回地址”處的程式碼。非但如此,C++ 的某些其它資料結構,比如 v-table 、例外事件處理程式、函式指標等,也可能受到類似的攻擊。