how2heap-2.23-09-chunk_extend_and_overlapping

1:对 inuse 的 fastbin 进行 extend

int main(void)
{
    void *ptr,*ptr1;

    ptr=malloc(0x10);//分配第一个0x10的chunk
    malloc(0x10);//分配第二个0x10的chunk
	
	//
    *(long long *)((long long)ptr-0x8)=0x41;// 修改第一个块的size域
    free(ptr);
	//
	
    ptr1=malloc(0x30);// 实现 extend,控制了第二个块的内容
    return 0;
}

原因:符合fastbin chunk大小的chunk被释放时,只根据chunk的size将其放入到特定的fastbinY中


2:对 inuse 的 small bin 进行 extend

#include 
int main()
{
    size_t *ptr,*ptr1;

    ptr=malloc(0x80);//分配第一个 0x80 的chunk1
    malloc(0x10); //分配第二个 0x10 的chunk2
    malloc(0x10); //防止与top chunk合并

    ptr[-1] = 0xb1;
    free(ptr);

    ptr1=malloc(0xa0);
}

原因:

  • free(ptr) 会将ptr放入到unsorted bin中
  • 在执行ptr1=malloc(0xa0)
    • 首先会回计算出0xa0是属于small bin的范围,会尝试到small bin中去找,但是现在small bin是空的
    • 整理unsorted bin 链中的chunk,当ptr chunk从unsorted bin被摘出后,会立即比较ptr chunk的size是否与ptr1请求的size相同, 相同就会直接取出,没有其他检查
          /* remove from unsorted list */
          unsorted_chunks (av)->bk = bck;
          bck->fd = unsorted_chunks (av);

          /* Take now instead of binning if exact fit */

          if (size == nb)
            {
              set_inuse_bit_at_offset (victim, size);
              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;
            }

3:对 free 的 small bin 进行 extend

#include 
int main()
{
    size_t *ptr,*ptr1;

    ptr=malloc(0x80);//分配第一个0x80的chunk1
    malloc(0x10);//分配第二个0x10的chunk2

    free(ptr);//首先进行释放,使得chunk1进入unsorted bin

    ptr[-1] = 0xb1;
    ptr1=malloc(0xa0);
}

原因:和2:对 inuse 的 small bin 进行 extend一致
how2heap 2.23 overlapping_chunks 与此 相似


4:通过 extend 后向 overlapping

#include 
int main()
{
    size_t *ptr,*ptr1;

    ptr=malloc(0x10);//分配第1个 0x80 的chunk1
    malloc(0x10); //分配第2个 0x10 的chunk2
    malloc(0x10); //分配第3个 0x10 的chunk3
    malloc(0x10); //分配第4个 0x10 的chunk4    
    ptr[-1] =0x61;
    free(ptr);
    ptr1=malloc(0x50);
}

原因:和1:对 inuse 的 fastbin 进行 extend一致,两个代码片段的作用没看出有啥区别

5:通过 extend 前向 overlapping

#include 
int main(void)
{
    size_t *ptr1,*ptr2,*ptr3,*ptr4;
    ptr1 = malloc(128);//smallbin1
    ptr2 = malloc(0x10);//fastbin1
    ptr3 = malloc(0x10);//fastbin2
    ptr4 = malloc(128);//smallbin2
    malloc(0x10);//防止与top合并
    free(ptr1);
    ptr4[-1] = 0x90;//修改pre_inuse域
    ptr4[-2] = 0xd0;//修改pre_size域
    free(ptr4);//unlink进行前向extend
    malloc(0x150);//占位块
    return 0;
}

原因:通过修改ptr4的pre_inuse,ptr4的pre_size,使得glibc malloc管理器认为ptr1和ptr2虚拟内存相邻,释放ptr4后触发unlink进行前向extend。数值正常,可以正常申请 malloc(0x150)

how2heap 2.23 overlapping_chunks_2 原理与此相似

你可能感兴趣的:(二进制安全-01-pwn,linux,pwn)