当我写缓冲区溢出漏洞时,我知道我需要输入一个长度为数组的地址(address_of_return_address-address_of_buffer)。并且该数组需要用shellcode的地址填充。这样,当我的输入数组溢出时,它将用shellcode的地址覆盖保存的返回地址。
我认为由于shellcode将存储在堆栈上保存的返回地址之上,因此其地址应为address_of_return_address +到shellcode开头的距离。
我在正确的轨道上吗?如果是这样,我应该如何使用GDB找出保存的返回地址与shellcode开头之间的距离?
通常,您不需要“弄清楚” shellcode的地址。您使用设置的字符串溢出缓冲区并计算出偏移量。说
AAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBCCCC
此处将BBBB
覆盖EIP(下一条指令地址),然后CCCC
移至ESP寄存器所指向的位置。
您需要找到一条将在shellcode处继续执行的指令,您可以在shellcode的CCCC
开始处插入该指令。如JMP ESP
指令。这必须是静态的(例如,没有ASLR),并且地址不应包含任何“不良”字符,例如\x00
可能终止缓冲区的字符。
所以过程是:
A
。JMP ESP
指令。JMP ESP
由处理器执行-ESP
指向您的shellcode,此处继续执行。开始时,您可能需要在shellcode上添加一些额外的填充,例如使用NOP(\x90
),以便在使用编码的有效负载的情况下进行解码扩展。但是,某些AV和IDS会一起检测许多NOP的签名,因此最好让处理器忙于工作而不是阻止检测。
这是通常的方法,尽管这完全取决于有效载荷是否有空间以及是否以与上述类似的方式找到它。如果需要在其他位置写入有效负载,可以使用诸如NOP底座之类的技术使定位负载更容易。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句