我正在努力学习考试,并看着堆栈溢出的东西,我希望有人能为我清理一些东西。 (假设这是一个32位系统,所以所有的地址都是4个字节,我也从C函数学习它,所以任何代码引用都来自C)堆栈溢出损坏%ebp
说我们的代码想要在buf [4 ]来自标准输入,所以它会创建一个4字节的缓冲区。如果我们使用不检查超出范围的gets()版本,并输入字符串“12345”,我们将损坏堆栈中保存的%ebp。但是,这不会改变退货地址。这是否意味着程序将继续执行正确的代码,因为返回地址是正确的,它仍然会返回到调用函数中?或者,损坏的%ebp意味着更进一步的麻烦。
据我所知,如果我们输入更大的东西像“123456789”,它也会破坏返回地址,从而导致程序无法操作。
请注意,'1234'也会打击缓冲区(记住空终止符)。 –
那么这是非常不确定的行为,但有可能事情会继续下去,就好像什么都没有发生。 –
ebp通常用作本地(堆栈)变量的引用,因此调用者可能最终在下次使用局部变量时取消引用不良地址。 – MischaNix