2012-12-13 36 views

回答

1

即使堆棧不可執行,它可以被更改...導致例程返回到不同的地址(因爲返回地址通常存儲在堆棧中)。

如果是可執行的,數據可以被寫入到包含有效的操作碼和返回地址可被操縱返回到該代碼。

諸如DEP(Data Execution Prevention)和NX(Never Execute)之類的技術可以保護堆和堆棧免於執行。

0

可執行堆棧的主要歷史原因是與一種鮮爲人知並且很少使用的名爲「嵌套函數」的GCC功能的兼容性,這些功能相當於具有自動存儲持續時間的閉包。如果你使用嵌套函數的地址,程序必須生成一段代碼,稱爲蹦牀,以加載一個指向實際函數將使用的數據的隱藏參數。這段代碼位於堆棧上。

請注意,嵌套的函數不是C語言的一部分,並且C語言中沒有任何理由使堆棧可執行。 C甚至不要求代碼和數據位於公共地址空間中。因此,不旨在支持非標準擴展(如嵌套函數)的實現不應提供可執行堆棧,因爲它們會增加程序可能存在的任何安全漏洞的危險。

0

爲什麼堆棧可執行?因爲較早的x86 MMU(內存管理單元)每頁只有一個訪問位。這些值是read-execute或read-write-execute。帶有DEP和NX的新芯片每頁添加了一點,以便對執行權限進行細粒度控制。

+0

啊,我明白了。謝謝。 – coinsyx