【问题标题】:Write buffer overflow exploit -- how to figure out the address of the shellcode?写缓冲区溢出漏洞——如何找出shellcode的地址?
【发布时间】:2015-02-25 10:31:13
【问题描述】:
在编写缓冲区溢出漏洞时,我知道我需要输入一个长度数组(address_of_return_address - address_of_buffer)。并且数组需要填充shellcode的地址。这样当我的输入数组溢出时,它会用 shellcode 的地址覆盖保存的返回地址。
我认为既然shellcode会存储在栈上保存的返回地址之上,那么它的地址应该是address_of_return_address +到shellcode开头的距离。
我在正确的轨道上吗?如果是这样,我应该如何计算保存的返回地址与使用 GDB 的 shellcode 开头的距离之间的距离?
【问题讨论】:
标签:
security
buffer-overflow
exploit
shellcode
【解决方案1】:
您通常不需要“找出”shellcode 的地址。您使用设置的字符串溢出缓冲区并计算出偏移量。说
AAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBCCCC
BBBB 覆盖 EIP(下一条指令地址),CCCC 落在 ESP 寄存器指向的位置。
您需要在 shellcode 中找到一条可以继续执行的指令,您可以将其插入到 CCCC 开始的位置。如JMP ESP 指令。这需要是静态的(例如没有 ASLR),并且地址不应包含任何“坏”字符,例如可能会终止缓冲区的 \x00。
所以过程是:
- 缓冲区溢出
A。
- EIP 现在指向您所在的
JMP ESP 指令。
-
JMP ESP 由处理器执行 - 因为 ESP 指向您的 shellcode,所以在此处继续执行。
您可能需要在您的 shellcode 上添加一些额外的填充,例如如果您使用编码的有效负载,则 NOP (\x90) 允许从解码进行任何扩展。但是,一些 AV 和 IDS 会同时检测许多 NOP 的签名,因此处理器可能会更好地执行繁忙的工作来防止检测。
这是通常的方法,尽管这完全取决于您的有效负载是否有空间以及您是否设法以与上述类似的方式找到它。 NOP sleds 等技术可用于更轻松地定位有效负载,以防您需要在其他地方编写它们。