x86 ebp在缓冲区溢出攻击中的行为

x86 ebp's behavior in buffer overflow attack

查看一些基于堆栈的基本缓冲区溢出,我对调用者的 ebp 在 basic return address overwrite vs an off-by-one ebp overwrite 中发挥的差异感到困惑。

在return地址覆盖中,目标是粉碎堆栈足以覆盖return地址,从而控制eip。

在 off by one attack 中,调用者 ebp 的 LSB 被覆盖。这会强制 ebp 弹出并且 esp 被移动到攻击者控制的缓冲区内的某个位置,这会引发对 return 地址的控制,从而引发对 eip.

的控制。

我的困惑源于ebp的行为。在基本的 return 地址覆盖中,我们用垃圾字节覆盖调用者的 ebp 显然无关紧要,但 ebp 的值需要在 off by one attack 中保持一致。函数尾声在基本缓冲区溢出情况下如何工作?

mov esp, ebp 
pop ebp
retn

在基本的 return 地址覆盖中,正如您所说,您可以直接覆盖 ret,因此只有 retn 在函数尾声的指令中很重要。

在一个 off-by-one 覆盖中显然你知道你不能覆盖 ret,但你可以将堆栈转到用户控制的某个地方。
在这种情况下,攻击者至少要通过 two 函数结尾来获得控制权。

  1. 逐一 ebp 覆盖

    mov esp, ebp
    pop ebp          ; now ebp is partially overwriten
    retn             
    
  2. 将堆栈旋转到受控区域。

    mov esp, ebp     ; now stack(esp) is moved to controlled area.
    pop ebp          ; controlled
    retn             ; controlled --> gain eip control