pwnable.kr之uaf
2017-04-13 12:54
399 查看
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位分析。所以提醒大家,以后再分析之前,先看看程序时多少位程序。。。
具体关于这道题的基础知识,建议还是看以下链接:
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位分析。所以提醒大家,以后再分析之前,先看看程序时多少位程序。。。
相关文章推荐
- pwnable.kr刷题之UAF
- pwnable.kr uaf writeup
- pwnable.kr [Toddler's Bottle] - uaf
- echo1(Pwnable.kr)
- pwnable.kr 之fd
- [pwnable.kr]--alloca
- pwnable 笔记 Toddler's Bottle - uaf
- pwnable.kr-random-Writeup
- pwnable.kr [Toddler's Bottle] - bof
- pwnable.kr writeup hash
- pwnable.kr 之asm
- pwnable之uaf
- pwnable.kr collision
- pwnable.kr-bof-Writeup
- pwnable.kr [Toddler's Bottle] - flag
- pwnable.kr [Toddler's Bottle] - passcode
- pwnable.kr-fix
- pwnable.kr之bof
- pwnable.kr wp&总结
- pwnable.kr-bof-Writeup