写缓冲区溢出漏洞 - 如何找出shellcode的地址?

时间:2015-02-25 10:31:14

标签: security buffer-overflow exploit shellcode

在编写缓冲区溢出漏洞时,我知道我需要输入一个长度数组(address_of_return_address - address_of_buffer)。并且数组需要填充shellcode的地址。因此,当我的输入数组溢出时,它会用shellcode的地址覆盖保存的返回地址。

我认为由于shellcode将存储在堆栈上保存的返回地址之上,因此其地址应为address_of_return_address +到shellcode开头的距离。

我是否在正确的轨道上?如果是这样,我应该如何计算保存的返回地址与使用GDB到shellcode开头的距离之间的距离?

1 个答案:

答案 0 :(得分:1)

您通常不需要“弄清楚”shellcode的地址。使用set字符串溢出缓冲区并计算出偏移量。说

AAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBCCCC

其中BBBB覆盖EIP(下一个指令地址),并且CCCC在ESP寄存器指向的位置下降。

您需要找到一个可以在shellcode上继续执行的指令,您可以在CCCC开始的地方插入该指令。例如JMP ESP指令。这需要是静态的(例如没有ASLR),并且地址不应包含任何“坏”字符,例如可能终止缓冲区的\x00

所以过程是:

  1. 缓冲区溢出A
  2. EIP现在指向您找到的JMP ESP指令。
  3. JMP ESP由处理器执行 - 当ESP指向您的shellcode时,执行将继续执行。
  4. 您可能需要在shellcode上添加一些额外的填充,例如: NOP(\x90),如果您使用编码的有效负载,则允许任何扩展解码。但是,有些AV和IDS会检测到许多NOP的签名,因此处理器可能更好地做繁忙的工作而不是防止检测。

    这是常用的方法,尽管这取决于您的有效负载是否有空间,以及您是否设法以与上述类似的方式找到它。诸如NOP sleds之类的技术可用于使您更容易定位有效负载,以防您需要将其写入其他位置。