首页
社区
课程
招聘
[原创]堆溢出-House of orange 学习笔记
发表于: 2017-11-13 08:42 17619

[原创]堆溢出-House of orange 学习笔记

2017-11-13 08:42
17619

前几天把House of orange重新学习了一下,比照着glibc malloc的源码好好分析了一下,希望做到真正做到知其然亦知其所以然,其中所做的笔记如下,可能描述上有点乱,大家将就着看一下吧。同时,我也发在了我个人博客上面 (http://blog.leanote.com/simp1e), 如果有错误的地方,请各位大牛多多指正。

大名鼎鼎的house_of_orange
程序逻辑还比较清晰的,一共可以build四次,然后每次build的话就是3次堆分配,两次malloc,一次calloc,其中一次malloc是固定分配0x10字节作为控制堆块,里面存放着namecolor的信息,另外按输入分配name的大小。

upgrade函数中,修改name时候不顾实际chunk的堆大小是多少,直接进行编辑,最大可编辑0x1000大小,因而存在溢出。

这里的利用思路是4ngelboy给出,下面就直接分析这样利用的原因。

因为程序中有堆的越界写,可以修改top_chunk的大小。在malloc源码里面如果申请的堆块大小超过了top_chunk的大小,将调用sysmalloc来进行分配。
sysmalloc里面针对这种情况有两种处理,一种是直接mmap出来一块内存,另一种是扩展top_chunk

就是如果申请大小>=mp_.mmap_threshold,就会mmap。我们质只要申请不要过大,一般不会触发这个,这个mmap_threshold的值为128*1024
不过下面还有两个assert需要检查,如下

第一个assert就是要求修改后的top_chunk_size必须满足

top_chunk_size小于申请分配的内存即可
满足以上四个条件之后,继续往下执行最后把原先的那个old_top给释放掉了,如下

显然,这样的free操作的话,我们就可以得到一个unsort_bin,然后之后再次分配时候如果是符合unsort_bin大小的话,就会从unsort_bin里面切出来。

这样的话我们再次申请一个堆块分配到这块区域中就能泄露libc地址了,但是这里又有一个trick,如果我们分配的大小是large_chunk的话。malloc源码中还把old_top的堆地址放到了堆里面(没有细究原因,但是好像是large bin没有区分大小,需要有个字段来保存大小的原因吧),源码如下

所以如果再次分配时候如果分配大小为largebin(也就是大于512字节)的chunk的话,就是可以既泄露libc又可以泄露heap。如下

而如果分配大小不到512字节时候是无法泄露堆地址的。

我们知道有ropretn Oriented Programming,那么其实File Stream Oriented Programming是一个道理的。也是一种劫持程序流程的方法,只不过方式是通过攻击File Stream来实现罢了。
我们先要了解malloc对错误信息的处理过程,malloc_printerrmalloc中用来打印错误的函数。

malloc_printerr其实是调用__libc_message函数之后调用abort函数,abort函数其中调用了_IO_flush_all_lockp,这里面用到IO_FILE_ALL里面的结构,采用的是虚表调用的方式。

其中使用到了IO_FILE对象中的虚表,如果我们能够修改IO_FILE的内容那么就可以一定程度上劫持流程。
IO_FILE_ALL是一个指向IO_FILE_plus的结构指针,结构如下图所示,具体结构不需要太了解清晰,大概懂一些也就行。

那么怎么劫持呢,这里又需要用到unsortbin attack的知识。
unsortbin attack是怎么一回事呢,其实就是在malloc的过程中,unsortbin会从链表上卸下来(只要分配的大小不是fastchunk大小)

如上代码所示,就是会把bk+0x10的地方写入本unsort_bin的地址,

我们通过内存断点来观察一下是如何进行的。
断点触发之后,发现io_file_all被修改成了指向top_chunk的指针时间地址位于main_arena

但是我们是无法控制main_arena的内容的,至少全部控制是不行的,那么怎么处理呢?
这里还是要牵扯到io_file的使用,IO_FILE结构中有一个字段是chian字段,它位于0x60偏移处,他指向的是下一个IO_FILE结构体,我们如果可以控制这个字段,就再次指定io_file的位置,它相当于是一个链表的结构
这样的话又联系到smallchunk的问题,在拆卸unsort_bin时候对属于small_bin的chunk进行了记录操作。
这个时候IO_FILE_all指向的正是main_arena的bins里面unsortbin的位置,那么偏移0x60处正好是,smallchunk的index为6的地方,也就是满足大小为16*6的chunk,所以upgrade时候需要把unsortbin设置为0x60大小。

因为第一个分配在main_arenaIO_FILE_plus结构的fp->mode等值不符合要求,就会通过chains跳转到就下一个IO_FILE_plus就是我们之前设置的unsortbin,然后需要满足一下条件

 
 
 
 
 
 
 
 

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 1
支持
分享
最新回复 (7)
雪    币: 6962
活跃值: (4172)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
感谢分享
2017-11-13 10:13
0
雪    币: 264
活跃值: (199)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
3
火速来膜  星星师傅来
2017-11-13 17:05
0
雪    币: 2379
活跃值: (141)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
4
wx_sw 火速来膜 星星师傅来
know  it  then  sw  hack  it 
2017-11-13 18:35
0
雪    币: 2
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
日常膜⭐⭐师傅
2017-11-14 15:06
0
雪    币: 2379
活跃值: (141)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
6
o小王o同学o 日常膜⭐⭐师傅
弄得我有点慌
2017-11-14 15:54
0
雪    币: 6818
活跃值: (153)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
不错!
2017-11-16 21:01
0
游客
登录 | 注册 方可回帖
返回
//