我正在阅读漏洞利用是如何工作的,似乎很多漏洞通过覆盖堆栈上的返回地址来运行。为了使这更困难(堆栈金丝雀,ASLR,DEP等)已经付出了很多努力,但在我看来,硬件生产者更容易添加一个寄存器,只能通过调用和返回指令访问,这将保留返回地址。这样,根据定义,缓冲区溢出不能覆盖返回地址。因为call和ret仍然存在并且仍然像今天的CPU一样运行(唯一的区别在于它们存储返回地址),在我看来,兼容性问题不会太多。由于您使用寄存器而不是RAM来访问该地址,因此性能影响可能是正面的(尽管不显着)。
为了安全起见,英特尔显然有空间分配更多寄存器,因为MPX正在实施,尽管需要两个额外的寄存器。那么他们为什么不添加一个特殊的寄存器来存储返回地址呢?答案 0 :(得分:2)
这已经存在了。我知道三种架构和一种语言具有这样的功能:
o7
中,然后在被调用者建立其堆栈帧时将其旋转到i7
。当被调用者调用另一个函数时,该地址被旋转到内部寄存器堆栈中,不会被危险代码触及。