我正在关注本教程( https://www.youtube.com/watch?v=8xonDJe3YxI)与运行在arch linux x86_64计算机上的服务器(我使用-m32标志编译)。
一切都很好但是当我用gdb
打开核心转储文件时,它会显示每次运行应用程序时esp
地址都会更改...
为什么esp
地址会发生变化?
如何处理此问题以继续学习本教程?
答案 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。