Stack Overflow损坏%ebp

时间:2013-12-18 18:45:42

标签: c stack overflow buffer

我正在努力学习考试,并查看堆栈溢出的东西,我希望有人可以为我清理一些东西。 (假设这是在32位系统上,所以所有地址都是4个字节。我也是从C函数研究它,所以引用的任何代码都来自C)

假设我们的代码想要从标准输入中获取buf [4],因此它创建了一个四字节缓冲区。如果我们使用不检查越界的gets()版本,并输入字符串“12345”,我们将破坏堆栈上保存的%ebp。但是,这不会改变返回地址。这是否意味着程序将继续执行正确的代码,因为返回地址是正确的,它仍然会返回到调用函数中?或者损坏的%ebp是否意味着进一步的麻烦。

据我所知,如果我们输入更大的内容,如“123456789”,它也会破坏返回地址,从而导致程序无法运行。

2 个答案:

答案 0 :(得分:4)

EBP是当前堆栈帧的基指针。一旦用新值覆盖该基指针,对堆栈中项目的后续引用将不会引用堆栈的实际地址,而是引用刚刚提供的地址。

程序的进一步行为取决于代码随后是否以及如何在代码中使用。

答案 1 :(得分:2)

严重损坏的内容在很大程度上取决于生成的代码,因此这取决于编译器和设置。您也不知道真的ebp是否会被破坏。通常编译器会在变量中添加额外的字节,因此在一个字节溢出时根本不会发生任何事情。在较新的Visual Studio代码中,我看到添加了一些安全保护代码,这会导致抛出异常。

如果返回地址已损坏,则可以将其用作安装自己代码的漏洞的入口点。