WWW2Exec - GOT/PLT

从零开始学习AWS黑客技术,成为专家 htARTE(HackTricks AWS红队专家)

支持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 0xDIR_GOT

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

GOT2Exec

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

理想情况下,您将覆盖将由您控制参数调用的函数GOT(因此您将能够控制发送到system函数的参数)。

如果脚本未使用system,则系统函数不会在PLT中有一个条目。在这种情况下,您将**需要首先泄漏system**函数的地址,然后覆盖GOT以指向此地址。

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

libc GOT条目

libc的GOT通常使用部分RELRO编译,如果能够找出其地址(ASLR),则成为一个很好的目标。

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

此技术的更多信息

One Gadget

One Gadget

保护

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

Relro

参考

从零开始学习AWS黑客技术,成为专家 htARTE(HackTricks AWS红队专家)

支持HackTricks的其他方式:

最后更新于