漏洞就是劫持程序控制流
先对程序进行分析
alloc(Length) //struct a_malloc{int use_or_not; int Length;void* base;int un_use} ; struct a_malloc malloc_array[16];
fill(任意长度)
free(指定块)
dump(输出对应chunk的Length)//可以填充任意长度的数据,即可以修改 chunk头
目标 -->劫持程序控制流 --> 把__malloc_hook变成one_gadget地址 --> 获得glibc_base地址 --> 泄露 glibc内部数据地址
劫持程序控制流
①只要可以修改程序执行路径上的流程,就可能拿到shell
②最基础的__libc_malloc中会调用 __malloc_hook()
③__malloc_hook 又处于数据区,即修改__malloc_hook值即可获得程序控制流
把__malloc_hook变成one_gadget地址
①申请一块内存,刚好覆盖__malloc_hook
②写入one_gadget
泄露 glibc内部数据地址
① 释放一个small_bin大小的chunk
//free会将small_bin放入unsort_bin 即main_arena.bins[0]
//为了实现链表的双向寻找,会将&mian_arena.bins[0] -0x10 放入free_chunk的fd,bk // -0x10是为了 符合malloc_chunk的结构
② 打印超过自身大小的数据
打印超出自身大小的数据
① 修改chunk.size 使得 free的时候 释放更大空间 // 进入更大的fastbin链
②然后再申请回来,使得绕过 a_malloc.Length的限制
梳理思路
申请更大快的内存-->泄露lic地址
Index0 = calloc(Length0) //change chunk1.size
Index1 = calloc(Length1) //free and malloc to get more Index1 size
Index2 = calloc(Length2) //free to get main_arena_address
Index3 = calloc(Length3) //防止free(Index2)时 ,top_chunk和Index2合并