House-Of-Lore

November 5, 2019 PWN 访问: 29 次

House-of-Lore是一个关于small bin的,利用条件是
- 能够控制进入small bin中的chunk
- 用户malloc的大小可控
源码分析:(glibc-2.23/malloc/malloc.c:3405)

  if (in_smallbin_range (nb))//nb在不在small bin 范围内
    {
      idx = smallbin_index (nb); //获取nb大小所在得small bin得index
      bin = bin_at (av, idx);//获取对应index的指针
      if ((victim = last (bin)) != bin)//取最后一个chunk的指针和第一个chunk的指针对比
        {//验证改small bin是不是为空
          if (victim == 0) /* initialization check 验证有没有初始化*/
            malloc_consolidate (av);
          else
            {
              bck = victim->bk;//取倒数第二个chunk
    if (__glibc_unlikely (bck->fd != victim))//验证一下fd指针
                {
                  errstr = "malloc(): smallbin double linked list corrupted";
                  goto errout;
                }
              set_inuse_bit_at_offset (victim, nb);
              bin->bk = bck;******
              bck->fd = bin;******
              if (av != &main_arena)
                victim->size |= NON_MAIN_ARENA;
              check_malloced_chunk (av, victim, nb);
              void *p = chunk2mem (victim);
              alloc_perturb (p, bytes);
              return p;
            }
        }
    }

主要触发点我已经在上面用*号标明,当我们可以控制已经释放了的small bin时,控制它的bk指针,指向伪造的chunk地址,然后再malloc两次victimsize,即可分配到我们伪造的地址上
demo:

//gcc -g -no-pie demo.c -o demo
#include
#include
char *heap[5];
int main()
{
    puts("hello");
    heap[0]=malloc(0x90);
    heap[1]=malloc(0x100);
    free(heap[0]);
    heap[2]=malloc(0x110);
    heap[3]=malloc(0x90);
    heap[4]=malloc(0x90);
    return 0;
}

gdb中调试,在heap[3]=malloc(0x90);处停下,修改内存数据,伪造此时在small bin中的heap[0],其bk指针指向0x601060,其0x601070的值为heap[0] chunk的起始地址,其0x601078的值是一个指向fd指针0x601060的指针,
执行程序heap[4]即可分配到0x601070

添加新评论