首页 > 其他分享 >GOT表和PLT表

GOT表和PLT表

时间:2024-03-22 09:12:56浏览次数:20  
标签:PLT 函数 elf write 地址 got p32 GOT

GOT表和PLT表

一. 引入目地

操作系统通常使用动态链接的方法来提高程序运行的效率。在动态链接的情况下,程序加载的时候并不会把链接库中所有函数都一起加载进来,而是程序执行的时候按需加载,如果有函数并没有被调用,那么它就不会在程序生命中被加载进来。这样的设计就能提高程序运行的流畅度,也减少了内存空间。而且现代操作系统不允许修改代码段,只能修改数据段,那么GOT表与PLT表就应运而生。

二. 使用方法

plt表为(Procedure Link Table),是程序链接表。而got表为(Global Offset Table),是一个存储外部库函数的表,全局偏移表。

当程序在第一次运行的时候,会进入已被转载进内存中的动态链接库中查找对应的函数和地址,并把函数的地址放到got表中,将got表的地址数据映射为plt表的表项;在程序二次运行的时候,就不用再重新查找函数地址,而是直接通过plt表找到got表中函数的地址,从而执行函数的功能了。

image

三. 利用got表和plt表进行攻击

例题1:攻防世界 level3

1. 获得glibc库当中的相对偏移地址

  1. 获得函数相对地址

    from pwn import *
    elf = ELF(libc_32.so.6 相对于 py 文件的位置)
    print(hex(elf.symbols['system']-elf.symbols['write']))
    # 这里就是为了获得符号表中system函数和writes函数之间的偏移地址
    
    
  2. 获得字符串相对地址

    要获得字符串 "/bin/sh" 相对于 write 的位置,可以使用 strings 工具来执行 strings -at x libc_32.so.6|grep /bin/sh​​ 来获得字符串的地址,或者使用 ROPgadget 工具来执行 ROPgadget --binary libc_32.so.6 --string "/bin/sh"​​ 命令,两个工具的使用方式这里不做介绍;拿到地址后,减掉 write 的地址获得相对位置 0x84c6b。

2. 得到write函数的地址

执行write函数,利用栈溢出将eip指针指向write函数在plt表当中的表项,由于x32下是通过栈传参,所以可以直接使用栈进行传递参数。

payload = b'0'*0x8c+p32(elf.plt['write'])+b'0000'+p32(1)+p32(elf.got['write'])
+p32(10)
#b'0'*0x8c用于填充栈,p32(elf.plt['write'])用于修改eip,b'0000'是函数结束后的
#返回地址
#p32(1)+p32(elf.got['write'])+p32(10)用于write函数传参

但是这样还不够,我们之前说,由于开启了 PIE 和 ASLR ,库函数每次的地址都会改变,所以这次获得的地址在下一次运行时就没有意义,为此我们需要在获得函数地址后控制程序的执行流,让它回到 read 的地方,从而使我们能够输入另一条 payload 来获得 shell;不过其实回到 main 也可以,所以上面 b'0000' 的部分需要被改为

p32(elf.symbols['main'])​。因为在调用函数的时候是先传参最后再使用call指令push下一条指令,所以之前的b'0000'就是返回地址,现在把它改了,改成main函数的地址,这里也是使用符号表得到地址。

这样以后,我们通过 u32(p.recv()[:4])​ 即可获得 write 的地址,u32 可以看作是 p32 的逆操作,它的参数 p.recv()[:4] ,是取输出的前 4 个 byte,因为在 32 位程序中,地址只需要 4 个 byte 来表示。

3. 执行函数

获得 write 的地址后,我们可以根据上面计算得到的相对地址获得 system 和 “/bin/sh” 的地址,从而构造第二个 payload 为

b'0'*0x8c+p32(write_addr-0x99a80)+b'0000'+p32(write_addr+0x84c6b)​ ,这里我们只关心获得的 shell ,因此返回地址就写 0000 了。这里就是调用system函数了,得到flag。

