问题描述
我目前正在学习二进制漏洞利用。现在我正在使用一个容易受到堆栈缓冲区溢出影响的二进制文件(Linux)(启用了 ASLR 和 NX,并且二进制文件通过网络进行交互),并且我开发了一个 2 阶段漏洞利用,第一阶段泄漏了libc 中的 puts
函数(来自 GOT 并通过调用 puts
发送地址泄漏),第二阶段使用泄漏的地址计算一些 ROP gadget 的地址和 {{1} } 函数,用于获取远程代码执行。
问题是:
我在 IDA 中调试二进制文件并找到 execve
和 puts
的地址,然后我可以计算 execve
与 execve
的偏移量。假设这个偏移量是 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
是可能偏差的最大客人)。