在编写缓冲区溢出漏洞时,我知道我需要输入一个长度数组(address_of_return_address - address_of_buffer)。并且数组需要填充shellcode的地址。因此,当我的输入数组溢出时,它会用shellcode的地址覆盖保存的返回地址。
我认为由于shellcode将存储在堆栈上保存的返回地址之上,因此其地址应为address_of_return_address +到shellcode开头的距离。
我是否在正确的轨道上?如果是这样,我应该如何计算保存的返回地址与使用GDB到shellcode开头的距离之间的距离?
答案 0 :(得分:1)
您通常不需要“弄清楚”shellcode的地址。使用set字符串溢出缓冲区并计算出偏移量。说
AAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBCCCC
其中BBBB
覆盖EIP(下一个指令地址),并且CCCC
在ESP寄存器指向的位置下降。
您需要找到一个可以在shellcode上继续执行的指令,您可以在CCCC
开始的地方插入该指令。例如JMP ESP
指令。这需要是静态的(例如没有ASLR),并且地址不应包含任何“坏”字符,例如可能终止缓冲区的\x00
。
所以过程是:
A
。JMP ESP
指令。JMP ESP
由处理器执行 - 当ESP
指向您的shellcode时,执行将继续执行。您可能需要在shellcode上添加一些额外的填充,例如: NOP(\x90
),如果您使用编码的有效负载,则允许任何扩展解码。但是,有些AV和IDS会检测到许多NOP的签名,因此处理器可能更好地做繁忙的工作而不是防止检测。
这是常用的方法,尽管这取决于您的有效负载是否有空间,以及您是否设法以与上述类似的方式找到它。诸如NOP sleds之类的技术可用于使您更容易定位有效负载,以防您需要将其写入其他位置。