WWW2Exec - GOT/PLT

Reading time: 7 minutes

tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)

支持 HackTricks

基本信息

GOT: 全局偏移表

全局偏移表 (GOT) 是一种用于动态链接二进制文件的机制,用于管理 外部函数的地址。由于这些 地址在运行时才会被知道(由于动态链接),GOT 提供了一种方法来 动态更新这些外部符号的地址 一旦它们被解析。

GOT 中的每个条目对应于二进制文件可能调用的外部库中的一个符号。当 函数第一次被调用时,其实际地址由动态链接器解析并存储在 GOT 中。对同一函数的后续调用使用存储在 GOT 中的地址,从而避免了再次解析地址的开销。

PLT: 过程链接表

过程链接表 (PLT) 与 GOT 密切合作,作为处理对外部函数调用的跳板。当二进制文件 第一次调用外部函数时,控制权会传递给与该函数关联的 PLT 中的一个条目。这个 PLT 条目负责调用动态链接器来解析函数的地址,如果它尚未被解析。地址解析后,它会存储在 GOT 中。

因此, 一旦外部函数或变量的地址被解析,GOT 条目就会被直接使用。PLT 条目用于通过动态链接器促进这些地址的初始解析

获取执行

检查 GOT

使用以下命令获取 GOT 表的地址:objdump -s -j .got ./exec

观察在 GEF 中 加载 可执行文件 后,您可以 看到 GOT 中的 函数gef➤ x/20x 0xADDR_GOT

使用 GEF,您可以 开始 一个 调试 会话并执行 got 以查看 GOT 表:

GOT2Exec

在二进制文件中,GOT 包含 函数的地址或 PLT 部分的地址,该部分将加载函数地址。此任意写入的目标是 覆盖一个函数的 GOT 条目,该函数将在稍后 执行,例如 system 函数PLT 地址。

理想情况下,您将 覆盖 一个 将被调用并由您控制参数的函数的 GOT(这样您就可以控制传递给系统函数的参数)。

如果 system 未被 二进制文件使用,则系统函数 不会 在 PLT 中有条目。在这种情况下,您需要 首先泄漏 system 函数的地址,然后覆盖 GOT 以指向该地址。

您可以使用 objdump -j .plt -d ./vuln_binary 查看 PLT 地址。

libc GOT 条目

libc 的 GOT 通常编译为 部分 RELRO,使其成为一个不错的目标,假设可以找出其地址(ASLR)。

libc 的常见函数将调用 其他内部函数,其 GOT 可以被覆盖以获得代码执行。

在这里找到 有关此技术的更多信息

Free2system

在堆利用 CTF 中,通常可以控制块的内容,并在某些时候甚至覆盖 GOT 表。如果没有可用的一个 gadget,获取 RCE 的一个简单技巧是将 free GOT 地址覆盖为指向 system,并在一个块中写入 "/bin/sh"。这样,当这个块被释放时,它将执行 system("/bin/sh")

Strlen2system

另一种常见技术是将 strlen GOT 地址覆盖为指向 system,因此如果此函数使用用户输入被调用,则可以传递字符串 "/bin/sh" 并获得一个 shell。

此外,如果 puts 使用用户输入,则可以将 strlen GOT 地址覆盖为指向 system,并传递字符串 "/bin/sh" 以获得一个 shell,因为 puts 将使用用户输入调用 strlen

一个 Gadget

One Gadget

从堆滥用 GOT

从堆漏洞获得 RCE 的一种常见方法是滥用 fastbin,以便可以将 GOT 表的一部分添加到 fast bin 中,因此每当分配该块时,就可以 覆盖一个函数的指针,通常是 free
然后,将 free 指向 system,并释放一个写入了 /bin/sh\x00 的块将执行一个 shell。

可以在这里找到一个 示例

保护

完全 RELRO 保护旨在通过在二进制文件启动时解析所有函数的地址并在此之后使 GOT 表只读 来防止这种技术:

Relro

参考

tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)

支持 HackTricks