首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

一个例子引出的PLTGOT姐妹花

最近刚刚接触到PLTGOT,所以就想以此篇文章来巩固一下我对于这对姐妹花的理解啦!刚刚接触,理解不深,还请大佬轻喷!...二、代码示例引入 对程序运行有个大致的概念后,我们再利用一个小程序来引入对PLTGOT姐妹花的正式的讲解啦!...存放调用跳转代码的过程表,称为过程链接表(PLT:call跳转PLT表,然后PLT表在call + GOT的绝对地址实现函数的调用)。 如下,为动态链接的一个简要示意图: ?...三、延迟重定位 从上面可知,当需要对一个函数进行调用时,他的汇编代码call首先会掉用PLT表,然后PLT再通过调用GOT动态库实现重定位连接,这样函数调用动态库时便类似于间接 jmp+地址。...因此Linux便产生了延迟重定位:也就是当你调用函数的时候函数才开始执行重定位和地址解析工作。

76420
您找到你想要的搜索结果了吗?
是的
没有找到

Pwn基础:PLT&GOT表以及延迟绑定机制

Linux 动态链接 关于动态链接静态链接,可以打个比方就是:如果我的文章引用了别人的一部分文字,在我发布文章的时候把别人的段落复制到我的文章里面就属于静态连接,而给链接让你们自己去找着看就属于动态链接了...PLT&GOT linux 下的动态链接是通过 PLT&GOT 来实现的,这里做一个实验,通过这个实验来理解 使用如下源代码 test.c: #include void print_banner...可执行文件里面保存的是 PLT 表的地址,对应 PLT 地址指向的是 GOT 的地址,GOT 表指向的就是 glibc 中的地址 那我们可以发现,在这里面想要通过 plt 表获取函数的地址,首先要保证...got 表已经获取了正确的地址,但是在一开始就进行所有函数的重定位是比较麻烦的,为此,linux 引入了延迟绑定机制 延迟绑定 只有动态库函数在被调用时,才会地址解析和重定位工作,为此可以使用类似这样的代码来实现...,plt 表的第一条都是跳转到对应的 got 表项,而 got 表项的内容我们可以通过 gdb 来看一下,如果函数还没有执行的时候,这里的地址是对应 plt 表项的下一条命令,即 push 0x0 (说一下怎么查看

2.4K40

PWN 利用mprotect函数进行.got.plt地址段的读取

mprotect函数详解 在Linux中,mprotect()函数可以用来修改一段指定内存区域的保护属性 函数原型如下: #include #include <sys/mmap.h...mprotect函数的利用 这个函数利用方式为将目标地址:.got.plt或.bss段 修改为可读可写可执行 例题分析 not_the_same_3dsctf_2016 原题链接:https://buuoj.cn...第二个参数需要设置为被修改内存的大小,这里我还没完全弄明白具体要设置多大,这里我设置为0x100 第三个参数需要设置为被修改内存的权限,这里设置为7 = 4 + 2 + 1 (rwx) 也就是读写执行,这里如果不是很理解,可以百度一下Linux...= 0x080EB000 # .got.plt表的起始地址 got_plt_size = 0x100 # 内存长度 got_plt_type = 0x7 # 内存权限,读写执行 def main...) + p32(got_plt_size) + p32(got_plt_type) # mprotect的三个参数 payload += p32(elf.symbols['read']) #

46710

ROP-ret2libc基础知识

ROP-ret2libc基础知识 前提知识准备 Linux延时绑定机制 Linux演示绑定机制的实现 延迟绑定对我们有什么意义 libc函数在哪?...ret2libc使用条件 如何使用libc plt表和got表的关系 整体的跟踪 前提知识准备 Linux延时绑定机制 动态连接的程序调用了libc的库函数,但是libc在运行才被加载到内存中,调用libc...Linux演示绑定机制的实现 a、所有程序调用的libc函数都有对应的pltgot表,其位置固定 b、plt表:调用call put@plt plt表中存放的指令:jmp[puts_got] c、...,用于泄露地址 覆盖新地址到got表,劫持函数的流程 plt表: 不用知道libc函数真实地址,使用plt地址就可以调用函数 libc就是linux下的c函数库: libc中包含着各种常用的函数,...表和got表的关系 这个图一定要理解了 每次调试一个函数的时候,我们都会看到一个call puts@plt,它会从plt表中来找一个真实地址,真实地址呢都是在我没的got表中,plt表再去got表来找

5410

ret2libc过地址随机化

