GOT Hijack
GOT Hijack
GOT表劫持。
GOT和PLT
个人理解
GOT
,global offset table
,全局偏移表;PLT
,procedure linkage table
,函数链接表。
GOT和PLT是重定向
的一种实现方式。在程序编译时(动态编译),在程序中会留下一些变量和函数的“坑”,这些坑只记录了程序用到的变量和符号,但并没有真正实现的代码,而程序运行时,会由解释器或动态链接器ld
在这些坑中填上真正变量或函数的地址,比如我们使用到puts
函数,在二进制文件中并不会把puts函数代码编译进去,而是在GOT
表中留下了puts
函数的一个地址,这个地址指向plt
表,而plt表会通过dl_runtime_resolve
来把这个函数地址解释出来,再将这个地址填回GOT表中的坑,这时GOT表的puts函数就不会再次指向plt表,而是直接指向内存中真正puts函数的地址,这种机制叫做延迟绑定
。
GOT 位于 .got.plt section 中,而 PLT 位于 .plt section中
GOT劫持
GOT劫持就是通过程序的漏洞或功能,将GOT表中的函数地址修改为我们想要执行的函数或代码地址,当程序再次调用该函数时,就会跳转到我们的目标地址处开始执行,进而劫持程序执行流程。
练习
源码如下:
1 | // gcc gothijack.c -no-pie -z execstack -o gothijack |
思路:
脚本
1 | from pwn import * |