我正在努力学习考试,并查看堆栈溢出的东西,我希望有人可以为我清理一些东西。 (假设这是在32位系统上,所以所有地址都是4个字节。我也是从C函数研究它,所以引用的任何代码都来自C)
假设我们的代码想要从标准输入中获取buf [4],因此它创建了一个四字节缓冲区。如果我们使用不检查越界的gets()版本,并输入字符串“12345”,我们将破坏堆栈上保存的%ebp。但是,这不会改变返回地址。这是否意味着程序将继续执行正确的代码,因为返回地址是正确的,它仍然会返回到调用函数中?或者损坏的%ebp是否意味着进一步的麻烦。
据我所知,如果我们输入更大的内容,如“123456789”,它也会破坏返回地址,从而导致程序无法运行。
答案 0 :(得分:4)
EBP
是当前堆栈帧的基指针。一旦用新值覆盖该基指针,对堆栈中项目的后续引用将不会引用堆栈的实际地址,而是引用刚刚提供的地址。
程序的进一步行为取决于代码随后是否以及如何在代码中使用。
答案 1 :(得分:2)
严重损坏的内容在很大程度上取决于生成的代码,因此这取决于编译器和设置。您也不知道真的ebp
是否会被破坏。通常编译器会在变量中添加额外的字节,因此在一个字节溢出时根本不会发生任何事情。在较新的Visual Studio代码中,我看到添加了一些安全保护代码,这会导致抛出异常。
如果返回地址已损坏,则可以将其用作安装自己代码的漏洞的入口点。