簡體   English   中英

需要可執行的堆棧和堆內存

[英]Need of executable stack and heap memory

我們知道,使虛擬內存的堆棧和堆區域不可執行可以防止內存內部執行惡意代碼(如Shellcode)(該技術稱為“ 數據執行保護” )。 而且,將惡意代碼注入內存的最簡單方法是使緩沖區溢出。 因此,使存儲器的這些區域不可執行可以幫助降低溢出攻擊的嚴重性。

但是,還有許多其他技術可用來防止此類攻擊,例如地址空間隨機化,指針保護,使用金絲雀等。 我認為大多數系統都使用這些其他方法來代替使堆棧/堆內存不可執行。(如果我錯了,請糾正我)

現在,我的問題是,是否存在某些特定的操作或特殊情況要求內存的堆棧/堆部分是可執行的?

JIT映射內存的可寫區域和可執行區域,或者簡單地mprotect先前分配的內存以使其可執行。

GCC過去需要一種依賴於系統的方法來為堆棧中的蹦床代碼標記可執行的部分。 但是這是12年前的事,我不知道今天是如何完成的。

許多系統上的動態鏈接還需要具有寫入跳轉表的功能,以便在運行時解析函數調用。 如果您要讓跳轉表在兩次表更新之間不可寫,那可能會非常昂貴。

通常,可以通過嘗試在內存是可寫或可執行的情況下執行策略來安全地解決這些問題,但絕不能兩者都執行。 可以在需要完成寫操作時將內存重新映射為可寫的,然后再次對其進行保護以使其可執行。 為了獲得更好的安全性和稍微復雜的代碼,它會犧牲一些性能(不是很多)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM