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函数的参数)。
如果脚本未使用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参考
最后更新于