在编写缓冲区溢出漏洞攻击时,我理解需要输入长度数组(address_of_return_address - address_of_buffer)。数组中需要填充外壳代码的地址。这样,当输入数组溢出时,它会用外壳代码的地址覆盖保存的返回地址。
我认为,由于外壳代码将存储在堆栈上保存的返回地址之上,因此它的地址应该是address_of_return_address +到外壳代码开头的距离。
我在正确的轨道上吗?如果是这样的话,我应该如何计算保存的返回地址与使用GDB的外壳代码开头的距离?
发布于 2015-02-26 11:11:53
您通常不需要“计算”外壳代码的地址。使用设置字符串溢出缓冲区并计算偏移量。说
AAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBCCCC其中,BBBB覆盖EIP (下一个指令地址),CCCC下降到ESP寄存器所指向的位置。
您需要找到在外壳代码上继续执行的指令,您可以将其插入到CCCC开始的位置。例如JMP ESP指令。这需要是静态的(例如,没有ASLR),并且地址不应该包含任何“坏”字符,例如可能终止缓冲区的\x00。
因此,程序是:
A's溢出。JMP ESP指令。JMP ESP由处理器执行--当ESP指向您的外壳代码时,在这里继续执行。您可能需要一些额外的填充在您的外壳代码开始时,例如NOPs (\x90),以允许任何扩展从解码,如果你使用一个编码的有效载荷。然而,一些AVs和IDS会同时检测到许多NOPs的签名,因此处理器最好是忙于工作,以防止检测。
这是通常的方法,尽管这完全取决于您的有效负载是否有空间,以及您是否能够以类似于上面的方式找到它。可以使用像NOP雪橇这样的技术来使定位有效负载更容易,以防您需要在其他地方编写它们。
https://stackoverflow.com/questions/28716669
复制相似问题