memcpy溢出

时间:2011-01-05 23:11:35

标签: c memory overflow buffer

当我控制src和长度参数时,是否可以在以下条件下覆盖eip?

memcpy(float * dest,float * src,int length)

我想应该可以覆盖eip(?)但是可以用有意义的东西覆盖它吗?

**抱歉不清楚。通过覆盖EIP,我的意思是覆盖返回指针,该指针将在函数返回后由EIP寄存器使用,从而转移程序执行。

3 个答案:

答案 0 :(得分:4)

由于eip是一个寄存器,因此无法覆盖它。您只能覆盖堆栈上的值。缓冲区溢出攻击涉及覆盖函数的返回值,从而将执行传递给可以解释为您放置在内存中的代码的数据。

回应你的澄清:

是。由于在调用函数时将返回指针压入堆栈,因此可以写入此内存位置。它将在任何变量分配之上找到(假设x86架构和默认调用约定)。您可以在此处写入一个指向下一个内存位置的值,您应在其中加载与已处理的汇编语言指令相对应的二进制数据。请注意,通过按照我的描述进行操作,您已经销毁了堆栈以及在注入代码后程序继续执行的任何可能性。为此,您必须将返回地址保存在堆栈的其他位置,并编写一个shellcode,将其复制到正确的位置,然后执行返回。

我还假设dest参数是可控的。如果你不能把数据放在你想要的地方,那对你来说是没用的

答案 1 :(得分:0)

你怎么用“覆盖eip”?

EIP是一个寄存器,而不是内存。它不会被覆盖。

memcpy可能会覆盖EIP指向的内存中的指令流。但代码页通常不太靠近数据/堆栈/堆页面,并且通常也是只读的。

更常见的是堆或堆栈上的数据被覆盖,后续指令用作加载到EIP的地址 - 例如,如果函数指针被覆盖并用作回调,或者返回地址被覆盖并跳转到。

(在您的示例中,您已说过srclength受到控制,但dest怎么办?)

答案 2 :(得分:0)

如果eip表示x86的扩展指令指针,那么不是,不是直接(如果你有类似memcpy的有效实现的话)。这是因为x86的寄存器不是内存映射的。您可以通过覆盖调用memcpy时压入堆栈的返回值来间接执行此操作。然后,当memcpy返回时,它会将此错误值弹出到eip并尝试继续执行谁知道在哪里。

至于用有意义的东西覆盖它,这取决于你对“有意义”的意思。如果你的意思是“某些事情不会使程序崩溃(从操作系统的角度来看)立即”,那么是的。如果你假设你完全用随机数据覆盖它,那么从统计学上来说,你有很多页面以可执行的方式映射到你的程序中,以及许多可能的内存页面,并且可以计算你跳转到可执行文件的概率页。那么你有一个更难的时间来计算那些可以执行很长时间而不会崩溃的概率(这实际上是经典停止 问题的一种形式)。