Hook_magic
how hook works
Hook’s Magic
粗浅的理解,可能理解不对的地方很多。
最近遇到好多题通过hook来跳shell,好处是只要泄露了libc并且有任意写的能力就可以将one_gadget写入libc中的__malloc_hook(例)在调用malloc的时候就会跳到one_gadget。
0x00 What’s Hooks?
libc中的hook机制,主要用于内存分配,它就像无处不在的钩子一样,一旦设置好了 hook,我们就可以在内存分配的地方随心所欲地做我们想做的事情。(摘自别人博客)
上源码——> malloc.c
void *
__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的主要实现在int_malloc,事实上会先检查是否存在hook如果存在hook那么执行hook指向的函数.
由于c基础太差 这里插入一些关于函数指针的内容
0x01 函数指针
函数指针,指向函数的指针定义方法如下
返回类型 (*函数指针名称)(参数类型,参数类型,参数类型,…);
看起来和函数的定义方法相似只是要在指针名称前加一个*
#include<stdio.h>
void (*p)(int a);
void add(int a)
{
printf("%d\n",a+1);
}
int main()
{
add(11);
p=add;
p(12);
}
然后我们上gdb查看一下实现
0x40054b <main>: push rbp
0x40054c <main+1>: mov rbp,rsp
0x40054f <main+4>: mov edi,0xb
=> 0x400554 <main+9>: call 0x400526 <add>
0x400559 <main+14>: mov QWORD PTR [rip+0x200adc],0x400526 # 0x601040 <p>
0x400564 <main+25>: mov rax,QWORD PTR [rip+0x200ad5] # 0x601040 <p>
0x40056b <main+32>: mov edi,0xc
0x400570 <main+37>: call rax
看罢还是很好理解的 只是赋值形式初见 一时还看不顺眼。
0x02 How Hooks Works
hook在glibc/malloc/malloc.c中的定义
/* Hooks for debugging and user-defined versions. */
extern void (*__free_hook) (void *__ptr, const void *);
extern void *(*__malloc_hook)(size_t __size, const void *);
extern void *(*__realloc_hook)(void *__ptr, size_t __size, const void *);
extern void *(*__memalign_hook)(size_t __alignment, size_t __size, const void *);
extern void (*__after_morecore_hook) (void);
在没调用malloc之前__malloc_hook->malloc_hook_ini
static void *
malloc_hook_ini (size_t sz, const void *caller)
{
__malloc_hook = NULL;
ptmalloc_init ();
return __libc_malloc (sz);
}
从malloc_hook_ini中看到调用一次后将__malloc_hook置0为并返回____libc_malloc(sz)
所以只要将hook指向的地址改写就可以jump改写后的地址