四. 参考文章:

  1. got表和plt表在程序执行过程中的作用-腾讯云开发者社区-腾讯云 (tencent.com)
  2. 深入了解GOT,PLT和动态链接 - 有价值炮灰 - 博客园 (cnblogs.com)
  3. Anatomy of a Program in Memory | Many But Finite
  4. 攻防世界PWN题 level3 - 愚人呀 - 博客园 (cnblogs.com)

标签:PLT,函数,elf,write,地址,got,p32,GOT
From: https://www.cnblogs.com/ONEZJ/p/18088658/got-table-and-plt-table-zglckl

相关文章

  • MongoTemplate的CRUD的操作示例:
    importorg.springframework.data.mongodb.core.MongoTemplate;importorg.springframework.data.mongodb.core.query.Criteria;importorg.springframework.data.mongodb.core.query.Query;importorg.springframework.data.mongodb.core.query.Update;importorg.spring......
  • usering mongotemplate bases on spring-Data-mongo
     1、findmongoTemplate.find(Queryquery,Class<T>entityClass) returnvalue:List<T> example:  List<users>users=mongoTemplate.find(newQuery(Criteria.where("age").is(20).and("name").is("zhangsan"))......
  • break、continue与goto关键字
    breakbreak在任何循环语句的主体部分,均可用break控制循环的流程。break用于强行退出循环,不执行循环中剩余的语句。(break语句也在switch语句中使用)代码举例publicclassBreakDemo{publicstaticvoidmain(String[]args){inti=0;while(i<1......
  • Android 11 Zygote启动流程
    Zygote进程由init进程启动,是systemserver进程和APP进程的父进程先看一下rc文件,以init.zygote32.rc为例servicezygote/system/bin/app_process-Xzygote/system/bin--zygote--start-system-serverclassmainpriority-20userrootgrouprootr......
  • mysql报错:SQL 错误 [1030] [HY000]: Got error 100 - 'InnoDB error' from storage en
    在mysql中进行alter时,报错:SQL错误[1030][HY000]:Goterror100-'InnoDBerror'fromstorageengine 原因:在配置my.cnf或my.ini里面innodb_force_recovery参数的值大于0,它默认值为0,如果大于0,innodb就会禁用insert、update、delete、alter语句。解决方式:在配置my.cn......
  • Java流程控制11:break、continue、goto
    breakcontinue1.break在任何循环语句的主体部分,均可用break控制循环的流程。break用于强行退出循环,不执行循环中剩余的语句。(break语句也在switch语句中使用)2.continue语句用在循环语句体中,用于终止某次循环过程,即跳过循环体中尚未执行的语句,接着进行下一次是否......
  • 桌面应用开发GOTK3 Glade (GO语言)
    目录Github简介环境变量官方示例demo.gladeGithubmain.goGithubhttps://github.com/GNOME/gtkhttps://github.com/gotk3/gotk3gitclonehttps://github.com/gotk3/gotk3.git简介gotk3项目为GTK3和依赖项目提供Go绑定。每个组件都有自己的子目录,用作包的导入路径......
  • 关于plt.imshow显示图像发蓝问题的解决办法
    彩色图像出现色差使用cv2.imread()读取图像时,默认彩色图像的三通道顺序为B、G、R,这与我们所熟知的RGB中的R通道和B通道正好互换位置了。而使用plt.imshow()函数却默认显示图像的通道顺序为R、G、B,导致图像出现色差发蓝。彩色图像出现色差代码:1importcv22importnumpyas......
  • (GPLT)上海理工大学校内选拔赛(重现赛)
    题目链接A.记录最大值和个数,和次大值遍历数组,不是最大值,输出该数与最大值的和是最大值,则讨论最大值个数,若只有一个,输出该数与次大值的和,否则输出最大值的两倍#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=1e5+10;voidsolve(){......
  • 跳转语句:包括break、continue和goto语句的作用和注意事项。
    跳转语句是一种在程序中改变代码执行顺序的语句。常见的跳转语句包括break、continue和goto语句。本文将为你介绍它们的作用和注意事项。break语句break语句用于在循环语句中提前结束循环,跳出循环体。它只能用于for循环、while循环和do-while循环中,不能单独使用。当break语句被执行......