首先检查一下程序的保护机制

然后用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。
有些情况下,仅有malloc/calloc/realloc和free两种功能,并且可以实现任意地址分配,如果想要达到利用,还需要知道地址,在glibc下,一般就是攻击_IO_2_1_stdout_结构体来实现信息泄露,通过低字节覆盖unsorted bin留下的main_arena指针,再加以爆破4位,就能分配到_IO_2_1_stdout_,通过篡改_IO_2_1_stdout_的flags为0x0FBAD1887,_IO_write_base低字节覆盖,然后当程序调用puts输出任意信息时,就会输出_IO_write_base到_IO_write_ptr之间的数据,而这之间就有libc的指针。
下面以三个例子为例。