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 函数结尾来获得控制权。
逐一 ebp 覆盖
mov esp, ebp
pop ebp ; now ebp is partially overwriten
retn
将堆栈旋转到受控区域。
mov esp, ebp ; now stack(esp) is moved to controlled area.
pop ebp ; controlled
retn ; controlled --> gain eip control
查看一些基于堆栈的基本缓冲区溢出,我对调用者的 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 函数结尾来获得控制权。
逐一 ebp 覆盖
mov esp, ebp pop ebp ; now ebp is partially overwriten retn
将堆栈旋转到受控区域。
mov esp, ebp ; now stack(esp) is moved to controlled area. pop ebp ; controlled retn ; controlled --> gain eip control