WWW2Exec - GOT/PLT
基本信息
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
pageOne Gadget保护
Full RELRO保护旨在通过在启动二进制文件时解析所有函数的地址并使GOT表只读来保护免受这种技术的攻击:
pageRelro参考
最后更新于