爲什麼堆棧可執行?如果系統強制堆棧不可執行並且文本不可寫,那麼代碼注入攻擊可以完全停止嗎?使程序堆棧不可執行以停止代碼注入攻擊
2
A
回答
1
即使堆棧不可執行,它可以被更改...導致例程返回到不同的地址(因爲返回地址通常存儲在堆棧中)。
如果堆是可執行的,數據可以被寫入到包含有效的操作碼和返回地址可被操縱返回到該代碼。
諸如DEP(Data Execution Prevention)和NX(Never Execute)之類的技術可以保護堆和堆棧免於執行。
0
可執行堆棧的主要歷史原因是與一種鮮爲人知並且很少使用的名爲「嵌套函數」的GCC功能的兼容性,這些功能相當於具有自動存儲持續時間的閉包。如果你使用嵌套函數的地址,程序必須生成一段代碼,稱爲蹦牀,以加載一個指向實際函數將使用的數據的隱藏參數。這段代碼位於堆棧上。
請注意,嵌套的函數不是C語言的一部分,並且C語言中沒有任何理由使堆棧可執行。 C甚至不要求代碼和數據位於公共地址空間中。因此,不旨在支持非標準擴展(如嵌套函數)的實現不應提供可執行堆棧,因爲它們會增加程序可能存在的任何安全漏洞的危險。
0
爲什麼堆棧可執行?因爲較早的x86 MMU(內存管理單元)每頁只有一個訪問位。這些值是read-execute或read-write-execute。帶有DEP和NX的新芯片每頁添加了一點,以便對執行權限進行細粒度控制。
相關問題
- 1. 攻擊堆棧
- 2. 堆棧上的可執行Ada代碼
- 3. 爲什麼堆棧或堆段中的代碼可以執行?
- 4. 如何對此代碼執行SQL注入攻擊?
- 5. 防止xss攻擊/注入
- 6. 防止MDX注入攻擊
- 7. 防止命令行注入攻擊
- 8. urlencode()足以在2011年停止所有SQL注入攻擊
- 9. 是否可以停止從UI單線程執行代碼?
- 10. Javascript/jquery防止注入執行代碼
- 11. 這是否可以防止注入攻擊?
- 12. hibernate命名查詢是否可以防止SQL注入攻擊?
- 13. SQLiteDatabase.insert()是否可以防止SQL注入攻擊?
- 14. 停止執行C#代碼
- 15. ASP.NET:停止代碼執行
- 16. 停止代碼執行Java
- 17. Java停止代碼執行?
- 18. 停止執行代碼
- 19. 執行代碼會使程序停止響應
- 20. 哈佛體系結構計算機是否可以免受任意代碼注入和執行攻擊?
- 21. 是否有可能在x86-64上將代碼注入堆棧
- 22. 防止SQL注入和XSS攻擊
- 23. pgdb防止注入攻擊嗎?
- 24. System.Web.UI.Control.LoadRecursive() - 堆棧不足以繼續安全地執行程序。
- 25. 我正在進入這個程序堆棧或停止工作
- 26. 代碼(java,多線程)在一行代碼後停止執行
- 27. SQL注入攻擊
- 28. SQL注入攻擊
- 29. JavaScript注入攻擊
- 30. 此代碼是否可以防止SQL注入攻擊併爲何不起作用?
啊,我明白了。謝謝。 – coinsyx