【问题标题】:Simple stack overflow exploit on linux x86_64linux x86_64 上的简单堆栈溢出漏洞利用
【发布时间】:2013-07-09 13:39:20
【问题描述】:

我正在学习本教程( https://www.youtube.com/watch?v=8xonDJe3YxI )与运行在 Arch linux x86_64 机器上的服务器(我使用 -m32 标志编译)。

一切都很好,但是当我使用gdb 打开核心转储文件时,它显示每次运行应用程序时esp 地址都会更改...

为什么esp 地址会改变?
我该如何处理才能继续遵循教程?

【问题讨论】:

  • 可能与它的多线程方面有关吗?
  • 另外,你确定你禁用了堆栈/地址随机化吗?
  • 我确定,它已启用。大多数情况下,这是它的标志。
  • 是的! ASLR 是问题,谢谢 :) 所以在现实世界环境中,内存是随机的,我应该为视频的“shellcode”部分(从 32:15 到 40:37)做什么?
  • 为了研究/实验/教育的目的做这样的事情没有错

标签: linux memory-management assembly overflow x86-64


【解决方案1】:

不幸的是,在 x64 上很可能不会有简单的漏洞利用这样的事情。在您已经遇到的其他问题中,例如ASLR,您还必须满足于 NX 位是所有支持 x64 的处理器的特性这一事实。

要了解您的 CPU 是否支持 NX:cat /proc/cpuinfo | grep "nx"。如果您看到标志中突出显示了nx,则说明您有 NX 位并且内核可能正在使用它。

NX 位是一种硬件支持的方法(嗯,从技术上讲,内核会指示不应该执行哪些页面)来表示“这里的内存区域,永远不要执行它”。这通常应用于堆栈,因为它巧妙地击败了任何类型的注入 shell 代码。您的基于堆栈的漏洞利用可能会覆盖跳转到您想要的任何位置 - 即您刚刚使用 nullfree 代码插入的缓冲区。除了现在处理器引发故障而不是在那里移动 eip/rip。

您可以将其关闭,但您需要在每个进程的基础上执行此操作,因为此标志是 ELF 的一部分。为此,请使用execstack 实用程序,它还可以查询可执行堆栈的状态。

您也可以使用gcc -z execstack 进行此帖子构建。

正如您毫无疑问地意识到的那样,这不是一个常见的现实世界场景。 Linux 上有运行 execstack 的二进制文件(我相信 Nvidia 图形组件就是其中之一),但它们很少见。

据我了解,您已经管理了 ASLR,但对于可能阅读此内容的其他人,您可以使用以下命令将其关闭:

echo 0 > /proc/sys/kernel/randomize_va_space

作为根用户。

解决不可执行堆栈(可能会受到 ASLR 阻碍)的方法是使用面向返回的编程。一个非常非常简单的概述:由于您可以覆盖堆栈,因此您可以为已知函数(如 C 标准库)编写一个看起来像堆栈帧(或一系列堆栈帧)的堆栈。这些让您可以运行 libc 函数,它们可以实现的功能非常强大。不过,您不仅限于 libc。

一个以 Windows 为中心的教程是 available here

【讨论】:

  • 该死,我怎么能忘记 NX 位:P
猜你喜欢
  • 2012-06-02
  • 2011-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
  • 1970-01-01
  • 2012-01-16
  • 1970-01-01
相关资源
最近更新 更多