堆栈如何填充以及 ESP 在堆栈溢出利用过程中的行为方式

问题描述 投票:0回答:1

我使用 python 将以下字符串发送到易受攻击的应用程序

缓冲区 = 前缀 + 溢出 + return_addr (JMP ESP) + NOP + shellcode

上面的缓冲字符串成功给了我反向shell,但是,我有以下疑问。

  1. 当我将此缓冲区发送到易受攻击的应用程序并在返回地址(JMP ESP)处设置断点时,我在免疫调试器内看到寄存器和堆栈的以下状态 Click here to see snapshot of Immunity 根据上面的快照,ESP 指向内存位置 01A8FA30。我理解堆栈内存布局的方式如下快照所示 Stack Layout (as i understand) 根据上面的堆栈布局,ESP 通常指向堆栈顶部,即存储局部变量的顶部。 我的疑问: 为什么在免疫调试器快照中,ESP指向返回地址后面的01A8FA30?因为根据堆栈布局快照,ESP 应该位于存在局部变量的顶部。

  2. 我发送到有漏洞的应用程序的缓冲区字符串填充缓冲区以成功给出反向 shell。 我的查询是这个缓冲区是如何存储在堆栈中的,即,shell代码是否首先存储(在较高的内存地址),然后是NOP(在较低的内存地址)等等?

  3. 根据我在要点 1 中提供的堆栈布局快照,我假设 NOP 和 Shellcode 应覆盖堆栈的参数空间(位于最高地址),如果是这种情况,ESP 不应导致NOP 和 shellcode 的执行。这里到底发生了什么?

如果有人能在单独的要点中向我澄清这些内容,我将不胜感激。请注意,堆栈布局的快照是我按照我理解堆栈的方式创建的。提前致谢。

debugging stack stack-overflow buffer-overflow stack-pointer
1个回答
0
投票

我和你也有类似的困惑。为什么ESP会出现在EIP之后(溢出方向)?根据堆栈的解剖,ESP不应该出现在溢出的相反方向吗?

© www.soinside.com 2019 - 2024. All rights reserved.