House of Orange

支持HackTricks

基本信息

代码

目标

  • 滥用 malloc_printerr 函数

要求

  • 覆盖顶部块大小

  • Libc 和堆泄漏

背景

此示例的评论中获取了一些必要的背景信息:

问题在于,在旧版本的 libc 中,当调用 malloc_printerr 函数时,它会遍历存储在 _IO_list_all 中的 _IO_FILE 结构的列表,并实际上在该结构中执行指令指针。 这种攻击将伪造一个我们将写入**_IO_list_all** 的假 _IO_FILE 结构,并导致 malloc_printerr 运行。 然后它将执行我们在_IO_FILE 结构的跳转表中存储的任何地址,我们将获得代码执行

攻击

攻击始于设法将顶部块置于未排序的 bin 中。这是通过使用大于当前顶部块大小但小于**mmp_.mmap_threshold(默认为 128K)的大小调用 malloc 来实现的,否则会触发 mmap 分配。每当修改顶部块大小时,重要的是确保顶部块 + 其大小是页面对齐的,并且顶部块的prev_inuse** 位始终设置。

要将顶部块置于未排序的 bin 中,首先分配一个块以创建顶部块,然后更改顶部块大小(使用分配块中的溢出),使得顶部块 + 大小prev_inuse 位设置为页面对齐。然后分配一个大于新顶部块大小的块。请注意,永远不会调用 free 来将顶部块放入未排序的 bin 中。

旧的顶部块现在位于未排序的 bin 中。假设我们可以从中读取数据(可能是由于导致溢出的漏洞),则可以从中泄漏 libc 地址并获取**_IO_list_all** 的地址。

通过滥用溢出将 topChunk->bk->fwd = _IO_list_all - 0x10 写入,执行未排序的 bin 攻击。当分配新块时,旧的顶部块将被拆分,并且指针将被写入**_IO_list_all**。

下一步涉及将旧的顶部块的大小缩小以适应小 bin,具体设置其大小为0x61。这有两个目的:

  1. 插入到 Small Bin 4:当 malloc 扫描未排序的 bin 并看到此块时,由于其较小的大小,它将尝试将其插入到小 bin 4 中。这使得该块最终位于小 bin 4 列表的头部,该位置是我们通过未排序的 bin 攻击在**_IO_list_all** 的块的 FD 指针的位置,因为我们通过未排序的 bin 攻击在**_IO_list_all** 中写入了一个接近的地址。

  2. 触发 Malloc 检查:此块大小调整将导致 malloc 执行内部检查。当它检查虚假前向块的大小时,该大小将为零,触发错误并调用 malloc_printerr

对小 bin 的操作将允许您控制块的前向指针。与**_IO_list_all** 的重叠用于伪造一个假的**_IO_FILE** 结构。该结构经过精心设计,包括将 _IO_write_base_IO_write_ptr 设置为在 libc 中通过内部检查的值。此外,在假结构内创建了一个跳转表,其中将指令指针设置为可以执行任意代码(例如 system 函数)的地址。

总结该技术的其余部分:

  • 缩小旧的顶部块:将旧的顶部块的大小调整为0x61,以适应小 bin。

  • 设置假的 _IO_FILE 结构:将旧的顶部块与当前位于未排序的 bin 中的假**_IO_FILE** 结构重叠,并适当设置字段以劫持执行流。

下一步涉及伪造一个与当前位于未排序的 bin 中的旧顶部块重叠的假**_IO_FILE** 结构。该结构的前几个字节经过精心设计,包括指向将执行的命令(例如 "/bin/sh")的指针。

在假**_IO_FILE** 结构中的关键字段,如 _IO_write_base_IO_write_ptr,设置为通过 libc 中的内部检查的值。此外,在假结构内创建了一个跳转表,其中将指令指针设置为可以执行任意代码的地址。通常,这将是 system 函数的地址或其他可以执行 shell 命令的函数的地址。

当调用 malloc 时,通过操纵**_IO_FILE** 结构触发代码执行,攻击达到高潮。这有效地允许执行任意代码,通常导致生成 shell 或执行其他恶意载荷。

攻击摘要:

  1. 设置顶部块:分配一个块并修改顶部块大小。

  2. 强制顶部块进入未排序的 bin:分配一个更大的块。

  3. 泄漏 libc 地址:使用漏洞从未排序的 bin 中读取数据。

  4. 执行未排序的 bin 攻击:使用溢出写入**_IO_list_all**。

  5. 缩小旧的顶部块:调整其大小以适应小 bin。

  6. 设置一个假的 _IO_FILE 结构:伪造一个假文件结构以劫持控制流。

  7. 触发代码执行:分配一个块以执行攻击并运行任意代码。

该方法利用堆管理机制、libc 信息泄漏和堆溢出来实现代码执行,而无需直接调用 free。通过精心设计假的**_IO_FILE** 结构并将其放置在正确位置,攻击可以在标准内存分配操作期间劫持控制流。这使得执行任意代码成为可能,可能导致生成 shell 或其他恶意活动。

参考

支持 HackTricks

Last updated