-
-
[原创]PWN学习笔记【堆】【unlink】
-
发表于:
2022-6-23 12:31
21619
-
chunk结构体大致如下
size的低三位表示为:
这里会用到 PREV_INUSE(P): 表示前一个chunk是否为allocated。
P位为1时代表物理相邻的前一个chunk为free状态,此时prev_size代表前一个chunk的大小
非fastbin的chunk在free时会与物理相邻的空闲chunk合并
非fastbin中的chunk使用的是双向链表,使用chunk的fd、bk链接
设需要unlink的指针为P,在unlink时,进行如下操作:
高版本的libc会检测BK和FD的指针是否指向P:
伪造一个fake_chunk,绕过unlink的检测,即可任意地址写
1.设有相邻的两块chunk,p,f,使得f,free后不进入fastbin(chunk size>0x80)
2.在p中创建一个伪造chunk块fake_chunk,使p->Fd= &p-3*sizeof(size_t);p->bK= &p-2*sizeof(size_t)
3.修改f的chunk头,使prev_size=fake_chunk_size, PREV_INUSE = 0
4.free(f),这时glibc查看f的chunk头,发现f的上一个chunk是free状态,就把上一个chunk(p)拿来合并
此时正好满足glibc检测条件,unlink后,先执行p=&b;再执行p=&a; 最后结果就是p指向a的首地址,从而控制了从a到p的地址(假如a可写)
直接上代码:
/*多申请一块chunk,防止合并到top chunk里面*/
假设我们只可以控制p、f的申请,释放,写入,unlink后p的地址可控,即可任意地址写
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)