C 堆栈溢出损坏%ebp

C 堆栈溢出损坏%ebp,c,stack,overflow,buffer,C,Stack,Overflow,Buffer,我正在努力学习准备考试,翻阅堆积如山的东西,我希望有人能帮我澄清一些事情。(假设这是在一个32位系统上,所以所有地址都是4字节。我也在从C函数研究它,所以引用的任何代码都来自C) 假设我们的代码想要从标准输入中获取buf[4],因此它创建了一个四字节的缓冲区。如果我们使用的gets()版本不检查越界,并输入字符串“12345”,则会损坏堆栈上保存的%ebp。但是,这不会改变回信地址。这是否意味着程序将继续执行正确的代码,因为返回地址是正确的,并且仍将返回调用函数?或者损坏的%ebp是否意味着进一

我正在努力学习准备考试,翻阅堆积如山的东西,我希望有人能帮我澄清一些事情。(假设这是在一个32位系统上,所以所有地址都是4字节。我也在从C函数研究它,所以引用的任何代码都来自C)

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


我知道,如果我们输入像“123456789”这样的较大值,它也会损坏返回地址,从而导致程序无法运行

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


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

究竟损坏了什么严重取决于生成的代码,因此这取决于编译器和设置。您也不知道是否真的
ebp
会被损坏。编译器通常会向变量中添加额外的字节,因此在单字节溢出的情况下,可能根本不会发生任何事情。在较新的VisualStudio代码中,我看到添加了一些保护代码,这会导致抛出异常


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

请注意,
1234
也会破坏缓冲区(请记住空终止符)。这是一种非常未定义的行为,但很可能事情会继续,就像什么都没有发生一样。ebp通常用作局部(堆栈)变量的引用,因此,调用方下次使用局部变量时可能会取消对错误地址的引用。@OliCharlesworth是的,我忘了,谢谢。除了这个错误,你对目前的情况有什么看法?@MischaNix谢谢!这很有道理。