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\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

原文地址:https://www.cnblogs.com/beiweisanshidu/p/10271197.html

时间: 2024-08-30 18:07:46

GOT表覆写技术的相关文章

java重载与覆写

很多同学对于overload和override傻傻分不清楚,建议不要死记硬背概念性的知识,要理解着去记忆. 先给出我的定义: overload(重载):在同一类或者有着继承关系的类中,一组名称相同,参数不同的方法组.本质是对不同方法的称呼. override(覆写):存在继承关系的两个类之间,在子类中重新定义了父类中存在的方法.本质是针对同一个方法,给出不同的实现. 我们先来看重载的例子: public class OverloadParent{ public String getPerson(

为什么覆写equals必须要覆写hashCode?

============================================= 原文链接: 为什么覆写equals必须要覆写hashCode? 转载请注明出处! ============================================= <Effective java>Chapter Three  Item 9:Always override hashCode when you overried equals. (下载链接: Effective_java(英文版)第

JAVA覆写Request过滤XSS跨站脚本攻击

注:本文非本人原著. demo的地址:链接:http://pan.baidu.com/s/1miEmHMo 密码:k5ca 如何过滤Xss跨站脚本攻击,我想,Xss跨站脚本攻击令人为之头疼.为什么呢. 尤其是有富文本编辑器的产品.xss可能出现在http的head,不说别的,新浪多次出现. xss可以出现在post数据的正文.图片的url. 于是各种Xss横行,如今Xss跨站脚本漏洞的流行程度甚至超过了当年的sql. 那么对于JAVA语言,如何防御呢. 笔者分享一个思路:所有的web项目,所有的

11.JAVA-Object类之finalize(),clone(),toString()等方法覆写

1.Object介绍 Object类是一个特殊的类,是所有类(包括数组,接口 )的父类,如果一个类没有用extends明确指出继承于某个类,那么它默认继承Object类,所以可以通过向上转型的方法使用类型为Object的变量指向任意类型的对象. 本章主要实现覆写Object类的clone(),toString()equals(),finalize()等最重要的方法. 2.覆写finalize() 在之前我们学习析构方法时,便讲过finalize(). 参考之前学的finallize方法示例:3.

Java重载、覆写、this、super、抽象类、接口

第一.重载和覆写 1) 重载:方法名相同,参数类型和个数不同,典型的是构造方法的重载  覆写:方法名.参数类型.返回值类型全部相同,典型的是接口的实现: 2)重载对权限没有要求:覆写要求  被覆写的方法不能拥有更严格的权限: 3)重载发生再一个类中:覆写发生在继承类中. 第二.this和super 1)this访问本类中的属性(方法),如果本类中没有此属性(方法),则从父类中 继续寻找:super询问父类中的属性(方法): 2)调用本类构造,必须放在构造方法的首行:调用父类构造,必须放在子类构造

Objective-C-类(static)方法、实例方法、overwrite(覆写)、属性(property)复习

先来定义一个Human父类 定义部分: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 // //  Human.h //  OOP // //  Created by jimmy.yang on 11-2-9. //  Copyright 2011 __MyCompanyName__. All rights reserved. // #import <Foundation/Foundation.h> @interface Human :

方法的覆写

方法的覆写 类和父类有相同的方法,那么类中方法的访问权限不能比父类中对应方法的访问权限严格,这就叫方法的覆写,一般称之为类覆写了父类中的某个方法 覆写方法的作用:对于一个类,向上转换后(把类的实例化对象赋值给类的父类的对象),通过该父类的对象直接访问该父类的对象的本类部分中被类所覆写的方法时,将自动访问跳转到类中对应的覆写的方法 static方法的覆写不起覆写作用,原因现阶段只能解释为Java就是这样设计的 package test1; public class Test1 { public s

object 类 toString() 和 equals() 的覆写

基本作用: objiect类是所有类的父类. 任何一个类定义的时候如果没有明确定义了父类的话,默认父类是Object类. class A extends Object{} 在整个java里面,类的继承关系一直存在的.例如: String 类 这时候一个好处就出现了,利用Object类可以接受一切类. Object obj = new Book() ://向上转型 Obect obj = “Hello”  : //向上转型 如果不知道参数类型的时候,使用Object是最好的选择 http://do

覆写、重写、多态

1.父类对象用子类对象来实例化的,那么,这个新对象只继承父类的成员,子类的成员根本没有实例化. ** 编译时已经决定左边对象的类型,右边的类型只要包含右边类就可以. 2.虚方法:virtual 他只能修饰方法的,这个虚方法是包含实现的,虚方法和抽象方法一样也可以用override来覆写. 这种功能是为将来留出了修改这个方法的可能. 3.覆写:override 当用override覆写之后原方法是已经覆盖掉了,所以不能再被执行,这时父类对象用子类对象来实例化时,对象获得不了已经被覆盖掉的原方法,只