WWW2Exec - __malloc_hook & __free_hook

支持HackTricks

Malloc Hook

正如您可以在GNU官方网站上看到的,变量**__malloc_hook是一个指针,指向将在调用malloc()时调用的函数的地址**,存储在libc库的数据段中。因此,如果将此地址覆盖为例如One Gadget,并调用malloc,则将调用One Gadget

要调用malloc,可以等待程序调用它,或者通过调用printf("%10000$c"),这将分配太多字节,使libc调用malloc在堆中分配它们。

有关One Gadget的更多信息,请参见:

One Gadget

请注意,对于GLIBC >= 2.34,挂钩已禁用。现代GLIBC版本可以使用其他技术。请参见:https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md

Free Hook

这在页面中滥用快速bin攻击后滥用未排序bin攻击的示例中被滥用:

Unsorted Bin Attack

如果二进制文件具有符号,则可以使用以下命令找到__free_hook的地址:

gef➤  p &__free_hook

在这篇文章中 ,您可以找到一个关于如何在没有符号的情况下定位__free_hook地址的逐步指南。总结一下,在free函数中:

gef➤  x/20i free
0xf75dedc0 <free>: push   ebx
0xf75dedc1 <free+1>: call   0xf768f625
0xf75dedc6 <free+6>: add    ebx,0x14323a
0xf75dedcc <free+12>:  sub    esp,0x8
0xf75dedcf <free+15>:  mov    eax,DWORD PTR [ebx-0x98]
0xf75dedd5 <free+21>:  mov    ecx,DWORD PTR [esp+0x10]
0xf75dedd9 <free+25>:  mov    eax,DWORD PTR [eax]--- BREAK HERE
0xf75deddb <free+27>:  test   eax,eax ;
0xf75deddd <free+29>:  jne    0xf75dee50 <free+144>

在上述代码中的断点处,$eax中将会存储__free_hook的地址。

现在执行一个快速bin攻击

  • 首先发现可以在**__free_hook位置使用大小为200的快速块**:

gef➤  p &__free_hook
$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 <__free_hook>
gef➤  x/60gx 0x7ff1e9e607a8 - 0x59
0x7ff1e9e6074f: 0x0000000000000000      0x0000000000000200
0x7ff1e9e6075f: 0x0000000000000000      0x0000000000000000
0x7ff1e9e6076f <list_all_lock+15>:      0x0000000000000000      0x0000000000000000
0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000      0x0000000000000000
  • 如果我们成功在这个位置获得大小为0x200的快速块,就可以覆盖一个将被执行的函数指针

  • 为此,创建一个大小为0xfc的新块,并使用该指针两次调用合并函数,这样我们就可以获得一个指向大小为0xfc*2 = 0x1f8的已释放块的指针。

  • 然后,在这个块中调用编辑函数,将这个快速块的**fd地址修改为指向之前的__free_hook**函数。

  • 接着,创建一个大小为0x1f8的块,从快速bin中检索之前无用的块,然后再创建一个大小为0x1f8的块,以在**__free_hook中获取一个快速bin块,将其覆盖为system**函数的地址。

  • 最后,释放一个包含字符串/bin/sh\x00的块,调用删除函数,触发指向带有/bin/sh\x00参数的**__free_hook**函数。

参考资料

Last updated