记录黑客技术中优秀的内容, 传播黑客文化,分享黑客技术精华

网络安全之unsorted bin attack分析

2016-12-17 22:50

本文主要是unsorted bin attack分析,旨在服务社会,供安全研究人员学习使用,请勿用于其他非法用途,违者后果自负。

一、前言

这是之前那篇文章溢出利用FILE结构体的后续篇,前面提过是针对上海网络安全大赛的pwn450的技术写的文章,总共两个技术,一个是溢出利用FILE结构体,一个就是unsorted bin attack,这一篇文章主要就要先介绍unsorted bin attack技术的原理,然后再把这个东华杯的pwn450我写的exp的过程一步一步介绍。会尽可能的详细,所以会显得比较繁琐,大牛们可以跳过。

要知道堆溢出的原理,首先需要掌握堆的结构,比如chunk的结构,main_arena的结构等;还有Glibc在malloc和free时所作的事情,这一个管理过程比较多比较复杂,而且我也没学太明白,所以我就不专门介绍了,怕误导大家,也容易导致篇幅会很长,大家可以自己去找各种资料看,我也会给出几个链接。后面和unsorted bin attack 相关的分配以及释放过程在用到的时候再进行介绍,我这里的系统是64位的linux,所有的地址都是8位,相关的大家自己进行转换。

二、unsorted bin attacck原理

堆在分配的时候,如果在申请的内存大小所对应的small bin或者large bin里面没有找到对应的chunk,此时会从unsorted bin里面去寻找chunk看是否存在合适的内存分配给用户,这个过程中会把unsorted bin链表给清空,清空的过程中没有进行检查,由此可能会发生任意地址可写。源代码如下:

/* remove from unsorted list */

unsorted_chunks (av)->bk = bck;

bck->fd = unsorted_chunks (av);

试想如果bck的fd可以被我们控制,这个时候我们就可以让它指向任意地址,最终使*bck->fd)+0x10的值被修改成unsorted_chunks(av),从而实现任意地址写,后续如果能够控制它指向到我们可控的内存区域,最终就有可能会控制整个程序。

下面这个源代码是我在学这个技巧的时候google到的代码,是shellfish团队的unsorted_bin_attack.c源代码可以帮大家进一步理解,贴出来:


#include

#include

int main(){

printf("This file demonstrates unsorted bin attack by write a large unsigned long value into stack\n");

printf("In practice, unsorted bin attack is generally prepared for further attacks, such as rewriting the "

"global variable global_max_fast in libc for further fastbin attack\n\n");

unsigned long stack_var=0;

printf("Let's first look at the target we want to rewrite on stack:\n");

printf("%p: %ld\n\n", &stack_var, stack_var);

unsigned long *p=malloc(400);

printf("Now, we allocate first normal chunk on the heap at: %p\n",p);

printf("And allocate another normal chunk in order to avoid consolidating the top chunk with"

"the first one during the free()\n\n");

malloc(500);

free(p);

printf("We free the first chunk now and it will be inserted in the unsorted bin with its bk pointer "

"point to %p\n",(void*)p[1]);

//------------VULNERABILITY-----------

p[1]=(unsigned long)(&stack_var-2);

printf("Now emulating a vulnerability that can overwrite the victim->bk pointer\n");

printf("And we write it with the target address-16 (in 32-bits machine, it should be target address-8):%p\n\n",(void*)p[1]);

//------------------------------------

malloc(400);

printf("Let's malloc again to get the chunk we just free. During this time, target should has already been "

"rewrite:\n");

printf("%p: %p\n", &stack_var, (void*)stack_var);

}

它的注释已经写的很清楚了,我就不再解释了。

三、东华杯的pwn450

这道题主要是利用 unsorted bin attack 来覆写_IO_list_all 指针,伪造_IO_FILE对象,达到劫持控制流的目的。下面一步一步介绍。先介绍程序的功能

 

\

 

经典的CTF堆利用的模式,申请、显示、编辑以及删除堆块。功能的详细介绍:

1、申请堆块:

申请最小为512大小的堆,指针保存在全局变量当中,并且将malloc的地址打印出来(这样做的目的其实是出题人减小题目的难度)

 

\

 

2、显示堆块内容:

空操作,什么也不干。

3、编辑堆块:

输入数据,这个地方存在溢出,因位没有对输入大小进行控制,只通过判断是否存在'\n'来判断结束。

 

\

 

vuln_func(这也算一个比较经典的代码段吧)如下:

 

\

 

4、删掉:

简单的调用free函数,同时将全局的ptr指针置0。

刚开始一看,以为是House of Force,覆盖top chunk的size,然后控制top chunk到got表去,可是发现程序中只允许存在一个note,所以没有办法。只能换个思路。另一个思路就是利用 unsorted bin attack 来覆写_IO_list_all 指针,伪造_IO_FILE对象,最终控制整个程序。主要是参考 hitcon 2016 的 house of orange 和大佬们写的pwn450的wp。

四、利用过程

1、泄露libc基址

首先说明如何泄露libc的基址,当申请的内存大于某个阈值时,系统会调用mmap直接为应用程序分配页面,此时分配出来的的页面会紧贴着libc页面,所以我们可以通过分配一个大内存,最后得到地址加上大小最终就得到了libc的基址。题目又给了so,所以可以得到system以及_IO_list_all以及main_arena等结构的真实地址。

malloc大内存(0x2000000)前:

 

\

 

malloc大内存后:

 

\

 

可以看到0x00007f4b19898000+0x0x2001000就到了libc的基址,多0x1000是因为对齐。

2、获取unsorted bin chunk

程序中只允许存在一个note,正常来说将通过top chunk分配,在释放后也将与top chunk合并,不会出现unsorted chunk,如何得到unsorted chunk,这个需要通过触发 sysmalloc 中的_int_free 来实现。当申请的堆块大于当前的top chunk size且小于用mmap分配的阈值时,系统会将原来的top chunk 放到unsorted bin中,同时分配新的较大的top chunk出来。

知识来源: www.2cto.com/article/201612/577225.html

阅读:133160 | 评论:0 | 标签:无

想收藏或者和大家分享这篇好文章→复制链接地址

“网络安全之unsorted bin attack分析”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

公告

关注公众号hackdig,学习最新黑客技术

推广

工具

标签云