高版本largebin_attack

文章发布时间:

最后更新时间:

利用源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
      /* maintain large bins in sorted order */
if (fwd != bck) # 检查large bin是否为空
{
/* Or with inuse bit to speed comparisons */
size |= PREV_INUSE;
/* if smaller than smallest, bypass loop below */
assert (chunk_main_arena (bck->bk));
if ((unsigned long) (size)
< (unsigned long) chunksize_nomask (bck->bk))
{
fwd = bck;
bck = bck->bk;

victim->fd_nextsize = fwd->fd;
victim->bk_nextsize = fwd->fd->bk_nextsize;
fwd->fd->bk_nextsize = victim->bk_nextsize->fd_nextsize = victim;
}
...
}


利用原理

victim是将要链入largebin的堆块
fwd是已经进入large bin中比victim较大的堆块

如果largin bin中仅有一个堆块
fwd->fd就指向fwd本身

如果能够控制fwd->bk_nextsize位target_addr,就能向target_addr + 0x20 的位置写入victim的地址

这个0x20是因为c语言中访问结构体对象本质是运用偏移,所以->fd_nextsize相当于+ 0x20

所有largbin attack流程就是:

先使一个堆块进入large bin中,修改其bk_nextsize为target_addr

再使一个比第一个堆块较小的堆块进入large bin即可触发largebin attack

largebin attack通常作为io利用的前置,用于修改_io_list_all为堆块地址,再进行相关io的伪造和利用