2010-06-26 34 views

回答

15

請參閱mprotect()。一旦用代碼填充了一個(n-)頁面大小的內存區域(用mmap()分配),請更改其權限以禁止寫入並允許執行。

+0

另外,請閱讀:http://people.redhat.com/drepper/selinux-mem.html – 2010-06-26 23:02:31

+0

@Ignacio:鏈接已關閉,存檔鏈接:http://web.archive.org/web/20090203055327/ http://people.redhat.com/drepper/selinux-mem.html – ninjalj 2011-06-03 20:59:23

6

除了正確使用mprotect來提供第一次寫入然後執行權限之外,在某些操作系統/硬件操作中,您可能需要刷新I-cache。在這個時刻(2010年中),所有最新的x86處理器都有獨立的指令和數據的1級緩存,有人必須確保,如果您向內存寫入新指令(它將更新D-cache)然後嘗試從I緩存中執行陳舊的位。究竟如何從用戶空間刷新I-cache將取決於你的硬件和操作系統。我的建議是閱讀英特爾有關其「自我修改代碼」的IA-32多處理器文檔。這應該足以讓你通過。

+0

x86不需要這個; x86 ISA規則要求I-cache與數據高速緩存一致,並且在「看到」新寫入的字節之前至多需要一個「jmp」。但好處是,其他架構沒有連貫的I-cache。 – 2017-11-27 12:03:17

相關問題