我已经看到它ARM
使用链接寄存器,并且想知道它是否无法被用户空间恶意代码写入?
我的意思是您不能进行 stackoverflow 攻击并覆盖堆栈上的返回地址(例如 in x86
)。
我已经看到它ARM
使用链接寄存器,并且想知道它是否无法被用户空间恶意代码写入?
我的意思是您不能进行 stackoverflow 攻击并覆盖堆栈上的返回地址(例如 in x86
)。
我会用一个问题来回答你的问题:
如果函数 A 调用函数 B,函数 B 调用函数 C,那么 C 执行时 B 的返回地址存储在哪里?它不能在链接寄存器中,因为它保存了 C 的返回地址...
顺便说一句,LR
可从用户空间写入。
链接寄存器使得用用户输入覆盖它有点困难,但绝对不是不可能的。最常见的原因是嵌套函数:如果您正在调用另一个函数,则必须将当前 LR 存储在某个地方,因为它会被调用破坏。它的逻辑位置是堆栈,以及其他保存的寄存器,这就是大多数编译器所做的。因此,缓冲区溢出仍然可以覆盖保存的 LR,并且当保存的值被弹出并用于“返回给调用者”时,可以发生控制转移。