通过 realloc 调整栈帧使用 one_gadget

本文参考:
https://www.cnblogs.com/hetianlab/p/13884739.html

realloc函数

realloc 在库函数中的作用是重新调整 malloc 或 calloc 所分配的堆大小。它和 malloc 函数一样有 hook 函数,当 hook 函数不为空时,就会跳转运行 hook 函数(和 malloc_hook 一样的)。

__int64 __fastcall realloc(signed __int64 a1, unsigned __int64 a2, __int64 a3)
{
    ……
    if ( _realloc_hook )
    return _realloc_hook(a1, a2, retaddr);
    ……

libc拖到ida里看
file

函数里面开始就有很多push,先执行 push 压栈,然后在跳转执行 realloc_hook 存储的函数,就是利用这些 push 调整栈帧。push 的数量发生变化会影响 rsp 的地址,这样就可以控制 rsp 的取值,从而满足 onegadget 的执行条件。除了可以控制 push 数量,还能通过偏移得到其他的 push xxx 。

malloc_hook 与 realloc_hook 配合

将 malloc_hook 劫持为 realloc ,realloc_hook 劫持为 onegadget ,实际运行顺序:

malloc -> malloc_hook -> realloc -> realloc_hook -> onegadget

这样就能经过 realloc 调整栈帧后再运行 onegadget 。实际情况中,并不是直接劫持 malloc_hook 为 realloc ,而是要加上一定的偏移,也就是调整 push 的数量,让栈帧结构满足 onegadget 运行。

realloc 这个偏移做题还是逐个快一点,因为设想是少一个 push ,rsp 就会向前移动一个内存单元,对应的 [rsp+0x30]=[rsp+0x38] ,但实际上有少部分位置可能被其他东西写入改变了原来的值。

偏移

通过调用到不同的 push 或者 sub ,来调整寄存器周围。

我的 pwntools 里使用 gdb ,不能用 'n','c' 等这些命令,没办法调试过去,就很麻烦,一个一个试,运气不好也不行。等我重新安好旧版的 ubuntu 再试试。

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据