WWW2Exec - __malloc_hook & __free_hook

Reading time: 5 minutes

tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)

支持 HackTricks

Malloc Hook

正如你可以在 Official GNU site 上看到的,变量 __malloc_hook 是一个指针,指向 每当调用 malloc() 时将被调用的函数的地址,该地址 存储在 libc 库的数据段中。因此,如果这个地址被覆盖为一个 One Gadget,例如,当调用 malloc 时,One Gadget 将被调用

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

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

One Gadget

warning

请注意,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 的地址:

bash
gef➤  p &__free_hook

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

gef➤  x/20i free
0xf75dedc0 : push   ebx
0xf75dedc1 : call   0xf768f625
0xf75dedc6 : add    ebx,0x14323a
0xf75dedcc :  sub    esp,0x8
0xf75dedcf :  mov    eax,DWORD PTR [ebx-0x98]
0xf75dedd5 :  mov    ecx,DWORD PTR [esp+0x10]
0xf75dedd9 :  mov    eax,DWORD PTR [eax]--- 在这里中断
0xf75deddb :  test   eax,eax ;<
0xf75deddd :  jne    0xf75dee50 

在前面的代码中提到的中断位置,$eax 中将会存放 free hook 的地址。

现在进行一个 fast bin 攻击

  • 首先发现可以在 __free_hook 位置处理大小为 200 的快速 chunks
  • 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 的快速 chunk,就可以覆盖一个将被执行的函数指针。
  • 为此,创建一个大小为 0xfc 的新 chunk,并用该指针调用合并函数两次,这样我们就可以在快速 bin 中获得一个大小为 0xfc*2 = 0x1f8 的已释放 chunk 的指针。
  • 然后,在这个 chunk 中调用编辑函数,将这个快速 bin 的 fd 地址修改为指向之前的 __free_hook 函数。
  • 接着,创建一个大小为 0x1f8 的 chunk,从快速 bin 中检索之前无用的 chunk,因此再创建一个大小为 0x1f8 的 chunk,以在 __free_hook 中获取一个快速 bin chunk,并用 system 函数的地址覆盖它。
  • 最后,释放一个包含字符串 /bin/sh\x00 的 chunk,调用删除函数,触发 __free_hook 函数,该函数将 /bin/sh\x00 作为参数指向 system。

参考文献

tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)

支持 HackTricks