Chunk Extend and Overlapping

chunk extend 堆利用:
程序中堆的利用 可以控制chunk header中的数据 例如:heap overflow
ptmalloc 对chunk 操作的存在漏洞。

首先:怎么获取chunk的大小?


/* Get size, ignoring use bits */
#define chunksize(p) (chunksize_nomask(p) & ~(SIZE_BITS))

/* Like chunksize, but do not mask SIZE_BITS.  */
#define chunksize_nomask(p) ((p)->mchunk_size)

其实就是利用了size , 但是一种忽略了掩码部分,一种没有。

那么怎么获取下一个chunk的位置?
这个其实就是利用了隐式链表的技术


/* Ptr to next physical malloc_chunk. */
#define next_chunk(p) ((mchunkptr)(((char *) (p)) + chunksize(p)))

就是当前块指针加上当前块的大小。

那么有关前一个chunk的信息呢?
答案还在malloc_chunk的结构体里面,


/* Size of the chunk below P.  Only valid if prev_inuse (P).  */
#define prev_size(p) ((p)->mchunk_prev_size)

/* Ptr to previous physical malloc_chunk.  Only valid if prev_inuse (P).  */
#define prev_chunk(p) ((mchunkptr)(((char *) (p)) - prev_size(p)))

但是这一点的时候要特别注意malloc 和free两种不同的状态。
上面简单就是用本chunk - malloc_chunk->prev_size
那么判断是否处于in_use状态就是依靠in_use标志位了


#define inuse(p)
    ((((mchunkptr)(((char *) (p)) + chunksize(p)))->mchunk_size) & PREV_INUSE)

记住一点:本chunk的 in_use表示的是前一个chunk的状态哦。
综合起来chunk的判断 就是依赖于malloc_chunk结构体里面的内容,简单来说就是chunk_header
,那么利用思路就自然而然的出来了,我们通过堆漏洞(heap overflow之类的)可以改变chunk_header进而实现漏洞利用

下面来几个简单的实操:
1.在fastbin 里面的操作:

/*************************************************************************
    > File Name: chunk_extend.c
    > Author: 时钟
    > Mail: 522796871@qq.com
    > Created Time: 2019年08月16日 星期五 11时30分15秒
 ************************************************************************/

#include<stdio.h>
#include<stdlib.h>
int main()
{
    void *p , *c;
    p = malloc(0x10);
    malloc(0x10);
    *(long long*)((long long)p-0x8) = 0x41;
    free(p);
    c = malloc(0x32);

    return 0;
}

当我们free之后:

这接下来的malloc 就可以成功的控制下面的malloc , 相当于两个指针可以操作同一个chunk了哦。


   转载规则


《Chunk Extend and Overlapping》 时钟 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
glibc heap Fastbin Corruption glibc heap Fastbin Corruption
基础知识: fastbin: Chunk Size <= get_max_fast()的chunk(其实就是64bits的是128bytes,32位的是64bytes) ,它们会被放在被称为fastbin的bin里面 上面的f
2019-08-16
下一篇 
64位 house of spirit 64位 house of spirit
这个题目有问题,但是重要的是利用思想:可以把源码贴出来帮助理解: #include<stdio.h> #include<stdlib.h> #include<string.h> #include<u
2019-08-03
  目录