延迟绑定与retdlresolve - CH13hh
source link: https://www.cnblogs.com/CH13hh/p/18156267
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
延迟绑定与retdlresolve
延迟绑定与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]
Recommend
-
113
从 React 绑定 this,看 JS 语言发展和框架设计 react 在 javascript 语言中,关于 this 这个关键字的行为一直以来困扰着一代又一代初级开发者。同时 this...
-
73
502 Bad Gateway 502 Bad Gateway Sorry for the inconvenience. Please report this message and include the following information to us. Thank you very much! URL: http://www.chanpin100....
-
91
Linux 7 网卡绑定
-
80
实现数据的双向绑定mvvm-剖析Vue的原理
-
142
Spring Boot 2.0 新特性(一):配置绑定 2.0 全解析
-
48
云服务器绑定主机名的正确姿势 一直以来,我在做方案的时候,都不推荐在云服务器上安装oracle。可随着宣传的深入,偏偏就有人要这样干,前天,就有要求我在某度云安装oracle rac集群;我确实不知道怎么解决共享存储及多网卡。 一个很久不理我的家伙,突然给我电话...
-
57
-
4
循环变量泄露与延迟绑定叠加在一起,会产生一些让人迷惑的结果。 梦开始的地方先看看一开始的问题,可以看到这里lambda函数的返回值一直在变。 xx = []for i in [1,2,3]: xx.append(lambda: i)p...
-
3
简单理解PHP延迟静态绑定 static::中的static其实是运行时所在类的别名,并不是定义类时所在的那个类名。这个东西可以实现在父类中能够调用子类的方法和属性。 使用(static)关键字来表示这个别名,和静态方法,静态类没有半毛钱的关系,stati...
-
2
堆块的重叠 堆块重叠 对堆的了解不是很多,大部分都是自己网上找的资料了解的,以后每一道堆题我都会仔...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK