延迟绑定与retdlresolve

retdlresolve · 浏览次数 : 0

小编点评

**延迟绑定与retdlresolve** 在ret2libc中,由于动态链接库无法确定函数真实地址,因此采用了延迟绑定技术来实现功能。当调用libc函数时,通过plt表和gor表将函数地址绑定到plt和gor中,并在第二次调用时直接使用已绑定的地址进行调用。 **write函数的调试过程** 1. 首先,我们设置断点在call write,可以看见函数调用前的plt表和gor表。 2. 然后,我们通过push一个0x20的地址,设置reloc_arg参数,并继续进栈。 3. 在链接阶段,又压入一个地址,叫做link_map,它包含.dynamic、.dynstr、.rel.plt的地址。 4. 从.dynamic中获取.dynstr、.dynsym和.rel.plt地址,并将其保存到link_map中。 5. 在动态链接过程中,通过link_map找到.dynamic的地址,并从.dynamic中读取相关信息。 6. 我们可以通过rel找到r_offest和r_info,并通过r_offest获取函数名偏移。 7. 通过函数名偏移,我们可以找到函数的地址,并将它赋值给*rel>r_offset,完成动态链接。 8. 最后,retdlresolve函数通过plt指令触发dl_runtime_resolve,并将/bin/sh作为参数传递给该函数。 **总结** 延迟绑定技术在ret2libc中用于实现功能,通过设置plt表和gor表来记录函数地址,并在第二次调用时直接使用已绑定的地址进行调用。通过链接阶段从.dynamic中获取相关信息,并通过函数名偏移找到函数地址,完成动态链接。

正文

延迟绑定与retdlresolve

我们以前在ret2libc的时候,我们泄露的libc地址是通过延迟绑定实现的,我们知道,在调用libc里面的函数时候,它会先通过plt表和gor表绑定到,函数真实地址上,那么在第二次调用的时候就可以用了,不用再次绑定

那么它是怎么样实现的呢,我们还是通过一个题目一步步去看一下调试过程,我们这里看一下write函数

我们断点下到call write,可以看见首先jmp到write的plt表里面push了一个0x20,然后继续jmp,我们把这个push的0x20叫做reloc_arg,也是dl_runtime_resolve的第一个参数

继续步入,我们可以看见又push了一个东西,叫做link_map是dl_runtime_resolve的第二个参数

看一下它里面存的值

这里面的第三个就是.dynamic的地址,那么就可以通过link_map找到.dynamic的地址,而.dynamic里面存的有.dynstr,.dynsym和.rel.plt的地址,它们分别在.dynamic+0x44 .dynamic+0x4c .dynamic+0x84的位置我们来看一下

那么.rel.plt真实的地址就是.rel.plt +reloc_arg,叫做ELF32.Rel的指针,叫rel,我们在ida里面也可以发现确实是这样

接下来我们可以通过刚刚的rel找到r_offest(got表)和r_info

我们在ida里面验证一下r_offest是不是got表

是没有问题的,那么r_info有什么用呢,我们把r_info >> 8得到的一个数也就是6,它是刚刚.dynsym里面的下标,我们来看一下,通过这个下标我们得到函数名的偏移

我们刚刚得到的下标是6,那么函数名偏移就是0x4c,我们再加上.dynstr,就可以找到函数名所在地址

ida里面也是这样

那么就找到对应的函数名了(st_name),在动态链接库里面找这个函数的地址,赋值给 *rel->r_offset,也就是 GOT 表就完成了一次函数的动态链接,那么绑定就完成了,而ret2dlresolve就是通过在这之间伪造来进行getshellde

在32位NO RELRO情况下我们可以直接修改.dynamic,这里我们可以用工具来gethsell,exp在这里


这里使用pwntools里面的rop模块创建了一个rop对象,rop.raw()可以往rop链里面填充数据,rop.read(),可以调用read函数,rop.chain()可以发送完整的shellcode我们把.dynamic的地址改成我们bss段上的假地址,然后再调用read的第二条plt指令触发dl_runtime_resolve,然后在特定位置给上参数/bin/sh

对于32位Partial RELRO的类型pwntools仍然给我们的强大的工具构造payload

