首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >memcpy溢出

memcpy溢出
EN

Stack Overflow用户
提问于 2011-01-06 07:11:35
回答 3查看 2.1K关注 0票数 0

当我控制src和length参数时,是否可以在以下情况下覆盖弹性公网I?

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

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-06 07:27:37

如果您所说的eip指的是x86的扩展指令指针,那么不是直接的(如果您有任何类似于memcpy的有效实现的东西)。这是因为x86的寄存器不是内存映射的。您可以通过覆盖调用memcpy时推送到堆栈上的返回值来间接完成此操作。然后,当memcpy返回时,它会将这个错误值弹出到eip中,并尝试从谁知道的地方继续执行。

至于用有意义的东西覆盖它,这取决于你所说的“有意义”是什么意思。如果你的意思是“不会让程序立即崩溃(从操作系统的角度来看)”,那么是的。如果你假设你完全用随机数据覆盖它,那么从统计上讲,你有如此多的页面映射到你的程序中,它们是可执行的,以及如此多可能的内存页面,并且可以计算出你跳到可执行页面的概率。然后,你就很难计算出在不崩溃的情况下可以执行很长时间的概率(这实际上是经典停顿问题的一种形式)。

票数 0
EN

Stack Overflow用户

发布于 2011-01-06 07:16:06

弹性公网it是寄存器,不能覆盖。您只能覆盖堆栈上的值。缓冲区溢出攻击涉及覆盖函数的返回值,从而将执行传递给可以解释为放在内存中某处的代码的数据。

在回应您的澄清时:

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

我还假设dest参数是可控制的。如果你不能将数据放在你想要的地方,那么它对你来说就是无用的

票数 4
EN

Stack Overflow用户

发布于 2011-01-06 07:19:32

覆盖弹性公网eip是什么意思?

弹性公网EIP是一个寄存器,不是内存。它不会被覆盖。

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

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

(在您的示例中,您已经说过srclength是受控制的,但是dest呢?)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4610165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档