学习笔记

这里会存放一些学习中的笔记 有关不好写文章的小知识 我会在这里编写:


Malloc_Hook

Malloc_hook

MallocHook为一段

源码如下

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)); //返回指向函数
……
}

__libc_malloc函数首先会检查__malloc_hook是否有值 不为空的话就执行__malloc_hook指向的函数

在堆还没初始化时,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置为NULL,并初始化堆,因此默认情况下当初始化堆后malloc_hook是空的。如果我们能修改malloc_hook为one_gadget,那么当调用malloc时就会执行malloc_hook指向的函数

在格式化字符串的作用:

printf函数在输出的内容较多时会调用malloc分配缓冲区,因此我们可以在将malloc_hook劫持到onegadget后再使用%10000c这样的格式化字符串来输出大量字符触发onegadget


%*$x

%*X$c%Y$n

这个格式化字符串的意思是:在栈中偏移X位的值mov 给栈中偏移Y的地址
其中的*代表了取对应函数的值 如Printf("%*d",5,10) 则是5 因为它会把10以宽度为5来打印
printf("%.*s",3,john)则会打印joh


万能接收句

万能接收句

0x01 32位

addr = u32(p.recvuntil("\xf7")[-4:])
1

0x02 64位

addr = u64(p.recvuntil("\x7f")[-6:].ljust(8, "\x00"))


打不通?

打不通?

尝试用ret来保证栈对齐 在溢出点之后