我一直在关注StackGuard和类似的,以及英特尔的新技术预览"控制流程执行" (基本上是影子堆栈),这里:https://software.intel.com/sites/default/files/managed/4d/2a/control-flow-enforcement-technology-preview.pdf。
显然有一个原因让我想知道会破坏一切还是不能防止缓冲区溢出,但这很简单所以我确定有人可以解释为什么我会搞错了树。
为什么不在CPU硬件中实现写入高于或等于ebp的堆栈地址时中止/陷阱的可选功能?这样可以防止返回地址和函数参数被缓冲区溢出覆盖。
答案 0 :(得分:6)
使用ebp
作为帧指针是可选的,但当然可以更改。更糟糕的问题是,您可能合法地在堆栈框架外写入,例如,如果您有一个指向属于调用者的变量的指针:
int foo;
scanf("%d", &foo);
显然&foo
点在scanf
的框架之外。
功能参数不需要保护,也可以合法修改。但是,这也可以改变。