我正在学习本教程(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。
这里提供了一个以窗口为中心的教程。