hacktricks/binary-exploitation/arbitrary-write-2-exec/aw2exec-got-plt.md

5.9 KiB
Raw Blame History

WWW2Exec - GOT/PLT

从零开始学习AWS黑客技术成为专家 htARTEHackTricks 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,则系统函数不会在PLT中有一个条目。在这种情况下您将需要首先泄漏system函数的地址然后覆盖GOT以指向此地址。

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

libc GOT条目

libc的GOT通常使用部分RELRO编译,假设可以找出其地址(ASLR)。

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

此技术的更多信息

One Gadget

{% content-ref url="../rop-return-oriented-programing/ret2lib/one-gadget.md" %} one-gadget.md {% endcontent-ref %}

保护

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

{% content-ref url="../common-binary-protections-and-bypasses/relro.md" %} relro.md {% endcontent-ref %}

参考

从零开始学习AWS黑客技术成为专家 htARTEHackTricks AWS红队专家

支持HackTricks的其他方式