【发布时间】:2022-02-18 03:50:17
【问题描述】:
我知道 x86-64 和 x86 之间的主要区别在于内存大小,其中 x86 只能处理 32 位指令和 x86-64 64 位指令,问题变成实际上更难执行基于堆栈的指令x86_64 系统中的缓冲区溢出攻击比 x86 系统。例如,使用以下程序:
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[])
{
char buffer[64];
strcpy(buffer, argv[1]);
return 0;
}
除了调整 x86 和 x86-64 位架构的参数大小之外,是什么让执行缓冲区溢出变得更加困难? .
【问题讨论】:
-
那甚至无法编译,所以我会说执行缓冲区溢出会非常困难。你需要像
char buffer[5];这样的东西。所以你问的是,与 x86 相比,在 x86-64 上提供 5 个字节是否更难。答案是否定的。 -
除了内存大小之外,两种架构中的其他安全措施或效率使得在 x64 中执行缓冲区溢出比在 x86 中更难
-
顺便说一句,下次有人开发新的 ABI 时,堆栈应该切换为从低地址增长到高地址。这样,如果代码溢出它的缓冲区,它就不会进入记录返回地址的数据。它可能会破坏堆栈上的其他本地数据,这可能会根据代码产生问题,但返回地址并不是无处不在的危险。 (通过修改编译器将字符数组放在堆栈的最后,这可能会进一步缓解。)我在 Apple 开始使用 ARM 时提出了这个建议,但它在工具开发方面太过分了。
-
如果您想确定该区域在堆栈上而不是在其他地方,您需要使用一些非 C 标准功能。在 C 的手册中没有出现
stack这个词。如果你在 POSIX 中编程,你可以使用alloca来确保在堆栈上分配了一些东西。 -
我认为真正的问题是,x86_64 ABI 上的代码注入是否比前一个更难。如果缓冲区溢出的目的是用注入代码的地址替换函数调用,就像过去那样。
标签: c linux architecture buffer-overflow