Managed to leak 将函数地址放在libc中,但无法获取其他函数的地址

Managed to leak puts function address in libc, but unable to get addresses of other functions

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

问题是:

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

This exploit works fine on my installation of Linux, but i have noticed that in other flavours of linux, the offset x of puts -> execve in libc is different (Assuming because its a different build of libc).

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

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

So my question is, how can one find the address of another function using a leaked libc address, for a different Linux flavour which has an unknown offset.

你不能。

你唯一能做的就是

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