当我控制src和length参数时,是否可以在以下情况下覆盖弹性公网I?
memcpy(float* dest,float* src,int length)
我想应该可以覆盖eip(?)但是有没有可能用有意义的东西覆盖它呢?
**很抱歉没有说清楚。通过覆盖EIP,我的意思是覆盖返回指针,在函数返回后EIP寄存器将使用该指针,从而转移程序执行。
发布于 2011-01-06 07:27:37
如果您所说的eip指的是x86的扩展指令指针,那么不是直接的(如果您有任何类似于memcpy的有效实现的东西)。这是因为x86的寄存器不是内存映射的。您可以通过覆盖调用memcpy时推送到堆栈上的返回值来间接完成此操作。然后,当memcpy返回时,它会将这个错误值弹出到eip中,并尝试从谁知道的地方继续执行。
至于用有意义的东西覆盖它,这取决于你所说的“有意义”是什么意思。如果你的意思是“不会让程序立即崩溃(从操作系统的角度来看)”,那么是的。如果你假设你完全用随机数据覆盖它,那么从统计上讲,你有如此多的页面映射到你的程序中,它们是可执行的,以及如此多可能的内存页面,并且可以计算出你跳到可执行页面的概率。然后,你就很难计算出在不崩溃的情况下可以执行很长时间的概率(这实际上是经典停顿问题的一种形式)。
发布于 2011-01-06 07:16:06
弹性公网it是寄存器,不能覆盖。您只能覆盖堆栈上的值。缓冲区溢出攻击涉及覆盖函数的返回值,从而将执行传递给可以解释为放在内存中某处的代码的数据。
在回应您的澄清时:
是。由于在调用函数时会将返回指针推送到堆栈上,因此可以写入此内存位置。它位于任何变量分配的上方(假设使用x86架构和默认的调用约定)。您可以在此处写入一个指向下一个内存位置的值,您应该在该位置加载与已处理的汇编语言指令相对应的二进制数据。请注意,通过按照我所描述的方式进行操作,您已经破坏了堆栈,并且在注入代码后程序可能会继续执行。为此,必须将返回地址保存在堆栈上的其他位置,并编写外壳代码将其复制到正确的位置,然后执行返回。
我还假设dest参数是可控制的。如果你不能将数据放在你想要的地方,那么它对你来说就是无用的
发布于 2011-01-06 07:19:32
覆盖弹性公网eip是什么意思?
弹性公网EIP是一个寄存器,不是内存。它不会被覆盖。
memcpy可能会覆盖EIP指向的内存中的指令流。但是代码页通常不太靠近数据/堆栈/堆页,而且通常也是只读的。
更常见的是堆或堆栈上的数据被覆盖,随后的指令将其用作加载到EIP中的地址-例如,如果函数指针被覆盖并用作回调,或者返回地址被覆盖并跳转到该地址。
(在您的示例中,您已经说过src和length是受控制的,但是dest呢?)
https://stackoverflow.com/questions/4610165
复制相似问题