特殊的Unlink Attack
Unlink Attack的应用
HITCON CTF 2014上,有一道只有三支队伍解出的题目
- Pwnables 550 - stkof
解出题目的是以下三支队伍:
- tomcr00se
- PPP
- teamlol
介绍一下用于解决这道题目的技术
- 这道题目是x86_64的二进制程序,但我会用x86的内存布局来说明它
- 注意,实际的二进制中,各个区域都是两倍
如果能够满足下述约束条件,就能够进行特殊的Unlink Attack
- P->fd->bk == P
- P->bk->fd == P
- 不仅需要堆溢出,Use After Free也是必须的
exploit的流程
假设预先存在指向P的X
- X在.bss区域中,并且预先知道地址
- X指向已经free的P,就像它尚未被释放一样
- 我们无法控制X指向的地址
通过堆溢出进行覆盖
P->fd:X之前12字节
P->bk:X之前8字节
如图所示:
从X-0xC的位置开始看的话,X相当于bk的位置
从X-0x8的位置开始看的话,X相当于fd的位置
也就是说,P->fd->bk == X-0xC->bk == X == P && P->bk->fd == X-0x8->fd == X == P,满足条件
free(P2)的时候,相连接的P被unlink
本应该无法控制的X的值现在可以被更改
- X应该最初指向P
X的指向(=*X),存在保存用户输入的情况
- 使用(Use After Free的)X,可能覆盖P
- 然后X-0xC的内容将改变
- 也就是说,X-0xC可以被改为指向GOT
X-0xC的指向(=*(X-0xC)),存在保存用户输入的情况
- 信任X-0xC并且写入数据
- 能够进行GOT overwrite
这种方法是Shellphish战队子大会结束后公开的技术
- http://acez.re/ctf-writeup-hitcon-ctf-2014-stkof-or-modern-heap-overflow/
- 他们在比赛期间也没有解决
- 有图的话会非常容易理解,实际上的exploit构造非常麻烦
事实上,也存在更容易理解的解法:
大会结束后,PPP战队在IRC频道中公开的技术非常好
14:52 (ricky) Here are most of my solutions: https://rzhou.org/~ricky/hitcon2014/ 14:53 (ricky) Curious as to what others did 14:53 (tomcr00se) i don't understand your stkof 14:54 (tomcr00se) how did you link in 0x602100 without throwing one of 10 million asserts 14:55 (ricky) I used the fastbins - the only check is that the size matches the fastbin (and the size is the index for the next entry) 14:55 (ricky) So I made enough entries to make the index correct 14:55 (ricky) Now I'm really curious about how you did it