2013-12-18 159 views
4

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

说我们的代码想要在buf [4 ]来自标准输入,所以它会创建一个4字节的缓冲区。如果我们使用不检查超出范围的gets()版本,并输入字符串“12345”,我们将损坏堆栈中保存的%ebp。但是,这不会改变退货地址。这是否意味着程序将继续执行正确的代码,因为返回地址是正确的,它仍然会返回到调用函数中?或者,损坏的%ebp意味着更进一步的麻烦。

据我所知,如果我们输入更大的东西像“123456789”,它也会破坏返回地址,从而导致程序无法操作。

+2

请注意,'1234'也会打击缓冲区(记住空终止符)。 –

+2

那么这是非常不确定的行为,但有可能事情会继续下去,就好像什么都没有发生。 –

+2

ebp通常用作本地(堆栈)变量的引用,因此调用者可能最终在下次使用局部变量时取消引用不良地址。 – MischaNix

回答

4

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

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

+0

非常感谢 – KevEllis

2

究竟是什么被严重破坏取决于生成的代码,所以这是编译器和设置相关的。你也不知道是否真的ebp会被破坏。通常编译器会向变量添加额外的字节,所以一个字节溢出可能根本就没有发生。在较新的Visual Studio代码中,我看到添加了一些保护代码,这会导致引发异常。

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