当我控制了 src 和 length 参数时,是否可以在以下情况下覆盖 eip?
memcpy(float* dest,float* src, int length)
我想应该可以覆盖 eip(?) 但是否可以用有意义的东西覆盖它?
**抱歉不清楚。覆盖EIP是指覆盖函数返回后EIP寄存器使用的返回指针,转移程序执行。
最佳答案
因为 eip 是一个寄存器,所以你不能覆盖它。您只能覆盖堆栈上的值。缓冲区溢出攻击涉及覆盖函数的返回值,从而将执行传递给可以解释为您放置在内存中某处的代码的数据。
针对您的澄清:
是的。由于调用函数时返回指针被压入堆栈,因此您可以写入该内存位置。它将在任何变量分配之上找到(假设 x86 体系结构和默认调用约定)。您可以在此处写入一个指向下一个内存位置的值,您应该在此处加载与已处理的汇编语言指令相对应的二进制数据。请注意,通过按照我所描述的方式进行操作,您已经破坏了堆栈以及程序在注入(inject)代码后继续执行的任何机会。为此,您必须将返回地址保存在堆栈的其他位置,并编写一个 shellcode 将其复制到正确的位置,然后执行返回。
我还假设 dest 参数是可控的。如果你不能把数据放在你想要的地方,它对你就没用了
关于c - 内存溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4610165/