我正在阅读有关漏洞利用的工作原理,似乎很多漏洞都是通过覆盖堆栈上的返回地址来操作的。已经付出了很多努力来使这变得更加困难(堆栈金丝雀、ASLR、DEP 等),但在我看来,硬件生产商添加寄存器会更容易,只能通过调用和 ret 指令访问,那将保存返回地址。这样,根据定义,返回地址不能被缓冲区溢出覆盖。因为 call 和 ret 仍然存在并且仍然像今天的 CPU 一样运行(唯一的区别是它们存储返回地址的位置),在我看来,兼容性不会有太多问题。而且由于您使用寄存器而不是 RAM 来访问地址,因此性能影响可能是积极的(尽管微不足道)。
出于安全目的,英特尔显然有空间分配更多寄存器,因为尽管需要两个额外的寄存器,但仍在实现 MPX。那么他们为什么不添加一个特殊的寄存器来存储返回地址呢?
最佳答案
这已经有点存在了。我知道三种架构和一种具有以下功能的语言:
o7
中。在函数调用上,然后旋转到 i7
当被调用者建立他的堆栈帧时。当被调用者调用另一个函数时,这个地址被旋转到内部寄存器堆栈中,危险代码无法触及。 关于security - 使用单独的寄存器来存储返回地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45315482/