首页
论坛
课程
招聘
[原创]pwnable.kr uaf
2018-11-30 17:36 5733

[原创]pwnable.kr uaf

2018-11-30 17:36
5733

Pwnable.kr之uaf

UAF漏洞的利用:

(1)  先制造一个迷途指针

(2)  利用我们构造的数据去填充被释放的内存

(3)再次使用该指针

Human中有两个虚函数,然后human就会有一个虚表,虚表会记录类中所有虚函数的函数指针,可以看到human里面有一个system(“/bin/sh”);这就是我们利用的最终目的,但现在我们还没办法利用,我们接着往下看




接着我们看到man类,他会继承父类的vtable(虚表),同时子类的introduce()的函数的地址会替换父类在introduce()在虚表中的位置.


分析同上一步



这是主函数,如果我们依次输入3  1,程序会首先 释放了m,w,接着又会去引用我们已经释放的对象,就造成了uaf漏洞,怎么利用呢?
我们看到case2,哪里会接收参数,首先接收长度参数,和文件参数,并写入内存,我们可以利用这个写内存的操作去占我们释放操作的位置的内存,就可以利用了.接下来我们具体分析

在分析之前,我们需要有一定的基础知识如下图


c++类实例在内存的分配:   http://www.cnblogs.com/bizhu/archive/2012/09/25/2701691.html


把编译好的可执行文件拖入IDA中分析, F5后我们看伪代码,看到v11,我们输入1时执行的是下面的语句,因此可以猜到v11就是vptr,然后转换为指针,取其中的内容就是vtable的第一个值,再加8就是第二个值,真好是introduce的函数指针



输入1后执行的语句:
转到汇编代码处

一共申请了30h大小的内存,所以我们的长度参数应该传48,  V11的值就是rbp-60h处的值



因此我们在此处下断点   

b *main+101





V11的值也就是rbx的值为0x555555768e70;


查看0x555555768e70,虚表的地址为0x555555755c88;

查看0x555555755c88就是虚函数的地址;我们就要想办法把利用此处


看到这里引用的是虚表处偏移8处的函数指针


本来虚表处偏移8是 introduce()的指针,我们把虚表前移8个字节,虚表偏移8处就是 give_shell()的函数指针了



因此我们构造如下数据写入内存


成功执行system(“/bin/sh”)接下来我们cat flag就可以看到flag了,注意服务器上的和本地有略微别,但是方法是不变的.



《0day安全 软件漏洞分析技术(第二版)》第三次再版印刷预售开始!

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回