GOT表覆写技术

Posted beiweisanshidu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GOT表覆写技术相关的知识,希望对你有一定的参考价值。

GOT表覆写技术

 

1、概念:

(1)GPT表:

1)概念:

每一个外部定义的符号在全局偏移表(GOT)中有相应的条目,GOT位于ELF的数据段中,叫做GOT段。

 

2)作用:

把位置无关的地址计算重定位到一个绝对地址。

程序首次调用某个库函数时,运行时连接编辑器(rtld)找到相应符号,

并将它重定位到GOT之后每次调用这个函数都会将控制权直接转向那个位置,而不再调用rtld。

 

(2)PLI表:

1)PLI表,过程连接表,一个PLI条目对应一个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
");
 6 }
 7 int main()
 8 {
 9     char a[100];
10     gets(a);
11     printf("you lose
");
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

以上是关于GOT表覆写技术的主要内容,如果未能解决你的问题,请参考以下文章

java源码 -- LinkedHashMap

覆写(Override)和重载(Overload)的比较

varnishlogVarnishstat详解

覆写toString方法 Java提供的默认toString方法不好用

SyntaxError: expected expression, got '<'

got & plt