网上 write up 太多了,自己就写一些收获吧
0X00 泄露 libc 地址的 tip
当用 mmap() 分配一个大内存的时候,这个大内存的地址与 libc_base 有一个定值,这个定值与 glibc 的版本有关,我们来试一下。
分配一个超大内存,会使用 mmap 创建
// gcc test.c -o test -g
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
void *p = malloc(0x23000);
getchar();
return 0;
}
我们用 gdb 打开
gdb test
start
b main
c
n
查看 p 的值
info locals
到底什么是 libc 的基地址呢?很多人都略过了这个问题。
我们输入
vmmap
很显然这个布局是从低到高,libc 的基地址就是 libc 刚开始出现的地址,0x7ffff79e4000 这就是 libc 基地址。
现在我们来计算 p - libc_base_addr
的值
这个值确实是一个定值,通过这样就可以泄露 libc 的基地址了
0X01 什么是 __free_hook
我写一个小例子你就明白了!
// gcc free_hook.c -o free_hook
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
extern void (*__free_hook) (void *__ptr,const void *);
int main()
{
char *str = malloc(160);
strcpy(str,"/bin/sh");
printf("__free_hook: 0x%016X\n",__free_hook);
// 劫持__free_hook
__free_hook = system;
free(str);
return 0;
}
运行 ./free_hook
,就直接运行了 system("/bin/sh")
我们用 pwngdb 调试一下进入 free 函数就知道:
把 __free_hook 赋给局部变量 hook,如果 hook 不为空,就会执行 hook,并把 memory 的当做参数传给它。这样就执行了 system("/bin/sh")
所以说 __free_hook 就是一个存在于 libc 的全局变量,一般为空,只要不为空,就会执行存在里面的函数