linux x86_64上的简单堆栈溢出漏洞利用

时间:2013-07-09 13:39:21

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

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

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

为什么esp地址会发生变化? 如何处理此问题以继续学习本教程?

1 个答案:

答案 0 :(得分:4)

不幸的是,很有可能在x64上没有简单的利用这样的东西。您已遇到的其他问题包括: ASLR,您还必须满足于NX-bit是所有支持x64的处理器的功能。

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

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

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

您也可以使用gcc -z execstack构建后发布此内容。

毫无疑问,这不是一个普通的现实场景。在运行execstack的Linux上有二进制文件(Nvidia图形组件我相信一个),但它们很少见。

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

echo 0 > /proc/sys/kernel/randomize_va_space

以root身份。

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

以Windows为中心的教程是available here