linux x86_64上的简单堆栈溢出攻击



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

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

为什么esp地址发生更改
如何处理此问题以继续遵循教程?

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

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

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

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

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

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

据我所知,你已经管理了ASLR,但对于其他可能读到这篇文章的人,你可以用关闭它

echo 0 > /proc/sys/kernel/randomize_va_space

作为根。

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

这里提供了一个以窗口为中心的教程。

最新更新