首先,检查一下程序的保护机制
然后,我们用IDA分析一下
程序用了UPX壳保护,通过upx –d脱壳后,拿到IDA里分析。
Delete以后没有清空指针,存在UAF,但是无法double free,因为程序中使用虚表调用,delete一次后,虚表对应位置已经被清空。因此第二次delete同一个chunk将进入else语句,进而崩溃。由于函数指针放在chunk里,因此,我们可以伪虚表指针,再利用UAF来执行。由于使用的是upx加壳,脱壳后,显示NX保护是关闭的,但是宿主是upx的壳,upx壳程序通过mmap映射出RWX的内存放置受保护的程序,因此,在这里堆栈是可执行的,也可以通过gdb调试查看。因此,我们在堆里布置下shellcode。
这题和上一题https://blog.csdn.net/seaaseesa/article/details/105856878功能相似,并且上一题的利用手法这里同样可以利用,这里,有另一种手法,从而引出了一个新的知识点。
这题,delete功能里增加了对huge chunk的free
首先,检查一下程序的保护机制
然后,我们用IDA分析一下,在合并的时候,存在溢出,strcpy、strcat可能会将下一个chunk的size也拷贝过来,从而可以溢出修改下一个chunk的size。