标题 | 简介 | 类型 | 公开时间 | ||||||||||
|
|||||||||||||
|
|||||||||||||
详情 | |||||||||||||
[SAFE-ID: JIWO-2025-1072] 作者: ecawen 发表于: [2017-11-16] [2017-11-16]被用户:ecawen 修改过
本文共 [447] 位读者顶过
前几天把House of orange重新学习了一下,比照着glibc malloc的源码好好分析了一下,希望做到真正做到知其然亦知其所以然,其中所做的笔记如下,可能描述上有点乱,大家将就着看一下吧。同时,我也发在了我个人博客上面 (http://blog.leanote.com/simp1e), 如果有错误的地方,请各位大牛多多指正。 0x00 程序描述
大名鼎鼎的house_of_orange[出自:jiwo.org]
0x01 程序漏洞1. 堆溢出
在upgrade函数中,修改name时候不顾实际chunk的堆大小是多少,直接进行编辑,最大可编辑0x1000大小,因而存在溢出。 0x02 漏洞利用这里的利用思路是4ngelboy给出,下面就直接分析这样利用的原因。 1. 信息泄露 (泄露libc地址)
因为程序中有堆的越界写,可以修改top_chunk的大小。在malloc源码里面如果申请的堆块大小超过了top_chunk的大小,将调用sysmalloc来进行分配。
就是如果申请大小>=mp_.mmap_threshold,就会mmap。我们质只要申请不要过大,一般不会触发这个,这个mmap_threshold的值为128*1024。
第一个assert就是要求修改后的top_chunk_size必须满足
这样的话我们再次申请一个堆块分配到这块区域中就能泄露libc地址了,但是这里又有一个trick,如果我们分配的大小是large_chunk的话。malloc源码中还把old_top的堆地址放到了堆里面(没有细究原因,但是好像是large bin没有区分大小,需要有个字段来保存大小的原因吧),源码如下
所以如果再次分配时候如果分配大小为largebin(也就是大于512字节)的chunk的话,就是可以既泄露libc又可以泄露heap。如下
而如果分配大小不到512字节时候是无法泄露堆地址的。 2. 劫持流程File Stream Oriented Programming
我们知道有rop即retn Oriented Programming,那么其实File Stream Oriented Programming是一个道理的。也是一种劫持程序流程的方法,只不过方式是通过攻击File Stream来实现罢了。
malloc_printerr其实是调用__libc_message函数之后调用abort函数,abort函数其中调用了_IO_flush_all_lockp,这里面用到IO_FILE_ALL里面的结构,采用的是虚表调用的方式。
其中使用到了IO_FILE对象中的虚表,如果我们能够修改IO_FILE的内容那么就可以一定程度上劫持流程。
那么怎么劫持呢,这里又需要用到unsortbin attack的知识。
如上代码所示,就是会把bk+0x10的地方写入本unsort_bin的地址,
因为第一个分配在main_arena的IO_FILE_plus结构的fp->mode等值不符合要求,就会通过chains跳转到就下一个IO_FILE_plus就是我们之前设置的unsortbin,然后需要满足一下条件
0xFE 利用exp
0xff 参考资料 |