为什么不处理器的CODE和DATA有独立的堆栈寄存器?
通过使用本地堆栈缓冲区溢出覆盖堆栈,更改函数的原始返回地址,几乎不可能改变程序的控制流程。
当然,有些语言不能区分CODE和DATA(从概念上讲,对程序员来说是区分的,但在内部却是这样)。
答案 0 :(得分:1)
使用多个堆栈与传统软件和硬件不兼容。
论文Defending Embedded Systems Against Control Flow Attacks(2009年出版)建议使用多个堆栈。摘要说:
本文提出了一种基于控件的控制流程执行技术 基于指令的内存访问控制(IBMAC)实现于 硬件。它专门用于保护低成本的嵌入式设备 反恶意操纵其控制流的系统 防止意外堆栈溢出。这是通过使用a来实现的 简单的硬件修改来分割数据中的堆栈和 控制流堆栈(或返回堆栈)。
您可以查看该文件,了解其系统的实施细节。
关于为什么这个(或类似的)技术尚未被采用的问题,该论文的介绍给出了一些提示(强调增加):
鉴于控制流攻击对商品的影响很大 系统中,已经提出了许多防御措施来保护 对抗此类攻击,例如:二元随机化[14],记忆 布局随机化[20,21],堆栈金丝雀[9],污染嫌疑人 数据[19]强制页面可写或可执行[3,21], 控制流完整性执行[1]。但是,大多数人 对策在计算能力方面要求很高, 内存使用情况,通常依赖于简单无法使用的硬件 微控制器,如内存管理单元(MMU)或执行 戒指。 此外,他们大多使用软件解决方案作为硬件 修改(例如在IA-32架构上)很难 并且可能会导致遗留应用程序出现问题。
基本上,使用多个堆栈的系统与传统硬件和/或软件不兼容。对于需要支持遗留代码的通用计算,很难进行这种更改。
相反,已经提出并实现了大量其他可能的解决方案,以帮助缓解与堆栈溢出相关的安全漏洞。