【问题标题】:x86 ebp's behavior in buffer overflow attackx86 ebp 在缓冲区溢出攻击中的行为
【发布时间】:2018-09-30 14:03:25
【问题描述】:

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

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

在一次攻击中,调用者的ebp的LSB被覆盖。这会强制 ebp 弹出,并将 esp 移动到攻击者控制的缓冲区内的某个位置,从而引发对返回地址和 eip 的控制。

我的困惑源于 ebp 的行为。在基本的返回地址覆盖中,我们用垃圾字节覆盖调用者的 ebp 显然无关紧要,但是 ebp 的值需要在一次攻击中保持一致。函数epilogue在基本缓冲区溢出情况下如何工作?

mov esp, ebp 
pop ebp
retn

【问题讨论】:

    标签: security buffer-overflow exploit


    【解决方案1】:

    在基本的返回地址覆盖中,正如你所说,你可以直接覆盖ret,所以只有retn 在函数尾声的说明中很重要。

    显然,在一个单独的 ebp 覆盖中,您知道无法覆盖 ret,但您可以将堆栈旋转到用户控制的某个位置。
    在这种情况下,攻击者至少通过 两个 功能结语来获得控制权。

    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
      

    【讨论】:

    • 在基本缓冲区溢出中,我们完全覆盖了 ebp,但这不会导致转向垃圾地址。有什么我不明白的区别?
    • 堆栈轴必须通过两次函数尾声来完成。在基本的返回地址溢出中,您在一次溢出中获得eip 控制,堆栈保持不变。
    • 只有ebp覆盖不会导致堆栈改变,覆盖ebp必须恢复到esp,这意味着需要两次函数尾声。
    • 所以如果我有两个函数,第二个覆盖 ebp 的 LSB,我们不会获得 eip,直到它通过第一个结尾正常返回,然后继续继续,直到 ebp 从调用者的 [function] 恢复尾声?
    • 是的,实际上这个技巧通常不是用于ret 覆盖,而是用于其他类似 GOT 的覆盖。
    猜你喜欢
    • 2011-11-12
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 2019-10-23
    • 2019-04-14
    • 2016-06-06
    • 2021-02-25
    相关资源
    最近更新 更多