我想使用ptrace在運行進程的堆棧中寫入一段二進制代碼。 但是,這會導致分段故障(信號11)。在最近的Linux上執行進程堆棧中的代碼
我可以確保%eip寄存器存儲指向我想要在堆棧中執行的第一條指令的指針。我想有一些機制可以保護堆棧數據可執行。
那麼,有沒有人知道如何禁用這種保護堆棧。具體來說,我正在嘗試Fedora 15.
非常感謝!
讀完所有回覆之後,我嘗試了execstack,它確實使堆棧可執行代碼成爲可能。謝謝你們!
我想使用ptrace在運行進程的堆棧中寫入一段二進制代碼。 但是,這會導致分段故障(信號11)。在最近的Linux上執行進程堆棧中的代碼
我可以確保%eip寄存器存儲指向我想要在堆棧中執行的第一條指令的指針。我想有一些機制可以保護堆棧數據可執行。
那麼,有沒有人知道如何禁用這種保護堆棧。具體來說,我正在嘗試Fedora 15.
非常感謝!
讀完所有回覆之後,我嘗試了execstack,它確實使堆棧可執行代碼成爲可能。謝謝你們!
這可能是由於現代處理器上的NX bit。您可以使用execstack
禁用此程序。
http://advosys.ca/viewpoints/2009/07/disabling-the-nx-bit-for-specific-apps/
正確的診斷,但我不認爲execstack可以在運行時做任何事情。 – Tobu
如前所述這是由於NX位。但這是可能的。我知道gcc確實使用它自己作爲trampolines(這是一種解決方法,例如,使嵌套函數的函數指針)。我沒有看過詳細信息,但我會建議看看gcc代碼。在源代碼中搜索特定於體系結構的宏TARGET_ASM_TRAMPOLINE_TEMPLATE
,那麼您應該看看它們是如何實現的。
編輯:該宏的快速谷歌,給了我提示:mprotect
是用來更改內存頁面的權限。當你生成日期並執行它時也要小心 - 你可能除了刷新指令緩存之外。
您擁有ptrace權限。這是因爲你是同一個用戶,還是因爲你是根?你的目標是什麼架構? – Tobu