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

posted @ 2019-01-15 12:22  beiweisanshidu  阅读(1420)  评论(0编辑  收藏  举报