其他功能管理libc中的漏放函数的地址,但无法获得地址

问题描述

我目前正在学习二进制漏洞利用。现在我正在使用一个容易受到堆栈缓冲区溢出影响的二进制文件(Linux)(启用了 ASLR 和 NX,并且二进制文件通过网络进行交互),并且我开发了一个 2 阶段漏洞利用,第一阶段泄漏了libc 中的 puts 函数(来自 GOT 并通过调用 puts 发送地址泄漏),第二阶段使用泄漏的地址计算一些 ROP gadget 的地址和 {{1} } 函数,用于获取远程代码执行。

问题是:

我在 IDA 中调试二进制文件并找到 execveputs 的地址,然后我可以计算 execveexecve 的偏移量。假设这个偏移量是 puts。然后在利用漏洞利用时,阶段1泄漏x的地址,然后puts找到execve的地址。这个漏洞在我安装的 Linux 上运行良好,但我注意到在其他版本的 linux 中,libc 中 puts -> execve 的偏移量 puts + x 是不同的(假设是因为它的 libc 版本不同)。所以我的问题是,对于具有未知偏移量的不同 Linux 风格,如何使用泄露的 libc 地址找到另一个函数的地址。

解决方法

这个漏洞在我安装的 Linux 上运行良好,但我注意到在其他版本的 linux 中,libc 中 puts -> execve 的偏移量 x 是不同的(假设是因为它的 libc 版本不同)。

正确:地址将根据确切的 GLIBC 源、使用的编译器和链接器的确切版本、编译标志等而变化。

简而言之,您可以知道特定 Linux 发行版中 libc6 包的特定版本的偏移量,但在任何一天都可能有 100 种不同的常用变体.

所以我的问题是,对于具有未知偏移量的不同 Linux 版本,如何使用泄露的 libc 地址找到另一个函数的地址。

你不能。

你唯一能做的就是

  • 下载常见版本的 GLIBC 通用版本,计算每个版本的偏移量,然后一一尝试,或者
  • 猜测系统之间的偏移量差别不大(您可以通过执行上述步骤来确认这是否确实如此),只需尝试 [x - N,x + N] 之间的所有值(其中 N 是可能偏差的最大客人)。