在pwn堆利用中 往往需要根据glibc的版本对exp进行一个改进
本人根据自身的需要对glibc2.23-glibc2.29在malloc.c在堆分配和回收策略上的变化进行一个记录
最主要的是记录报错信息
Glibc2.23
_int_malloc
从fastbin中分配fast chunk的时候
- malloc的时候 会对fastbin->fd指向的chunk 验证一遍它是否在对应的fast bin中 伪造的时候需要注意伪造的chunk所挂入的fastbin的队列
if (__builtin_expect (fastbin_index (chunksize (victim)) != idx, 0))
{
errstr = "malloc(): memory corruption (fast)";
errout:
malloc_printerr (check_action, errstr, chunk2mem (victim), av);
return NULL;
}
从smallbin中分配small chunk的时候
- 会验证smallbin中最后一个chunk的bk指针对应的fd指针是否合理 伪造chunk的时候溢出victim的bk指针,伪造fake chunk的fd指针即可
if (__glibc_unlikely (bck->fd != victim))
{
errstr = "malloc(): smallbin double linked list corrupted";
goto errout;
}
从unsorted bin中分配chunk的时候
- 分配的时候会依次检索unsorted bin中块的大小是否在2 * SIZE_SZ 和 av->system_mem之间 如果不是报错
if (__builtin_expect (victim->size <= 2 * SIZE_SZ, 0)
|| __builtin_expect (victim->size > av->system_mem, 0))
malloc_printerr (check_action, "malloc(): memory corruption",
chunk2mem (victim), av);
- 当unsorted bin为空的时候,若最后剩下一个size范围在Large Bin中的large chunk 且分割后的大小能大于MINSIZE 那么会分分割这一块在挂入unsorted bin前会检测unsorted bin最后挂入的块即unsorted bin->fd的bk指针是否指向unsorted bin
if (__glibc_unlikely (fwd->bk != bck))
{
errstr = "malloc(): corrupted unsorted chunks";
goto errout;
}
从Large bin中分配chunk的时候
- 从Large bin中分割出chunk放入unsorted bin中时 会再次检测最后一个放入unsorted bin中chunk的bk指针是否指向unsorted bin
if (__glibc_unlikely (fwd->bk != bck))
{
errstr = "malloc(): corrupted unsorted chunks 2";
goto errout;
}
_int_free
free的ptr的检验
- 检测释放的指针指向的地方是否符合条件 并且指针指向的地址是否对齐
if (__builtin_expect ((uintptr_t) p > (uintptr_t) -size, 0)
|| __builtin_expect (misaligned_chunk (p), 0))
{
errstr = "free(): invalid pointer";
errout:
if (!have_lock && locked)
(void) mutex_unlock (&av->mutex);
malloc_printerr (check_action, errstr, chunk2mem (p), av);
return;
}
free任何chunk时候都会进行的校验
- 会检测该chunk的size是否在该系统支持的最小chunk尺寸 并且chunk尺寸是否对齐
if (__glibc_unlikely (size < MINSIZE || !aligned_OK (size)))
{
errstr = "free(): invalid size";