【问题标题】:Could we add and use a return address stack register to prevent stack overflow attack?我们可以添加和使用返回地址堆栈寄存器来防止堆栈溢出攻击吗?
【发布时间】:2018-05-11 16:06:55
【问题描述】:

来自this question,将返回地址推送到特定的堆栈寄存器会不会更安全,这样我们就不能利用堆栈溢出?

  1. 调用者将返回地址(call)推送到return address stack register
  2. 调用者推送参数。
  3. 被调用者推送本地人。
  4. 被调用者中正在发生一些工作。
  5. 被调用者清理堆栈。
  6. retreturn address stack register 的值弹出到RIP/EIP

【问题讨论】:

  • 还有,什么是栈register
  • Forth 也是这样做的,SPARC 也是如此。您可以在 ARM 和其他一些架构上轻松实现。是的,有可能。但通常不会这样做,可能是因为它需要更复杂的编程模型以及分配两个堆栈而不是一个堆栈。

标签: assembly x86 stack-overflow


【解决方案1】:

在大多数情况下,在寄存器中而不是堆栈中传递返回地址并没有帮助。

大多数 RISC ISA 已经使用链接寄存器执行此操作,它们的 call 等效项是跳转链接 (MIPS jal) 或 ARM bl)。如果要调用子函数,被调用者必须自己将返回地址保存在堆栈中,因为jal 破坏了链接寄存器。 (因此它们最终通过将返回地址加载到寄存器中并使用跳转到寄存器指令来返回。)

这与 x86 所做的没有根本不同,其中 ret 基本上直接是 pop rip。唯一的区别是叶函数,其中返回地址永远不会进入内存,除非被调用者溢出/重新加载它以获得额外的暂存寄存器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-21
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    • 2013-11-15
    • 2014-04-21
    • 1970-01-01
    相关资源
    最近更新 更多