萌新带你开车上p站(番外篇)
2022-11-12 来源:acgdir.com
前言
这道题目应该是pwnable.kr上Toddler"s Bottle最难的题目了,涉及到相对比较难的堆利用的问题,所以拿出来分析。
登录
看看源程序
程序中有几点要注意的地方:
1. 定义的OBJ结构体中一个指针4字节,buf[]数组8字节
2. Unlink()的过程其实就是双向链表中摘下中间那一块的过程
3. 主函数中malloc了三个结构体,并通过指针连成了双向链表A<->B<->C
4. 打印出A的栈地址,堆地址,这两个地址这里记做stack,hep,待会儿在分析中会用到
5. 漏洞在于gets函数会造成溢出,同时通过随后的unlink()进行利用
具体而言什么是unlink呢?
unlinked 是堆溢出中的一种常见形式,通过将双向列表中的空闲块拿出来与将要free的物理相邻的块进行合并。(将双向链表上的chunk卸载下来与物理chunk合并)。Unlink漏洞的利用条件就是有3个以上的空闲chunk链表,其中最前面的chunk存在有堆溢出。没错我们这次的题目就存在这个情况。解链的原理相信学过数据结构的师傅们都清楚了
这道题目应该是pwnable.kr上Toddler"s Bottle最难的题目了,涉及到相对比较难的堆利用的问题,所以拿出来分析。
登录
看看源程序
程序中有几点要注意的地方:
1. 定义的OBJ结构体中一个指针4字节,buf[]数组8字节
2. Unlink()的过程其实就是双向链表中摘下中间那一块的过程
3. 主函数中malloc了三个结构体,并通过指针连成了双向链表A<->B<->C
4. 打印出A的栈地址,堆地址,这两个地址这里记做stack,hep,待会儿在分析中会用到
5. 漏洞在于gets函数会造成溢出,同时通过随后的unlink()进行利用
具体而言什么是unlink呢?
unlinked 是堆溢出中的一种常见形式,通过将双向列表中的空闲块拿出来与将要free的物理相邻的块进行合并。(将双向链表上的chunk卸载下来与物理chunk合并)。Unlink漏洞的利用条件就是有3个以上的空闲chunk链表,其中最前面的chunk存在有堆溢出。没错我们这次的题目就存在这个情况。解链的原理相信学过数据结构的师傅们都清楚了