当执行缓冲区溢出/堆溢出时,EIP 是否会告诉接下来将执行哪一部分?另外,当利用存在缓冲区溢出漏洞的部分时,执行后,ESP 是否会指向利用代码的开始(会是一些 shell 代码和 gibbersih 的组合)?
如果这看起来太模糊了,谁能告诉我在执行漏洞利用期间每个寄存器将指向什么?
当执行缓冲区溢出/堆溢出时,EIP 是否会告诉接下来将执行哪一部分?另外,当利用存在缓冲区溢出漏洞的部分时,执行后,ESP 是否会指向利用代码的开始(会是一些 shell 代码和 gibbersih 的组合)?
如果这看起来太模糊了,谁能告诉我在执行漏洞利用期间每个寄存器将指向什么?
ESP 会指向漏洞利用代码的开始(这将是一些 shell 代码和 gibbersih 的组合)?
实际上,它是指向漏洞利用代码开始的EIP ,而不是 ESP。在经典的堆栈缓冲区溢出中,ESP 将继续处于使用/不使用漏洞利用代码的位置。唯一需要覆盖的是 EIP 将其更改为内存中的不同地址——您已经以某种方式“植入”了您的漏洞利用代码。
为了说明,让我们看一下堆栈图并注意各种寄存器的值:

让我们假设在被调用函数中有一个可利用的缓冲区,可以提供任意数量的数据(gets、rogue srtcpy 等)。攻击者在存储返回地址(EIP)的堆栈位置之前计算确切的字节数。所以输入可以是形式(每个块对应于下面的每条红线)。
AAAAAAAA AAAAAAAA AAAAAAAA AAAAAAAA AAAAAAAA 0834FD4C
其中 0834FD4C 是攻击者想要在保存的 EIP 位置种植的新指令指针,前面的 A 只是到达 EIP 的垫(记住堆栈向下增长)。
溢出后,假设堆栈如下所示:

至此,攻击者已经成功植入了新的EIP。每当被调用函数返回时,该ret指令会将保存的 EIP(现在为 0x0834FD4C)弹出到%eip寄存器,并且控制流将从该内存地址恢复并开始执行它在那里找到的任何指令。同样,攻击者必须确保他事先已在此位置植入了漏洞利用代码。
Post callee return:
EBP : 可以根据攻击者在溢出缓冲区数据中提供的内容更改或不能更改。请记住,由于他必须在达到 EIP 之前超越 EBP,因此他当然也必须为 EBP 提供价值。通常,攻击者会足够勤奋地枚举堆栈以确定当前的 EBP 并将其植入有效负载中,使其与以前保持一致。例如。他可以(并且应该)提供以下内容:
AAAAAAAA AAAAAAAA AAAAAAAA AAAAAAAA 082376ED 0834FD4C
082376ED现有的 EBP在哪里。这将确保它不会在任务中更改为任意值以覆盖 EIP。
EIP : 更改为新值
ESP:无论缓冲区是否溢出,它都会恢复到相同的值。
因此,在函数返回后,您将生活在旧调用者的堆栈框架中,但将执行一些其他代码。