pwnable.tw bookwriter writeup - house of orange 的巧妙利用
TOC
House of Orange 漏洞的利用,程序中没有free函数,但该程序并不像 House of Orange 原题那样可以任意溢出,所以需要攻击者研究新的利用手段,靶机环境是glibc-2.23。
原题地址:https://pwnable.tw/challenge/ 。
源程序和相关文件下载:bookwriter.zip 。
安全防护
ex@Ex:~/test$ checksec bookwriter |
其实程序即使开启了 PIE 保护也是不影响该漏洞的利用的。
溢出点
void __cdecl Edit() |
Edit
函数中,ptr_size[index]
的值会根据strlen(ptr[index])
而更新,如果我们故意不进行null截断
的话,那么我们输入的内容就会和下一个chunk的size
黏连,也就意味着只能修改下一个chunk的size
的堆溢出。
下面是一个简单的泄露点。
void __cdecl set_author() |
set_author
可以读取长度为0x40
的内容,且没有null截断
,所以可以泄露出后面ptr
的信息。
.bss:0000000000602060 ; char author[64] |
思路
由于没有任意堆溢出,所以这里我们需要利用size的变换来实现漏洞的利用。
- 泄露heap地址
Add(0x18, '\n') |
- 压缩heap
Add(0x1fdc0, '\n') |
先将heap压缩到一个比较好操作的大小。
- 修改top_chunk的size ,为了free掉top_chunk
Edit(1, 'b' * 0x18) |
在这里原先top_chunk
的size为0x1201
,然后我们将其修改为0x201
。然后当我们再次申请0xff8
大小,原先的top_chunk
会被free
到unsorted bin
中。
- 伪造 fake chunk , 为了和 unsorted bin 中的 chunk (上面被free掉top_chunk) 对应,以绕过检查
- 修改 unsorted bin 中的 chunk (上面被free掉top_chunk)的size,让其下一个chunk刚好为 fake chunk
Add(0xff8, 'a' * 0xf0 + p64(0x1300) + p64(0xf00)) # fake chunk |
上面两步是一起的,完成这些操作后,heap会被恢复成完整状态,但其实内部已经overlap
。
完成这两步后的heap状态如下:
pwndbg> heap |
- 有 unsorted bin 后可以泄露 main_arena 地址,从而泄露 libc 地址
- 将 unsorted bin 压缩到可控范围
上面两步是一起的。
Add(0x1278, 'e' * 8) |
执行完成后,我们就可以控制 unsorted bin
。
下面是调试结果:
pwndbg> pr |
可以看出第2个ptr
的地址是0x911010
而且ptr_size
是0xff8
,其刚好可以控制 unsorted bin
的 0x911080
。
- 构造布局,触发 House of Orange
layout = [ |
这里就是简单的 House of Orange 利用。
完整脚本
由于 House of Orange 受 随机化的影响,成功几率是1/2
。
#!/usr/bin/python2 |