首页
社区
课程
招聘
[原创]一道house of storm的heap题目
发表于: 2020-2-13 11:20 10389

[原创]一道house of storm的heap题目

2020-2-13 11:20
10389

原题:rctf_2019_babyheap

复现:赵师傅https://buuoj.cn/challenges#rctf_2019_babyheap

保护:

全开没有,没给写got表

禁掉了execve,这个就很难受了。写hooksystem或者是one_gadget就行不通了。

而且这个程序__free_hook的附近找不到合适的chunk。

设置了global_max_fast = 0x16 (mallopt(1,0))

程序逻辑:标准的菜单题,add,delete,edit,show都有实现。

漏洞:漏洞倒是很明显,edit处在一处off-by-null。

这里用了Ex师傅的方案。Ex师傅tql

leak

off-by-null + unlink构造overlap

控制__free_hook

house of storm

写__free_hook 到setcontext,控制寄存器,执行mprotect

shellcode注入getshell

膜一下Ex大佬----------------------

作用:

任意位置分配chunk

house of storm 利用条件:

可以控制unsorted binlarge bin

任意地址chunk的size的低四位要为0

(其中第二点我不知道有什么含义,期望理解了的师傅教教我)

理解:

从我今天一下午的浅薄认知来讲,house of storm 更像是 unsorted bin 利用加上 large bin 利用。

其中,unsorted bin 利用负责把 fake_chunk链人unsorted bin 链表中,从而让我们有机会malloc出来

而 large bin 利用主要是负责绕过从unsorted bin malloc出来chunk的size check。

关与house of storm的利用原理,在这个文章里有提到https://xz.aliyun.com/t/5265。

我觉得这个漏洞还是分开看比较好理解,第一部分是unsorted bin 的部分

源码:

代码来自glibc2.23/malloc/malloc.c#__int_malloc

新的版本这个地方已经不太一样了,添加了对当前取出的chunk的检测,类似与check(bck->fd = victim)的操作,但是在2.23中还没有。

通过代码我们可以发现,在解链的时候,unsorted bin中的第一个chunk的fd实际上是没有用到的,

通过控制bk我们就可以把一个fake_chunk链入,尽管这种情况下,unsorted bin的双向链表被破坏。但是对于这个利用,没有什么关系。另外,当我们申请的size大小,也就是nb,等于当前chunk的size的时候,就会把这个chunk返回给我们。

我们可以通过这样的利用将fake_chunk上链

第二部分是largebin atk的部分

源码:

如果unsorted bin 中的chunk不符合size的要求,放入对应的bin中,在本次利用中,这个chunk是largebin大小的,代码将执行以下分支,将其链入。

之其中有问题的代码就是这一句·

如果我们可以控制bk_next_size,那么我们就有了一次任意写,写入chunk的地址

需要注意的是在之后

这个地方还有一次写入,需要保证,bk指向的区域可写。

弄懂了这些,这个攻击就变得好理解一点了

poc:

需要注意的是,开pie和不开略有区别,但是总体区别不大,开pie的成功率大约1/3

当我们malloc(0x48)的时候,发生了这么几件事:

遍历unsorted bin ,取出第一个chunk,比较大小,不合适。

试图将这个chunk插入largebin,由该chunk比largebin中的chunk略大,这些关键的代码被执行

其中fwd即为我们poc中的large_bin。被我们设置为(size_t)fake_chunk - 0x18 - 5,这样我们victim的高位,将被写入fake_chunk的size域,这个地方和我们找__malloc_hook附近的chunk一样利用了偏移的技巧。至此,unsorted bin中被链入的fake_chunk已经有了size,一般来讲,这个size大约是0x5x,这样我们malloc(0x48),这个chunk就是符合标准的

取出fake_chunk,合适,返回给我们,至此,house of storm达成。

虽然我们控制了__free_hook,但是没有execve用,控制程序执行流还是一个问题。这里用了一个setcontext函数。

函数原型:

ucontext_t这个结构,在srop中也用到过,srop模块已经被集成入pwntools了,可以很方便的利用


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2020-2-13 11:24 被wx_yz编辑 ,原因:
上传的附件:
收藏
免费 1
支持
分享
最新回复 (2)
雪    币: 2510
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
感谢分享
2020-2-13 17:01
0
雪    币: 205
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
感谢分享
2020-3-21 20:06
0
游客
登录 | 注册 方可回帖
返回
//