为什么不在ebp上面捕获堆栈写入以避免溢出漏洞?

时间:2016-06-14 00:16:02

标签: c assembly

我一直在关注StackGuard和类似的,以及英特尔的新技术预览"控制流程执行" (基本上是影子堆栈),这里:https://software.intel.com/sites/default/files/managed/4d/2a/control-flow-enforcement-technology-preview.pdf

显然有一个原因让我想知道会破坏一切还是不能防止缓冲区溢出,但这很简单所以我确定有人可以解释为什么我会搞错了树。

enter image description here

为什么不在CPU硬件中实现写入高于或等于ebp的堆栈地址时中止/陷阱的可选功能?这样可以防止返回地址和函数参数被缓冲区溢出覆盖。

1 个答案:

答案 0 :(得分:6)

使用ebp作为帧指针是可选的,但当然可以更改。更糟糕的问题是,您可能合法地在堆栈框架外写入,例如,如果您有一个指向属于调用者的变量的指针:

int foo;
scanf("%d", &foo);

显然&foo点在scanf的框架之外。

功能参数不需要保护,也可以合法修改。但是,这也可以改变。