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