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