how2heap

HWO 2 HEAP

glibc_2.27

fastbin_dup

fastbin_dup讲的是简单的double fastbin attack

1
2
3
4
5
6
7
8
9
10
int *a = malloc(8);
int *b = malloc(8);
int *c = malloc(8);

free(a)
free(b)
free(a)

之后申请3次同样大小的chunk,第三次所得即可以得到另外一个指向a的chunk

根据上述,我们在第三次申请出来的时候就可以得到指向main_arena+88的地址达到泄露libc的效果

fastbin_reverse_into_tcache

这个方法的作用就是在知道栈地址的情况下利用fastbin攻击去把chunk申请到栈上,利用条件比较有限,缓冲区溢出或者UAF。

先new7个unsortedbin大小的chunk我这里选择0x100,然再在new2个0x100

new一个0x10或者0x20的chunk隔开top_chunk,free掉0-6号填充tc,

然后free(8),free(9),malloc(0x100)[申请0x100的是把tc头申请出来],free(8)[这里是让8号成为tc头,得到有效指针],然后去new一个大小0x120的,把里面的fd指针改为fake_chunk_addr,接着new2个0x100的,第二个new得到的0x100的chunk就是fake_chunk了

house_of_botcake(unsortedbin double free)

=-=,填充unsortedbin tcache,free 受害 chunk,free辅助chunk

此时unsortedbin合并成了0x220大小的chunk,我们再去new一个0x100大小的chunk,把tcache头弄出来,再去free受害chunk,让他成为tcache头,然后申请一个0x120大小的chunk清理下unsortedbin让他的大小小于0x110,

之后就再去对受害chunk的fd指针写入栈地址,接着申请的第二次的堆就是在栈上申请的了。

(不一定是栈,换成别的地址同样成立)

house_of_einherjar(largebin attack)

这个house主要是利用off by null漏洞配合largebin进行任意地址申请。

下面就简单说下怎么利用,最重要的一点就是你要知道你想任意申请的地址的real addr,fake chunk的构造如下

1
2
3
4
5
6
7
8
size_t fake_chunk[6];

fake_chunk[0] = 0x100; // prev_size is now used and must equal fake_chunk's size to pass P->bk->size == P->prev_size
fake_chunk[1] = 0x100; // size of the chunk just needs to be small enough to stay in the small bin
fake_chunk[2] = (size_t) fake_chunk; // fwd
fake_chunk[3] = (size_t) fake_chunk; // bck
fake_chunk[4] = (size_t) fake_chunk; //fwd_nextsize
fake_chunk[5] = (size_t) fake_chunk; //bck_nextsize

这里选取的是栈上进行排布的,那么我们常态都在堆上排布。

可以如下布局

1
2
3
4
5
6
7
8
9
10
11
12
malloc(0x100) #chunk0
edit(0,p64(0x100)+p64(0x100)+p64(fake_chunk)*4)
malloc(0x38)#chunk1
malloc(0x4f8)#chunk2
#由于存在off by null 漏洞我们假设在edit的时候存在这个漏洞
edit(1,'a'*0x30+p64(prev_size))
#这里的prev_size的公式如下
#prev_size_addr-fake_chunk_addr=prev_size
edit(0,p64(0x100)+p64(prev_size)+p64(fake_chunk)*4)
free(2)
malloc(0x200)#这个堆此时就会申请到我们想要的地址+0x10上了
#至于你malloc多少是你自己的事情,就要看你之前chunk0布局的是多大了,只要申请的大小大于之前布局的大小都可以,在这里0x100也是可以的。

关于#prev_size_addr-fake_chunk_addr=prev_size的chunk1的gdb布局如下

1
2
3
4
5
6
7
pwndbg> x/32gx 0x555555757250
0x555555757250: 0x0000000000000000 0x0000000000000041
0x555555757260: 0x0000000000000000 0x0000000000000000
0x555555757270: 0x0000000000000000 0x0000000000000000
0x555555757280: 0x0000000000000000 0x0000000000000000
0x555555757290: 0xffffd55555759360 0x0000000000000500

总结下来说,条件要的还是比较多,最重要的还是地址的获取,堆题的基本要素就是地址泄露。

最后讲下可能让人懵逼的点,也许有人会觉得很神奇,其实不然。

在上面的排布中我们是这样排布的

chunk0

chunk1

chunk2

我们把2的prev_size改成了包揽chunk0和chunk1在内的大小,同时把chunk0里面包含的fake chunk大小改为了包揽chunk0和chunk1在内的大小,那么当我们利用off by null去free chunk2造成的堆重叠,我们再去申请一个chunk大小和chunk0相同的,本来正常来说我们不去改动他的fd,bk以及fd_size,bk_size就会正常申请回chunk0但是我们做了手脚,让chunk0此时指向了fake chunk,那么我们去申请的时候就会往fake chunk的地址上去申请了就是这个道理。

house of force

方法如其名,暴力的不行,要是条件允许的情况下,比如堆溢出,或者可以泄露出top chunk的addr利用别办法申请到top chunk,把top chunk大小改成-1

这样就可以随便malloc了,也是属于一种任意地址申请。

  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2021-2023 H.greed
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信