#include<stdio.h>
#include<malloc.h>
int main()
{
char* a = malloc(0x88);
char* b = malloc(0x8);
free(a);
long* c = malloc(0x88);
printf("%lx , %lx\n",c[0],c[1]);
return 0;
}
unsorted bin leak原理:将chunk从unsorted bin申请回来时,chunk中保存的与unsorted bin相关的地址没有被清除,可以通过该地址获取libc的基地址
之前的文章过,画了个图介绍过,how2heap-2.23-03-fastbin_dup_consolidate,现在粘贴过来
char* a = malloc(0x88);
申请一个大于fastbin范围的chunk achar* b = malloc(0x8);
预防chunk a被释放后与top chunk合并free(a);
将chunk a释放到 unsorted bin中可以看到unsorted bin中保存了chunk a的地址,chunk a的fd,bk也保存了unsorted bin的地址(实际是top的地址)
long* c = malloc(0x88);
将chunk a重新申请回来,unsorted bin恢复为chunk a放进去之前的数据,而chunk a fd,bk中保存的unsorted bin的地址(实际是top的地址)并没有被清除
读取chunk c的c[0],c[1]就能获取unsorted bin的地址(实际是top的地址)
可以计算出top到main_arean的距离是8 * 11 = 88
(在64位系统下:4字节的mutex + 4字节的flags + 8*10的fastbinY数组),从而得到main_aren的地址
通过 __malloc_trim
函数得出
int
__malloc_trim (size_t s)
{
int result = 0;
if (__malloc_initialized < 0)
ptmalloc_init ();
mstate ar_ptr = &main_arena; // <<<<<<<<<<<<<<<<<
do
{
(void) mutex_lock (&ar_ptr->mutex);
result |= mtrim (ar_ptr, s);
(void) mutex_unlock (&ar_ptr->mutex);
ar_ptr = ar_ptr->next;
}
while (ar_ptr != &main_arena);
return result;
}
通过__malloc_hook
得出
main_arena_offset = ELF("libc.so.6").symbols["__malloc_hook"] + 0x10
之后便能计算出libc的基地址