2013-12-20 45 views
1

擁有調用堆棧允許代碼執行多年來一直是很多安全問題的根源。堆棧緩衝區溢出可用於利用存儲在堆棧緩衝區中的代碼可以執行的寫入不良的軟件。是否有需要讓堆棧可執行?

我只是想知道是否真的有一個原因,它不是隻是不可執行?爲什麼調用堆棧上的任何東西都需要可執行?

或許有一定的歷史原因

回答

7

創建不可執行堆棧需要硬件的幫助。早期的英特爾處理器沒有NX位,直到386或Pentium才真正有用。 (早期的處理器確實沒有執行保護,但它並不普遍)。

在不同時間,人們已經利用可執行堆棧甚至可寫代碼段來編寫自修改程序。我認爲我們都同意自修改代碼是一個壞主意,但我記得當我在80年代開始時,對它有很多興趣。如果拋棄麻煩的限制,如代碼和數據之間的任意分隔,你可以真正寫出一些令人驚訝的緊密程序。說到這一點,執行數據的概念以及在堆棧中存儲大量數據是Lisp的一個重要組成部分。有關這將如何影響JIT編譯器的討論,請參閱Allocating a data page in linux with NX bit turned off。如果你想JIT編譯非常小而且經常的東西,在堆棧上分配和運行它可能很方便。

這就是說,正如你所說,這是一個很大的問題,這就是爲什麼通常會離開它的原因。這將哈佛架構帶入了我們大多數人已經成長起來的馮諾依曼架構。

+0

+1有趣。我從來沒有嘗試在堆棧上編寫自修改代碼 - 這是使它成爲線程安全的一種方式。 –

3

自1940年以來,大多數計算機都故意不可執行和不可執行的內存區分。這個單一的統一代碼和數據模型是Von Neumann architecture的關鍵方面之一。在不同的時間,在各種內存管理設計中引入了一些有限的非執行能力,實際上現在大多數CPU和OS支持將單個內存頁面標記爲不可執行。