GOT表覆写技术
GOT表覆写技术
1、概念:
(1)GOT表:
1)概念:
每一个外部定义的符号在全局偏移表(GOT)中有相应的条目,GOT位于ELF的数据段中,叫做GOT段。
2)作用:
把位置无关的地址计算重定位到一个绝对地址。
程序首次调用某个库函数时,运行时连接编辑器(rtld)找到相应符号,
并将它重定位到GOT之后每次调用这个函数都会将控制权直接转向那个位置,而不再调用rtld。
(2)PLt表:
1)PLI表,过程连接表,一个PLT条目对应一个GOT条目。
2)当main函数开始,会请求plt中这个函数的对应GOT地址,如果第一次调用那么GOT会重定位到plt,并向栈中压入一个偏移,程序的执行就会回到_init()函数,
rtld得以调用就可以定位prinf的符号地址
3)第二次运行程序再次调用这个函数时程序跳入plt,对应的GOT入口点就是真实的函数入口地址。
4)动态连接器并不会把动态库函数在编译的时候就包含到ELF文件中,仅仅是在这个ELF被加载的时候,才会把那些动态函数代码加载进来,之前系统只会在ELF文件中的GOT中保留一个调用地址。
2、攻击:GOT表覆写技术
由于GOT表是可以写入的,所以将GOT表中要调用的函数地址覆盖成shellcode地址,就达到所要的目标。
3、实例:
1)代码:
1 #include <stdio.h> 2 #include <string.h> 3 void win() 4 { 5 printf("you win\n"); 6 } 7 int main() 8 { 9 char a[100]; 10 gets(a); 11 printf("you lose\n"); 12 return 0; 13 }
2)调试:
gets和puts函数后跟着plt,即这个为PLT表的对应的数据地址
GOT表-->PLT表
4、参考:
https://www.jianshu.com/p/8a401bfcff43
https://yq.aliyun.com/wenji/247854
https://blog.csdn.net/softee/article/details/41256595