我目前正在学习二进制开发。现在我正在使用一个容易受到堆栈缓冲区溢出影响的二进制文件(Linux)(启用了 ASLR 和 NX,并且通过网络与二进制进行交互),并且我开发了一个 2 阶段漏洞,第一阶段泄漏了 libc 中puts
函数的地址(从 GOT 并通过调用puts
发送地址来泄漏), 第二阶段使用泄露的地址来计算几个 ROP 小工具的地址和用于获得远程代码执行的execve
函数。
问题是:
我在 IDA 中调试二进制文件并找到puts
和execve
的地址,这样我就可以计算execve
的偏移量puts
。假设此偏移量为x
.然后,当使用该漏洞时,阶段 1 泄漏puts
的地址,然后由puts + x
找到execve
的地址。这个漏洞在我安装的 Linux 上工作得很好,但我注意到在其他版本的 Linux 中,libc 中 put -> execve 的偏移x
是不同的(假设因为它是 libc 的不同版本)。所以我的问题是,如何使用泄露的libc地址找到另一个函数的地址,以获得具有未知偏移量的不同Linux风格。
这个漏洞在我的Linux安装上工作得很好,但我注意到在其他版本的Linux中,libc中放置->execve的偏移量x是不同的(假设因为它是libc的不同版本)。
正确:地址将根据确切的 GLIBC 源、使用的编译器和链接器的确切版本、编译标志等而变化。
简而言之,您可以知道特定 Linux 发行版中特定版本的libc6
包的偏移量,但在任何给定日期都有 100 种不同的变体常用。
所以我的问题是,如何使用泄露的libc地址找到另一个函数的地址,以获得具有未知偏移量的不同Linux风格。
你不能。
你唯一能做的就是
- 下载通用发行版的通用版本的 GLIBC,计算每个发行版的偏移量,并逐个尝试,或者
- 猜测系统之间的偏移量差异不大(您可以通过执行上述步骤确认这是否确实如此),然后只需尝试
[x - N, x + N]
之间的所有值(其中N
是可能偏差的猜测最大值)。