为什么不使用单独的CODE和DATA堆栈

时间:2016-02-17 19:00:22

标签: stack computer-architecture exploit

为什么不处理器的CODE和DATA有独立的堆栈寄存器?

通过使用本地堆栈缓冲区溢出覆盖堆栈,更改函数的原始返回地址,几乎不可能改变程序的控制流程。

当然,有些语言不能区分CODE和DATA(从概念上讲,对程序员来说是区分的,但在内部却是这样)。

1 个答案:

答案 0 :(得分:1)

简短回答

使用多个堆栈与传统软件和硬件不兼容。

详细答案

论文Defending Embedded Systems Against Control Flow Attacks(2009年出版)建议使用多个堆栈。摘要说:

  

本文提出了一种基于控件的控制流程执行技术   基于指令的内存访问控制(IBMAC)实现于   硬件。它专门用于保护低成本的嵌入式设备   反恶意操纵其控制流的系统   防止意外堆栈溢出。这是通过使用a来实现的   简单的硬件修改来分割数据中的堆栈和   控制流堆栈(或返回堆栈)。

您可以查看该文件,了解其系统的实施细节。

关于为什么这个(或类似的)技术尚未被采用的问题,该论文的介绍给出了一些提示(强调增加):

  

鉴于控制流攻击对商品的影响很大   系统中,已经提出了许多防御措施来保护   对抗此类攻击,例如:二元随机化[14],记忆   布局随机化[20,21],堆栈金丝雀[9],污染嫌疑人   数据[19]强制页面可写或可执行[3,21],   控制流完整性执行[1]。但是,大多数人   对策在计算能力方面要求很高,   内存使用情况,通常依赖于简单无法使用的硬件   微控制器,如内存管理单元(MMU)或执行   戒指。 此外,他们大多使用软件解决方案作为硬件   修改(例如在IA-32架构上)很难   并且可能会导致遗留应用程序出现问题。

基本上,使用多个堆栈的系统与传统硬件和/或软件不兼容。对于需要支持遗留代码的通用计算,很难进行这种更改。

相反,已经提出并实现了大量其他可能的解决方案,以帮助缓解与堆栈溢出相关的安全漏洞。