一、核心思想
  •  实现在任意地址写一个数值。
  • 局限性:通常unsortedbin attack只能够在目标地址写一个大数值。
  • unsortedbin attack通常是为了配合fastbin attack而使用的。
  • fastbin attack见文章:javascript:void(0)
二、原理图解
  • 当从unsortedbin中取走一个freechunk时,执行的是下面的两个步骤。

第一步

  • unsortedbin正常存储freechunk的结构如图所示,此时这个freechunk是我们还可以通过指针操控的(虽然free了但没有置空)。

堆漏洞挖掘——unsortedbin attack漏洞_#include

第二步

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

堆漏洞挖掘——unsortedbin attack漏洞_指定位置_02

第三步

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

堆漏洞挖掘——unsortedbin attack漏洞_#include_03

堆漏洞挖掘——unsortedbin attack漏洞_#include_04

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

堆漏洞挖掘——unsortedbin attack漏洞_循环结构_05

三、在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处。

堆漏洞挖掘——unsortedbin attack漏洞_#include_06

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

堆漏洞挖掘——unsortedbin attack漏洞_循环结构_07

堆漏洞挖掘——unsortedbin attack漏洞_循环结构_08

第二步

  • 此处我们选取0x601100作为我们的攻击目标。

堆漏洞挖掘——unsortedbin attack漏洞_#include_09

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

堆漏洞挖掘——unsortedbin attack漏洞_循环结构_10

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

堆漏洞挖掘——unsortedbin attack漏洞_#include_11

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

堆漏洞挖掘——unsortedbin attack漏洞_指定位置_12

第三步

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

堆漏洞挖掘——unsortedbin attack漏洞_指定位置_13

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

堆漏洞挖掘——unsortedbin attack漏洞_#include_14

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

堆漏洞挖掘——unsortedbin attack漏洞_循环结构_15

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

堆漏洞挖掘——unsortedbin attack漏洞_循环结构_16


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

堆漏洞挖掘——unsortedbin attack漏洞_指定位置_17