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
。
所以过程是:
- 缓冲区溢出
A
。
- EIP 现在指向您所在的
JMP ESP
指令。
JMP ESP
由处理器执行 - 因为 ESP
指向你的 shellcode,执行在这里继续。
您可能需要在 shellcode 的开头添加一些额外的填充,例如NOP (\x90
) 允许在使用编码负载时进行任何解码扩展。然而,一些 AV 和 IDS 会一起检测许多 NOP 的签名,因此处理器忙于工作而不是防止检测可能会更好。
这是通常的方法,尽管这完全取决于您的负载是否有 space 以及您是否设法以与上述类似的方式找到它。 NOP sleds 等技术可用于更轻松地定位有效负载,以防您需要在其他地方编写它们。
在编写缓冲区溢出漏洞时,我知道我需要输入一个长度为 (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
。
所以过程是:
- 缓冲区溢出
A
。 - EIP 现在指向您所在的
JMP ESP
指令。 JMP ESP
由处理器执行 - 因为ESP
指向你的 shellcode,执行在这里继续。
您可能需要在 shellcode 的开头添加一些额外的填充,例如NOP (\x90
) 允许在使用编码负载时进行任何解码扩展。然而,一些 AV 和 IDS 会一起检测许多 NOP 的签名,因此处理器忙于工作而不是防止检测可能会更好。
这是通常的方法,尽管这完全取决于您的负载是否有 space 以及您是否设法以与上述类似的方式找到它。 NOP sleds 等技术可用于更轻松地定位有效负载,以防您需要在其他地方编写它们。