来自 this question ,将返回地址推送到特定的堆栈寄存器,这样我们就不能利用堆栈溢出,不是更安全吗?
call
return address stack register
ret
返回地址堆栈寄存器
RIP
EIP
在大多数情况下,在寄存器中而不是在堆栈中传递返回地址没有帮助。
大多数RISC ISA已经使用链接寄存器实现了这一点 call 等效的是跳转和链接(MIPS jal )或手臂 bl )。如果被调用方想调用子函数,则必须将返回地址保存在堆栈上,因为 日航 重击链接寄存器。(因此,它们最终通过将返回地址加载到寄存器并使用跳转到寄存器指令来返回。)
jal
bl
日航
这与x86没有本质上的区别,其中 ret 基本上是 pop rip 直接地唯一的区别是叶函数,其中返回地址永远不会进入内存,除非被调用方溢出/重新加载它以获得额外的暂存寄存器。
pop rip