(4)GOT表项中的数据才是函数最终的地址,而PLT表中的数据又是GOT表项的地址,我们就可以通过PLT表跳转到GOT表来得到函数真正的地址 (5)地址随机化并没有对PLT表、GOT表产生作用 了解到上面的知识点后...,可以用下面的思路来获取地址: (1)找到gets函数的真实地址 (2)计算出system和/bin/sh这两个参数gets函数真实地址之间的差值,这样就可以找出system/bin/sh的地址 (...这里可以看见调用了gets()函数,还可以看见gets@plt 那么使用此语句查看PLT表:objdump -d -M intel -j .plt 1.exe ?...可以看见在我们执行gets函数时,我们会先去到plt表,然后又会jmp到GOT里面的真实地址:0x8049030 接下来我们计算计算system、/bin/shgets函数的相对偏移 ?...")p=process("1.exe")//加载1.exe进程e=ELF("1.exe")//加载1.exe文件,分析ELF结构addr_write=e.plt["write"]addr_gets=e.got

85020

python中plt.imshowcv2.imshow显示颜色问题

121);plt.imshow(img) plt.subplot(122);plt.imshow(img2) plt.show() cv2.imshow('bgr image',img) cv2...下面看下cv2.imshow()和plt.imshow()的区别 什么时候使用plt.show(),什么时候用cv2.imshow()?...opencv是BGR通道,plt默认RGB通道,若使用cv2.imread()读入图像,用plt.imshow()展示原始图像或者展示对读入图像进行一系列操作后的图像时,需要进行通道转换。...在展示灰度图像时,cv2.imshow(‘gray’, gray) plt.imshow(gray,cmap=‘gray’), plt.title(‘gray’) 到此这篇关于plt.imshowcv2....imshow显示颜色问题的文章就介绍到这了,更多相关plt.imshowcv2.imshow显示颜色内容请搜索ZaLou.Cn以前的文章或继续浏览下面的相关文章希望大家以后多多支持ZaLou.Cn!

2.6K10

【胖虎的逆向之路】——GOTPLT Hook详解&针对自定义so库的Hook实操

