WWW2Exec - GOT/PLT
Tip
学习和实践 AWS 黑客技术:
HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
学习和实践 Azure 黑客技术:
HackTricks Training Azure Red Team Expert (AzRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。
基本信息
GOT: 全局偏移表
全局偏移表 (GOT) 是一种用于动态链接二进制文件的机制,用于管理外部函数的地址。由于这些地址在运行时才会被知道(由于动态链接),GOT 提供了一种方法来在解析后动态更新这些外部符号的地址。
GOT 中的每个条目对应于二进制文件可能调用的外部库中的一个符号。当函数第一次被调用时,其实际地址由动态链接器解析并存储在 GOT 中。对同一函数的后续调用使用存储在 GOT 中的地址,从而避免了再次解析地址的开销。
PLT: 过程链接表
过程链接表 (PLT) 与 GOT 密切合作,作为处理对外部函数调用的跳板。当二进制文件第一次调用外部函数时,控制权会传递给与该函数关联的 PLT 中的一个条目。这个 PLT 条目负责调用动态链接器来解析函数的地址,如果该地址尚未被解析。地址解析后,它会存储在GOT中。
因此, 一旦外部函数或变量的地址被解析,GOT 条目就会被直接使用。PLT 条目用于通过动态链接器促进这些地址的初始解析。
获取执行
检查 GOT
使用以下命令获取 GOT 表的地址:objdump -s -j .got ./exec
.png)
观察在 GEF 中加载可执行文件后,您可以看到在GOT中的函数:gef➤ x/20x 0xADDR_GOT
 (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (2) (2).png)
使用 GEF,您可以开始一个调试会话并执行**got**以查看 GOT 表:
.png)
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 表。一个简单的技巧是将 free GOT 地址覆盖为指向 system,并在一个块中写入 "/bin/sh"。这样,当这个块被释放时,它将执行 system("/bin/sh")。
Strlen2system
另一个常见的技术是将**strlen** GOT 地址覆盖为指向**system**,因此如果这个函数使用用户输入被调用,可以传递字符串 "/bin/sh" 并获得一个 shell。
此外,如果 puts 使用用户输入,则可以将 strlen GOT 地址覆盖为指向 system,并传递字符串 "/bin/sh" 以获得一个 shell,因为**puts 将使用用户输入调用 strlen**。
One Gadget
从堆滥用 GOT
从堆漏洞获得 RCE 的一种常见方法是滥用 fastbin,以便可以将 GOT 表的一部分添加到 fast bin 中,因此每当分配该块时,就可以覆盖一个函数的指针,通常是 free。
然后,将 free 指向 system,并释放一个写入了 /bin/sh\x00 的块将执行一个 shell。
可以在这里找到一个示例。
保护
完全 RELRO 保护旨在通过在二进制文件启动时解析所有函数的地址并在之后使GOT 表只读来防止这种技术:
参考
- https://ir0nstone.gitbook.io/notes/types/stack/got-overwrite/exploiting-a-got-overwrite
- https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook
Tip
学习和实践 AWS 黑客技术:
HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
学习和实践 Azure 黑客技术:
HackTricks Training Azure Red Team Expert (AzRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。
HackTricks

