__malloc_hook

__malloc_hook

这是一个在调用malloc时总是会被调用的函数。看源码:

__libc_malloc (size_t bytes)
{
  mstate ar_ptr;
  void *victim;

  void *(*hook) (size_t, const void *)
    = atomic_forced_read (__malloc_hook);
  if (__builtin_expect (hook != NULL, 0))
    return (*hook)(bytes, RETURN_ADDRESS (0));
  
  ......
}

malloc在调用之前首先会检查__malloc_hook这个函数是否为空。不为空则调用他。
__malloc_hook的初始值是malloc_hook_init

static Void_t*
#if __STD_C
malloc_hook_ini(size_t sz, const __malloc_ptr_t caller)
#else
malloc_hook_ini(sz, caller)
size_t sz; const __malloc_ptr_t caller;
#endif
{
__malloc_hook = NULL;
ptmalloc_init();
return __libc_malloc(sz);
}

利用

在CTF中,如果可以覆盖掉__malloc_hook的值,则可以控制程序流程了。
但是怎么找这个值,我目前只做到了一道相关的静态链接的题目。所以可以直接看到malloc的源码,第一个出现的判断中就是__malloc_hook的地址。