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

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']) #

52310

一个例子引出的PLTGOT姐妹花

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

77920

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表来找

7110

ret2libc过地址随机化

这里我们需要了解几个知识点: (1)system 函数属于 libc,而 libc.so 动态链接库中的函数之间相对偏移是固定的(即使打开ASLR也是这样的) (2)在linux的gcc使用C语言源文件的二进制文件时...(4)GOT表项中的数据才是函数最终的地址,而PLT表中的数据又是GOT表项的地址,我们就可以通过PLT表跳转到GOT表来得到函数真正的地址 (5)地址随机化并没有对PLT表、GOT表产生作用 了解到上面的知识点后...这里可以看见调用了gets()函数,还可以看见gets@plt 那么使用此语句查看PLT表:objdump -d -M intel -j .plt 1.exe ?...可以看见在我们执行gets函数时,我们会先去到plt表,然后又会jmp到GOT里面的真实地址:0x8049030 接下来我们计算计算system、/bin/sh与gets函数的相对偏移 ?...")p=process("1.exe")//加载1.exe进程e=ELF("1.exe")//加载1.exe文件,分析ELF结构addr_write=e.plt["write"]addr_gets=e.got

85620
领券