引言:棧溢出攻擊是通過構造特殊的代碼來達到溢出攻擊的一種攻擊方式,可以造成系統異常甚至獲取計算機權限等危害。本文通過對棧的結構分析,探討了棧溢出的形成原理及防范辦法,是提高軟件的安全性、網絡的安全性的一個重要部分。
程序在開發過程中,出現溢出錯誤是正常現象,也是一種較嚴重的程序錯誤,因為溢出錯誤不僅僅會造成程序的異常、丟失數據等問題,嚴重時還會造成操作系統的異常甚至崩潰。
程序在運行過程中,進程會被加載到內存的不同區域中執行,而按功能劃分,進程所使用的內存空間可以分成四類:1.數據區,用來存儲全局變量、常量等;2.棧區,用來存儲函數間的調用關系,從而保證函數調用結束后,返回到調用點繼續向下執行;3.堆區,是系統動態分配和回收的一段特殊內存空間,進程可以動態地申請,作為緩沖區來使用,使用完成后,按照不同的堆算法回收;4.代碼區,用于存儲程序執行過程中的機器指令,CPU會按照程序執行流程逐條取出后依次執行。
上述四類內存空間中,棧區是由操作系統自動維護的,這是保證函數調用的基礎,也是簡化程序設計的難度和降低程序的復雜度。一般來說,棧的絕大多數操作,如PUSH、POP等,對于C語言等高級設計語言來說都是透明的,操作系統都有豐富、完善的函數、接口等供程序員直接調用。同一個文件的不同函數的代碼在內存代碼區中的分布的先后順序也不固定,一般是根據一定的內存分配算法來隨機分配的。……