pwnable.kr之uaf

         Uaf-useafter free是指堆在被释放后,因为指针没有置为0,从而导致的可以利用这个指针重新利用本应该被释放空间的漏洞。一般情况下,包含这个漏洞会导致程序崩溃,但是如果别有用心者,把这块空间利用起来,比如c++new一个class的时候,里面经常后包含大量的函数指针,而且经常会被调用,如果我们把这个指针覆盖成我们想要执行的地址,那么当后面错误地调用这个函数的时候,就会导致我们的代码执行,如果本来这个进程拥有很高权限的话,我们能够做的事就更多了呵呵。

         具体关于这道题的基础知识,建议还是看以下链接:

http://blog.csdn.net/qq_20307987/article/details/51511230

感谢这位大神给了我这么多的帮助。

然后主要讲述以下我自己的分析过程。

         既然已经有了目标,那么我们要做的首先是分析以下具函数体的类内部函数的调用过程, 就是源码中输入一的是时候,调用introduce函数:

     。

这里的var_44指的就是初始化的MAN对象的指针,var_40是Woman的指针我们知道,所有这种类对象都是只在栈中存一下指针,然后在去寻址。

mov    eax, [ebp+var_44]//先进行寻址,找到栈中的Man对象指针,现在eax指向的是Man对象指针


mov    eax, [eax]//然后对eax进行寻址操作,寻址以后,指向对象开始的地方,也就是Man类的虚函数表的指针,查看一下内容,明显是虚函数表。


add    eax, 4//加4也就变成了我们的虚函数表中偏移为4处的地址,也就是introduce函数地址存放处的地址

mov    eax, [eax]//最后一次寻址,就是我们的introduce函数的地址了。

sub    esp, 0Ch

push   [ebp+var_44]

call   eax


 

分析到这里,就会做了,程序不是每次都会在找到虚函数表以后自动加4然后找到了introduce吗?我们在自己申请覆盖这段空间的时候,只要把虚函数的地址减去4给写进去,再执行的时候就会执行我们的giveshell函数了。

         下面一点就是注意要申请多少空间的问题了,


通过IDA也很容易找到,就是在new之前,压了个32进去,也就是会分配32个字节。

那么我们如果在释放以后紧接着申请32个字节的空间,就会完全覆盖之前的申请的堆空间。在我参考的那个链接里有具体介绍,可以去看看。

         这里需要注意下free的顺序是先free的m,后free的w,因此在分配内存的时候优先分配到后释放的w,因此需要先申请一次空间,将w分配出去,再开一次,就能分配到m了。

         最后的的效果图如下:

        

         这是在本机上跑的示意图,显示是成功执行getshell的,可是后来在线跑的时候没有成功,原因好像是因为线上的程序时64位的。不过分析的原理是一样的,就不再贴一遍了。可以去看看我的参考链接里的分析,那个是64位分析。所以提醒大家,以后再分析之前,先看看程序时多少位程序。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值