Write buffer overflow exploit——如何找出shellcode的地址?

Write buffer overflow exploit -- how to figure out the address of the shellcode?

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

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

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

您通常不需要"figure out" shellcode 的地址。您使用设置的字符串溢出缓冲区并计算出偏移量。说

AAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBCCCC

其中 BBBB 覆盖 EIP(下一条指令地址)并且 CCCC 落入 ESP 寄存器指向的位置。

您需要找到一条可以在 shellcode 处继续执行的指令,您可以将其插入到 CCCC 开始的位置。比如JMP ESP指令。这需要是静态的(例如没有 ASLR)并且地址不应包含任何 "bad" 字符,例如可能终止缓冲区的 \x00

所以过程是:

  1. 缓冲区溢出A
  2. EIP 现在指向您所在的 JMP ESP 指令。
  3. JMP ESP 由处理器执行 - 因为 ESP 指向你的 shellcode,执行在这里继续。

您可能需要在 shellcode 的开头添加一些额外的填充,例如NOP (\x90) 允许在使用编码负载时进行任何解码扩展。然而,一些 AV 和 IDS 会一起检测许多 NOP 的签名,因此处理器忙于工作而不是防止检测可能会更好。

这是通常的方法,尽管这完全取决于您的负载是否有 space 以及您是否设法以与上述类似的方式找到它。 NOP sleds 等技术可用于更轻松地定位有效负载,以防您需要在其他地方编写它们。