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

Bbb*_*Bbb -2 c assembly

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

显然有一个原因,我想知道要么破坏一切或不防止缓冲区溢出,但它很简单,所以我敢肯定有人可以解释为什么我咆哮错误的树.

在此输入图像描述

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

Jes*_*ter 6

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

int foo;
scanf("%d", &foo);
Run Code Online (Sandbox Code Playgroud)

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

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

  • 也许考虑更经常洗澡;) (5认同)