核心考察
1.C++类内存布局
C++类实例的内存块首地址存放vfptr(虚表指针)
2.uaf漏洞
在内存释放后,不会被“真正”释放。当申请相似大小空间内存时,刚”释放”的内存被优先分配。
个人觉得FIFO的说法不准确,在kali linux x64下,64位程序中,当分配的内存大小小于1024时(Fast chunks),是LIFO;当分配的内存大小大于1024(实际测试是1024+8)(Small chunks),是FIFO。(32位程序的分界点貌似是1024-4)
这里的I指的是,内存被free时从链表前段添加,o是指内存被重新new时,从链表后段去除。
当再次通过指针访问”释放”内存时,将发生不可预知的情况。(取决于类实例内存数据如何被改动)
本题思路
本题通过uaf改写释放后对象的虚表指针,将虚表指针“移位”,从而执行我们想要的虚函数。
POC
python -c "print '虚表地址-偏移'+'\x00'*填充个数" > /tmp/temp
cd /home/uaf/uaf
./uaf 对象大小 /tmp/temp