/PLT&In Line Hook的相关知识和实际操作,Android Native Hook 的实现方式有很多种,我们接下来要讲的是 GOT/PLT Hook (篇幅略略略长,阅读时长约 20 min...以及数据段 .rel.plt:是对函数引用的修正,它所修正的位置位于.got .plt:程序链接表(Procedure Link Table),外部调用的跳板 .text:为代码段,也是反汇编处理的部分...-r xxx.so ---- 三、PLTGOT Hook(Native,你们的Hook回来了~) 呼,喝杯水~ 在前面的装载->动态链接->重定位完成之后,我们目标动态库的基址已经确定了,在当我们调用某个函数...,come on~ 1、 .dynsym检索 .dynsym:在之前的描述中,这个节里只保存了动态链接相关的符号导入导出 我们先来找到自定义的目标函数curl_a_website: 运行命令: arm-linux-androideabi-readelf...中的 curl_a_website 函数的时候,内部会通过BLX相对寻址的方式进入.plt节,计算程序计数器 PC 的当前值跳转进入.got节~ 中间经过经过PLTGOT的跳转,到达我们最终的真实的导入函数的地址

68541

深度解密Android中基于pltgot的hook实现原理

目录 概述 简单示例 ELF文件格式初探 装载、动态链接重定位 PLTGOT 如何定位基址? 如何修改呢?....rel.dyn:实际上是对数据引用的修正,它所修正的位置位于.got以及数据段。 .rel.plt:是对函数引用的修正,它所修正的位置位于.got。...动态链接的文件中,有专门的重定位表分别叫做.rel.dyn和.rel.plt: arm-linux-androideabi-readelf -r libnative-write.so ?...5、PLTGOT 前面的过程装载->动态链接->重定位完成之后,目标共享库的基址已经确定了,当我们调用某个函数时(比如fwrite函数),调用函数并不是直接调用原始fwrite函数的函数地址,它会先经过...5.2 更快速的找到目标函数的偏移 前面也提到过动态链接重定位表中的.rel.plt是对函数引用的修正,它所修正的位置位于.got

3.3K20

hook的几种方式及原理学习

rel.dyn”实际上是对数据引用的修正,它所修正的位置相当于”.got “以及数据段;而”.rel.plt”则是对函数引用的修正,所修正的位置位于”.got.plt”。...及 PLT 表 在Linux下,GOT被拆分成”.got”和”.got.plt”2个表。...其中”.got”用来保存全局变量引用的地址,”.got.plt”用来保存函数引用的地址 GOT表项还保留了3个公共表项,也即got的前3项,分别保存: got[0]: 本ELF动态段(.dynamic段...查看plt的内容,实际就是代码: objdump -d test ? gdb调试 plt懒加载过程: ? ? 重定位类型及偏移表 我们如何计算GOT表应该偏移多少呢,又有哪些偏移的类型呢?...,读取目标函数地址,.got表每一项函数入口地址进行匹配,找到的话就直接替换新的函数地址,这样就完成了一次导入表的Hook操作了。

1.8K30

Ret2dl_resolve漏洞利用分析

前言 ret2dlresolve是linux下一种利用linux系统延时绑定(Lazy Binding)机制的一种漏洞利用方法,其主要思想是利用dlruntimeresolve()函数写GOT表的操作,...其具体的方法可以参照《程序员的自我修养——链接、装载库》一书7.4节。 为了实现少量时间换取大量空间以及方便程序维护的目的,Linux中大量程序抛弃了静态链接的方式,转而投向动态链接 的怀抱。...于是为了节省资源,Linux在程序第一次调用函数时才会将其装载程序。 这里用到了PLT表的结构,细心的小伙伴可能注意过,PLT表中每个函数的第一项都是一个jmp至GOT表的操作。...首先看图,此程序是运行在linux下的32位程序,此时的程序的状态是刚刚进入main函数,还未对write函数进行调用: ? 这便是一个程序中PLT表write函数对应表项的内容。...这里的0x20偏移是指.rel.plt表的偏移,readelf -S binary 可以查看ELF文件中段信息。 ? ?

74010

针对宝塔的RASP及其disable_functions的绕过

什么是GOT表? 请自行阅读以下资料了解 浅 析ELF中的GOTPLT 深入了解GOT,PLT和动态链接 漏洞利用-GOT覆写技术 Linux中的GOTPLT到底是个啥?...简单来说,某个程序需要调用printf这个函数,先到plt表里面找到对应的got表的里面存放的真正代码块的地址,在根据这个地址跳转到代码块。...plt表是不可写的,got表可写,在没有执行之前填充00,在执行的时候由动态连接器填充真正的函数地址进去。...get_reloc函数获取PLT表里面保存的指向GOT表的值。 get_shared_library函数则是解析libc库的。 为了节约篇幅,关于elf格式的相关内容请自行查阅相关资料。...完整的POC在此处就不公开了 主要引用参考 https://www.anquanke.com/post/id/183370#h2-17 blog.rchapman.org/posts/Linux_System_Call_Table_for_x86

92720

Android Native Hook

顾名思义,对于 GOT/PLT Hook 来说,我们主要关心“.plt”和“.got”这两个节区: .plt。该节保存过程链接表(Procedure Linkage Table)。 .got。...通常在类 Linux 系统,这个的实现会位于动态加载器,就是专栏前面文章提到的 /system/bin/linker。...这里业界通常会根据修改 PLT 记录或者 GOT 记录区分为 GOT Hook 和 PLT Hook,但其本质原理十分接近。... GOT/PLT Hook 相比,Inline Hook 可以不受 GOT/PLT 表的限制,几乎可以 Hook 任何函数。不过其实现十分复杂,我至今没有见过可以用在生产环境的实现。...指南程序员的自我修养:链接、装载库 链接器和加载器 Linkers and LoadersLinux 二进制分析 Learning Linux Binary Analysis 如果你对调试器的研究也非常有兴趣

1.1K20

linux的so注入热更新原理

简介 之前写了个hookso的工具,用来操作linux进程的动态链接库行为,本文从so注入热更新入手,简单讲解一下其中的原理,配合源码阅读效果更佳。...那么就需要左边的rela.plt(重定向信息)以及got.plt(位置偏移信息)。...(实际上linux各种运行时库的版本也很难受) 为什么不做成机器码直接jmp就好了? 机器码里直接jmp,但是事先不知道目标地址,所以只能填空,这样又不好正常代码区分。...第二行和第三行传参调用libc完成了绑定puts的过程,并且更新got。 后续再调用第一行,就直接跳转到了目标函数了。 为什么plt里不直接存放地址,要搞个got?...理论上是可以got里的每个地址拆分放到plt中,可能是出于逻辑数据分离考虑,并且分开后内存页的读写权限更好管理,毕竟一个是可执行,一个是可写。

10.4K50
领券