0

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

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

为什么esp地址变了?
我该如何处理以继续遵循本教程?

4

1 回答 1

4

不幸的是,很可能不会有 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 为中心的教程。

于 2013-07-10T10:30:30.067 回答