【发布时间】:2015-12-27 14:00:38
【问题描述】:
通常使用两个堆栈来防止缓冲区溢出探索是否更简单? 一个堆栈用于变量和传递参数,另一个用于返回地址。
或者像 NX/XD-bits(在 AMD/Intel x86 上)这样的不可执行堆栈做得更好?
【问题讨论】:
-
有些架构默认情况下不会将“跳转和链接”类型指令的返回地址推送到堆栈上,这算吗?您可以手动将其放在任何地方,包括“第二个堆栈”
-
当然可以。使用寄存器窗口的体系结构,例如 SPARC 或 Itanium,浮现在脑海中。更直接的是,大量嵌入式 8 位 MCU,例如 PIC18F 系列,也使用专用的返回堆栈。
-
跟进@harold 所说的,您可以在使用 push-return-address (x86) 的架构上执行此操作,方法是将数据堆栈放在其他位置。我实际上不知道有什么架构你不能这样做,这只是意味着扔掉一个寄存器名称。
-
@dwelch
6809有两个堆栈指针,硬件堆栈和用户堆栈,带有PSHS、PSHU、PULS和PULU指令。这个Wikipedia page 说“2015 年底,Rochester 的 MC6809 进入制造阶段,预计将于 2016 年 7 月开始生产。” -
任何 CPU 架构都可以实现多个堆栈。您不限于使用 CPU 架构用于实现堆栈的任何特殊指令或寄存器(如果有)。如果您想在 ARM、x86 或 6502 CPU 上使用多个堆栈,那么没有什么可以阻止您。