代码之家  ›  专栏  ›  技术社区  ›  VP.

我们是否可以添加并使用返回地址堆栈寄存器来防止堆栈溢出攻击?

  •  2
  • VP.  · 技术社区  · 7 年前

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

    1. 呼叫者按返回地址(按 call )到a return address stack register
    2. 调用者推送参数。
    3. 被叫人推本地人。
    4. 被叫方正在进行一些工作。
    5. 被调用者清理堆栈。
    6. ret 弹出的值 返回地址堆栈寄存器 进入 RIP / EIP
    1 回复  |  直到 7 年前
        1
  •  2
  •   Peter Cordes    7 年前

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

    大多数RISC ISA已经使用链接寄存器实现了这一点 call 等效的是跳转和链接(MIPS jal )或手臂 bl )。如果被调用方想调用子函数,则必须将返回地址保存在堆栈上,因为 日航 重击链接寄存器。(因此,它们最终通过将返回地址加载到寄存器并使用跳转到寄存器指令来返回。)

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