X86 使用链接寄存器是否可以防止堆栈溢出攻击?

X86 使用链接寄存器是否可以防止堆栈溢出攻击?,x86,arm,stack-overflow,X86,Arm,Stack Overflow,我看到ARM使用一个链接寄存器,我想知道它是否被用户空间恶意代码破坏了 我的意思是,您不能执行堆栈溢出攻击并覆盖堆栈上的返回地址(如在x86中) 我会用一个问题来回答你的问题: 如果函数A调用函数B,而函数B调用函数C,那么在C执行时,B的返回地址存储在哪里?它不能在链接寄存器中,因为它保存C的返回地址 另外,LR可从用户空间写入。我将用一个问题回答您的问题: 如果函数A调用函数B,而函数B调用函数C,那么在C执行时,B的返回地址存储在哪里?它不能在链接寄存器中,因为它保存C的返回地址 另一

我看到
ARM
使用一个链接寄存器,我想知道它是否被用户空间恶意代码破坏了


我的意思是,您不能执行堆栈溢出攻击并覆盖堆栈上的返回地址(如在
x86
中)

我会用一个问题来回答你的问题:

如果函数A调用函数B,而函数B调用函数C,那么在C执行时,B的返回地址存储在哪里?它不能在链接寄存器中,因为它保存C的返回地址



另外,
LR
可从用户空间写入。

我将用一个问题回答您的问题:

如果函数A调用函数B,而函数B调用函数C,那么在C执行时,B的返回地址存储在哪里?它不能在链接寄存器中,因为它保存C的返回地址



另一方面,
LR
可以从用户空间写入。

链接寄存器使得用用户输入覆盖它稍微困难一些,但绝对不是不可能的。最常见的原因是嵌套函数:如果调用另一个函数,则必须将当前LR存储在某个位置,因为它将被调用破坏。它的逻辑位置是堆栈,以及其他保存的寄存器,大多数编译器都是这样做的。因此,缓冲区溢出仍然可以覆盖保存的LR,并且当弹出保存的值并用于“返回调用方”时,可以发生控制传输。

链接寄存器使得使用用户输入覆盖它稍微困难一些,但绝对不是不可能的。最常见的原因是嵌套函数:如果调用另一个函数,则必须将当前LR存储在某个位置,因为它将被调用破坏。它的逻辑位置是堆栈,以及其他保存的寄存器,大多数编译器都是这样做的。因此,缓冲区溢出仍然可以覆盖保存的LR,并且当弹出保存的值并用于“返回调用方”时,可以发生控制传输