堆漏洞挖掘——unsortedbin attack漏洞
原创
©著作权归作者所有:来自51CTO博客作者董哥的黑板报的原创作品,请联系作者获取转载授权,否则将追究法律责任
一、核心思想
- 实现在任意地址写一个数值。
- 局限性:通常unsortedbin attack只能够在目标地址写一个大数值。
- unsortedbin attack通常是为了配合fastbin attack而使用的。
- fastbin attack见文章:javascript:void(0)。
二、原理图解
- 当从unsortedbin中取走一个freechunk时,执行的是下面的两个步骤。
第一步
- unsortedbin正常存储freechunk的结构如图所示,此时这个freechunk是我们还可以通过指针操控的(虽然free了但没有置空)。

第二步
- 如果在取走堆块之前,我们将unsortedbin中的chunk的bk指针改为我们的target地址,如下图所示:

第三步
- 此时我们去malloc堆块的时候就会发生如下代码(victim为freechunk)。


- 那么取走堆块之后,unsortedbin的结构就变为如图所示,此时我们的target的fd的内容为malloc_state结构体的unsortedbin链的fd指针了(glibc中fd指针肯定是0x7f开头的大数值)。因此就实现了向target地址的指定位置处写入一个大值。

三、在fastbin attack中的应用
- 在fastbin attack中何处应用?我们知道fastbin attack中构造堆块时,需要将目标地址的size数值处写入一个0x7f的数值才能够过滤掉系统的检测,如果没有方法写入,就可以利用unsortedbin attack,将构造堆块的地址作为unsortedbin attack的target地址,那么就可以实现在指定位置处写入0x7f的数值了。
- 备注:因为unsortedbin attack是在fd位置处写入0x7f数值,而构造堆块需要设置的size成员,所以攻击时需要计算好偏移地址。
使用步骤
- 其中①②③⑧⑨是fastbin attack需要做的,④⑤⑥⑦是unsortedbin attack需要做的:
- ①malloc fastchunk 0x70。
- ②free掉fastchunk。
- ③将fastchunk的fd变为target。
- ④malloc 0x100。
- ⑤free 0x100。
- ⑥change 0x100+0x8的位置改为target(就是bk的位置)。
- ⑦malloc 0x100,此时arena的地址被写入target中去了。
- ⑧malloc 0x70,将第一次malloc的堆块取出来,使fastbin中只有target。
- ⑨再次malloc 0x70 ==>就是取出target。
四、演示案例
#include <stdio.h>
#include <malloc.h>
#include <unistd.h>
#include <string.h>
int main()
{
int size=0x100;
char *p=malloc(size);
printf("%p\n",p);
free(p);
sleep(0); //第一步,sleep函数为程序打断点使用,无其他作用
*(long*)(p+8)=0x601100; //0x601100是我们的攻击目标
sleep(0); //第二步
char *r=malloc(size);
printf("%p\n",r);
sleep(0); //第三步
return 0;
}
第一步
- 申请一个small chunk,并free放入unsortedbin中。
- 可以看到freechunk的bk和fd都指向于malloc_state结构体中的bin链头fd处。

- 可以看到chunk被放入unsortedbin中,printf打印的是0x602010。


第二步

- 通过heap可以看到,freechunk的fd没变,但是bk指针成功被我们修改了。

- 由于bk指针被我们修改了,所以bins查看unsortedbin的时候,unsortedbin链查看不到了。但是FD和BK的循环结构还可以看到。

- 此时我们的攻击目标的指定偏移用于表示fd的地方还全是0。

第三步
- 此时我们malloc与第一次释放大小相同的堆块,那么刚才freechunk就会被拿出来使用。

- 释放之后,unsortedbin中没有堆块了,于是FD和BK的循环结构也变了。

- 此时去查看我们的攻击目标地址,可以看到其指定偏移用于表示fd的位置处被写入了0x7ffff7ddb78,这个数值就是unsortedbin的bin头的fd地址。

- 通过上面的一系列操作,我们将0x601110处写入了0x7ffff7ddb78,如果在fastbin attack中,0x601110-0x3使我们的攻击目标的话,那么0x601110-0x3的指定偏移用于表示size的地址处就被我们写入了0x7f的数值,如下图所示:

- 我是小董,V公众点击"笔记白嫖"解锁更多【堆漏洞挖掘】资料内容。