但是最好还是弄清楚原理在使用工具,善于利用工具可以少走很多弯路,但是有利有弊,好处就是可以快速的做出题,并且能节省下很多时
间;坏处也显而易见,就是只知道这样可以做出来,但是为什么这样做出来的完全不懂。可以在CTFwiki上面找到具体的手工构造payload的方法[https://ctf-wiki.org/pwn/linux/user-mode/stackoverflow/x86/advanced-rop/ret2dlresolve]

与延迟绑定与retdlresolve相似的内容:

延迟绑定与retdlresolve

延迟绑定与retdlresolve 我们以前在ret2libc的时候,我们泄露的libc地址是通过延迟绑定实现的,我们知道,在调用libc里面的函数时候,它会先通过plt表和gor表绑定到,函数真实地址上,那么在第二次调用的时候就可以用了,不用再次绑定 那么它是怎么样实现的呢,我们还是通过一个题目一

[转帖]光纤延迟及速度解释

https://blog.csdn.net/tony_vip/article/details/105484217?spm=1001.2014.3001.5502 光线在真空中,折射率为1,其光速为c=30万公里/秒;当光在其他介质里来面传播,其介质折射自率为n,光在其中的速度就降为 v=c/n;光纤

[转帖]Redis延迟问题怎么排查

https://www.yisu.com/zixun/574746.html 这篇文章主要讲解了“Redis延迟问题怎么排查”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Redis延迟问题怎么排查”吧! 使用复杂度高的命令 如果在使用Redis时,发

【转帖】SRE 高延迟问题的罪魁祸首 System.gc()

https://www.infoq.cn/article/lXTRgYb9ecVBu*72fT7O jstact -gccause pid 3000 30 01 案例一: 某日,支付平台的开发人员找到 SRE,需要 SRE 帮助解决一个棘手的问题。他们发现一个调用第三方支付接口的应用里面,偶尔出现请

【转帖】光纤延迟及速度解释

光线在真空中,折射率为1,其光速为c=30万公里/秒; 当光在其他介质里来面传播,其介质折射自率为n,光在其中的速度就降为 v=c/n; 光纤的材料是二氧化硅,其折射率n为1.44左右,计算延迟的时候,可以近似认为1.5; 光纤中的光传输速度近似为 v=c/1.5= 20万公里/秒。 ———————

说说RabbitMQ延迟队列实现原理?

使用 RabbitMQ 和 RocketMQ 的人是幸运的,因为这两个 MQ 自身提供了延迟队列的实现,不像用 Kafka 的同学那么苦逼,还要自己实现延迟队列。当然,这都是题外话,今天咱们重点来聊聊 RabbitMQ 延迟队列的实现原理,以及 RabbitMQ 实现延迟队列的优缺点有哪些? 很多人

RabbitMQ 进阶使用之延迟队列 → 订单在30分钟之内未支付则自动取消

开心一刻 晚上,媳妇和儿子躺在沙发上 儿子疑惑的问道:妈妈,你为什么不去上班 媳妇:妈妈的人生目标是前20年靠父母养,后40年靠你爸爸养,再往后20年就靠你和妹妹养 儿子:我可养不起 媳妇:为什么 儿子:因为,呃...,我和你的想法一样 讲在前面 如果你们对 RabbitMQ 感到陌生,那可以停止往

[转帖]巧用Systemtap注入延迟模拟IO设备抖动

http://blog.yufeng.info/archives/2935 原创文章,转载请注明: 转载自系统技术非业余研究 本文链接地址: 巧用Systemtap注入延迟模拟IO设备抖动 当我们的IO密集型的应用怀疑设备的IO抖动,比如说一段时间的wait时间过长导致性能或其他疑难问题的时候,这个

[转帖]高并发系统中的尾延迟Tail Latency

开发和运维高并发系统的工程师可能都有过类似经验,明明系统已经调优完毕,该异步的异步,该减少互斥的地方引入无锁,该减少IO的地方更换引擎或者硬件,该调节内核的调节相应参数,然而,如果在系统中引入实时监控,总会有少量响应的延迟高于均值,我们把这些响应称为尾延迟(Tail Latency)。对于大规模分布

一个简单的科普-延迟与RT时间

# 一个简单的科普-延迟与RT时间 ## 背景 ``` 发现稍微一复杂就没人看. 这次像是写一个简单的科普文章. 主要说一下网络延迟还有网络的响应时间. 这里想通过一个题目进行引申. 如果Skylink全球商用: 中国与美国之间的网络是走海底光纤延迟低,还是走skylink延迟低? ``` ## 关