2016-12-12 137 views
2

在安全領域,有堆挖掘和堆棧粉碎攻擊。爲什麼堆棧或堆段中的代碼可以執行?

但我發現/proc/*/maps文件,堆和堆棧段, 只有rw-p - 許可。

這兩個段沒有執行權限。 我的工程師朋友告訴我,如果您在Intel CPU中擁有rw權限,您的代碼將自動獲得執行權限。 但我不明白爲什麼英特爾做這個設計?

+0

曾經是真實的,但英特爾處理器已經有[NX位選項(https://開頭en.wikipedia.org/wiki/NX_bit)。 –

+0

@HansPassant但只限於長模式(64位頁表項)。 –

+0

你可能需要看看這個https://en.wikipedia.org/wiki/Executable_space_protection實際上,即使你跳轉到堆棧或堆段,代碼也不能執行。你會得到分段錯誤。這是因爲你的段(堆棧或堆)沒有執行權限,但你試圖執行它。然後cpu拋出異常。 – bananaappletw

回答

2

這是因爲Linux中的所有段(Windows也有)具有相同的基地址和相同的大小。代碼總是通過代碼段訪問,代碼段覆蓋與堆棧(或任何其他)段完全相同的區域,因此您可以在任何地方執行代碼。

編輯:

,你可以在這裏閱讀更多:http://www.intel.com/Assets/en_US/PDF/manual/253668.pdf 第3.2章使用區隔

+0

這是不正確的。 除了使用參數'-z execstack'編譯代碼,否則程序是NX保護的。 – bananaappletw

+0

這裏是一個簡單的工具來檢查你的段是NX保護.http://www.trapkit.de/tools/checksec.html – bananaappletw

+0

@bananaappletw:32位模式不支持NXE保護(這是在文檔中提到的我已經給出)。但是,是的,在64位(IA-32e)模式下,可以使用它,但只能在分頁級(不是段級)。 –