【问题标题】:is it harder to perform a stack Buffer Overflow in x86-64 than x86 system?在 x86-64 中执行堆栈缓冲区溢出是否比 x86 系统更难?
【发布时间】: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


【解决方案1】:

在 x86-64 上运行时在堆栈上溢出缓冲区比在 x86-32 上运行时更难。 gets 很高兴,在这两种架构上,只要您提供输入,就可以一直写到缓冲区的末尾。

在 x86-64 上可能利用缓冲区溢出来实现任意代码执行,因为许多特性x86-64 + 当前一代的操作系统和编译器有,而 x86-32 + 它的操作系统和编译器没有:

但是,这些都与具有 64 位地址空间的 x86-64 无关。 (如果您的地址空间更大,地址空间布局随机化更有效,但在 32 位空间中仍然完全有可能。)

此外,即使所有这些防御功能都已到位并处于活动状态,利用仍然是可能的。攻击者“只是”必须更聪明。

【讨论】:

    猜你喜欢
    • 2012-07-15
    • 1970-01-01
    • 1970-01-01
    • 2018-09-30
    • 2017-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多