WWW2Exec - __malloc_hook & __free_hook
Last updated
Last updated
学习和实践 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE) 学习和实践 GCP 黑客技术:HackTricks 培训 GCP 红队专家 (GRTE)
正如你可以在 官方 GNU 网站 上看到的,变量 __malloc_hook
是一个指针,指向 每当调用 malloc()
时将被调用的函数的地址,该地址 存储在 libc 库的数据段中。因此,如果这个地址被覆盖为一个 One Gadget,例如,当调用 malloc
时,One Gadget 将被调用。
要调用 malloc,可以等待程序调用它,或者通过 调用 printf("%10000$c")
,这会分配过多的字节,使得 libc
调用 malloc 在堆中分配它们。
有关 One Gadget 的更多信息,请参见:
请注意,GLIBC >= 2.34 的钩子已被禁用。在现代 GLIBC 版本中可以使用其他技术。请参见:https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md。
这在页面中的一个示例中被滥用,滥用了一次快速 bin 攻击,之后又滥用了一次未排序 bin 攻击:
如果二进制文件具有符号,可以使用以下命令找到 __free_hook
的地址:
在这篇文章中,你可以找到如何在没有符号的情况下定位 free hook 地址的逐步指南。总结一下,在 free 函数中:
在前面代码中提到的中断位置,$eax
中将会存放 free hook 的地址。
现在进行一个 fast bin attack:
首先发现可以在 __free_hook
位置处理 大小为 200 的快速块:
$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
的块,从快速块中检索之前无用的块,因此再创建一个大小为 0x1f8
的块,以在 __free_hook
中获取一个快速块,并用 system
函数的地址覆盖它。
最后,释放一个包含字符串 /bin/sh\x00
的块,调用删除函数,触发 __free_hook
函数,该函数将 /bin/sh\x00
作为参数指向 system。
学习与实践 AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) 学习与实践 GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)