如何解决堆栈安全问题组装

how to solve stack security problem assembly

我是一个新的汇编程序员,我想知道是否有一种方法可以完全清理堆栈 (来自所有函数参数和函数指针) 提前致谢

emu8086 模拟实模式。没有安全感;所有代码都以完全权限运行以接管整个机器。你必须相信你的来电者;您的调用者可能已经反汇编了您函数的机器代码,甚至在调用之前对其进行了修改。

但确保您 可以 在 return 之前覆盖堆栈上的参数。在大多数调用约定中,堆栈参数由被调用者 "owned" 提供,因此他们无论如何都可以将它们用作本地变量。

但是,不,不在内存或寄存器中留下目标地址就不可能跳转到某个地方pop cx / 零 return 地址 / jmp cx 会让你在覆盖内存中的 return 地址后模拟 ret,但它会在寄存器中。

我想也许你可以在 FLAGS 中设置 TF(单步模式陷阱标志)并在禁用 TF 之前使用调试中断处理程序做一些事情(比如将 return 地址设为零)再次。但是调试异常帧推送包含 return 地址的 CS:IP,并且使用 iret 从调试异常中 return 将

但请记住:return 地址不是有价值的信息。您要 return 访问的代码可能已经通过 call +0 找到了自己的地址; pop ax 只是调用它自己的函数之一。


在现代 x86 上, 种方法来创建受保护的 enclave。 例如,SGX is designed for that, and SMM (System Management Mode) 也是 "outside" 甚至一个内核。

或者在保护模式下,您可能会在不同权限域之间进行调用。通常 user-space 调用内核。 您可以通过让内核使用单独的私有内核堆栈来避免那里的信息泄漏。对于多线程系统中的安全性是必需的,否则另一个用户-space 线程会修改堆栈内存,同时内核正在使用它,控制内核 return 地址。

为了避免系统调用中的信息泄露;保留所有寄存器,但包含 return 值或清零的寄存器除外。这样你就不能在寄存器中留下任何内核临时数据。由于您根本没有使用 user-space 堆栈,所以这不是问题。