2011-12-09 42 views
1

在對這個答案 - can i implement counter in the .text area without using registers?收到負面評論之後,我進行了一些調查,試圖瞭解RWX記憶頁面是否真的非常用並且很少見,或者每個流行的程序都有一些。 (Science!RWX記憶頁面的風險

我連接到MSVS通過WinDBG中,執行!address /f:Image,PAGE_EXECUTE_READWRITE
,我看到像這樣的很多線路:

7a534000 7a537000  3000 MEM_IMAGE MEM_COMMIT PAGE_EXECUTE_READWRITE    Image "C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\System\6836a951700c2eb01a933212425cda4e\System.ni.dll" 

我檢查它的部分,並有.xdata節以「執行讀寫「旗幟。

這是否意味着每個加載了.NET庫的應用程序都有RWX內存頁?
您的瀏覽器,例如(如果您運行Windows)。(幸運的是,既不FF8,也不IE8不使用.NET)

那麼,爲什麼我們打擾RWX內存呢?

+0

這就是即時編譯器的本質,生成代碼並立即執行它。如果代碼是可預測的,則NX很重要。 –

+0

@HansPassant,但將它保留在已知RVA的RWX部分中是不安全的(幾乎所有進程都可能具有相同的虛擬地址)。 – Abyx

回答

0

我的直覺是這可能不是問題。這可能是運行時環境支持動態行爲所必需的。

存儲器區域既存在可寫和可執行的安全問題。這允許攻擊者用shellcode填充緩衝區,然後執行此代碼。用shellcode填充緩衝區並不是什麼大事,它只是數據。問題出現在攻擊者能夠控制指令指針(EIP)時,通常是通過使用基於堆棧的緩衝區溢出破壞函數的堆棧幀,然後通過將此指針指定給shellcode的地址來更改執行流程(或在nop雪橇中的某個地方將會碰到shellcode)。

如果你想更好地理解這個安全措施,那麼看看在NX位出現之前哪些緩衝區溢出會被利用。你應該閱讀經典文章Smashing the Stack for Fun and Profit。請記住,由於NX位,ASLR和canaries,這些攻擊都不再起作用。