从DAS暑期挑战赛的一道题来理解largebinattack的攻击流程
字数 1319 2025-08-22 12:23:00

Large Bin Attack 攻击技术详解

一、Large Bin Attack 概述

Large Bin Attack 是一种针对 glibc 堆管理器中 large bin 机制的利用技术,通过精心构造 large bin 中的 chunk 链表,可以实现向任意地址写入堆地址的攻击效果。

1.1 技术背景

在 glibc 2.30 及以后版本中,引入了两个新的检查来防止传统的 large bin attack:

Check 1:
if (__glibc_unlikely (fwd->bk_nextsize->fd_nextsize != fwd))
    malloc_printerr ("malloc(): largebin double linked list corrupted (nextsize)");

Check 2:
if (bck->fd != fwd)
    malloc_printerr ("malloc(): largebin double linked list corrupted (bk)");

尽管如此,仍然存在一条路径可以绕过这些检查实现 large bin attack。

二、Large Bin Attack 原理

2.1 攻击条件

  1. 能够分配和释放 large bin 大小的 chunk
  2. 能够修改 free chunk 的 bk_nextsize 指针(通常通过 UAF 或其他漏洞)
  3. 能够控制 chunk 的分配和释放顺序

2.2 攻击流程

  1. 分配两个 large bin 大小的 chunk(chunk0 和 chunk2),chunk0 比 chunk2 大
  2. 释放 chunk0 并将其放入 large bin
  3. 释放 chunk2 使其进入 unsorted bin
  4. 修改 chunk0 的 bk_nextsize 指针为目标地址-0x20
  5. 分配一个大于 chunk2 的 chunk,将 chunk2 放入 large bin
  6. 利用 large bin 插入机制将 chunk2 的地址写入目标位置

2.3 关键代码分析

if ((unsigned long) (size) < (unsigned long) chunksize_nomask (bck->bk)){
    fwd = bck;
    bck = bck->bk;
    victim->fd_nextsize = fwd->fd;
    victim->bk_nextsize = fwd->fd->bk_nextsize;
    fwd->fd->bk_nextsize = victim->bk_nextsize->fd_nextsize = victim;
}

当新插入的 chunk 小于当前链表中最小的 chunk 时,glibc 不会检查 chunk 的 bk_nextsize 指针,从而可以利用这个漏洞实现任意地址写入。

三、实际案例分析:magic_book

3.1 题目分析

题目来自 BUUCTF 2024 七月暑期挑战赛的 magic_book,主要功能包括:

  1. 创建 book(最多 6 个)
  2. 删除 book
  3. 编辑 book

沙箱保护禁用了 execve 系统调用,只能使用 ORW 方式读取 flag。

3.2 漏洞点

  1. edit 函数存在栈溢出漏洞
  2. delete 函数存在 UAF 漏洞,可以修改 free chunk 的 bk_nextsize 指针

3.3 利用思路

  1. 利用 large bin attack 修改 book 变量的大小,扩大栈溢出范围
  2. 通过栈溢出构造 ROP 链实现 ORW

3.4 EXP 关键部分解析

# 构造 large bin attack
add(0x450) #0
add(0x98)  #1
add(0x430) #2
add(0x98)  #3

dele1(0)
add(0x460) #4

# 修改 chunk0 的 bk_nextsize 为目标地址-0x20
dele2(2,0,b'a'*0x10+p64(target_addr-0x20))

# 触发 large bin attack
add(0x460)

四、防御措施

  1. 及时更新 glibc 版本
  2. 避免使用存在漏洞的堆管理函数
  3. 实现严格的输入验证和边界检查
  4. 使用安全的内存管理实践

五、攻击应用场景

  1. House of Banana
  2. House of Apple 系列攻击
  3. tcache_mp 结构体攻击
  4. 其他需要任意地址写入的攻击场景

六、技术总结

Large Bin Attack 是一种高级堆利用技术,虽然 glibc 2.30 后增加了防护措施,但在特定条件下仍然可以利用。理解 large bin 的管理机制和检查逻辑是成功利用的关键。在实际漏洞利用中,通常需要结合其他漏洞(如 UAF、栈溢出等)才能实现完整的攻击链。

Large Bin Attack 攻击技术详解 一、Large Bin Attack 概述 Large Bin Attack 是一种针对 glibc 堆管理器中 large bin 机制的利用技术,通过精心构造 large bin 中的 chunk 链表,可以实现向任意地址写入堆地址的攻击效果。 1.1 技术背景 在 glibc 2.30 及以后版本中,引入了两个新的检查来防止传统的 large bin attack: 尽管如此,仍然存在一条路径可以绕过这些检查实现 large bin attack。 二、Large Bin Attack 原理 2.1 攻击条件 能够分配和释放 large bin 大小的 chunk 能够修改 free chunk 的 bk_ nextsize 指针(通常通过 UAF 或其他漏洞) 能够控制 chunk 的分配和释放顺序 2.2 攻击流程 分配两个 large bin 大小的 chunk(chunk0 和 chunk2),chunk0 比 chunk2 大 释放 chunk0 并将其放入 large bin 释放 chunk2 使其进入 unsorted bin 修改 chunk0 的 bk_ nextsize 指针为目标地址-0x20 分配一个大于 chunk2 的 chunk,将 chunk2 放入 large bin 利用 large bin 插入机制将 chunk2 的地址写入目标位置 2.3 关键代码分析 当新插入的 chunk 小于当前链表中最小的 chunk 时,glibc 不会检查 chunk 的 bk_ nextsize 指针,从而可以利用这个漏洞实现任意地址写入。 三、实际案例分析:magic_ book 3.1 题目分析 题目来自 BUUCTF 2024 七月暑期挑战赛的 magic_ book,主要功能包括: 创建 book(最多 6 个) 删除 book 编辑 book 沙箱保护禁用了 execve 系统调用,只能使用 ORW 方式读取 flag。 3.2 漏洞点 edit 函数存在栈溢出漏洞 delete 函数存在 UAF 漏洞,可以修改 free chunk 的 bk_ nextsize 指针 3.3 利用思路 利用 large bin attack 修改 book 变量的大小,扩大栈溢出范围 通过栈溢出构造 ROP 链实现 ORW 3.4 EXP 关键部分解析 四、防御措施 及时更新 glibc 版本 避免使用存在漏洞的堆管理函数 实现严格的输入验证和边界检查 使用安全的内存管理实践 五、攻击应用场景 House of Banana House of Apple 系列攻击 tcache_ mp 结构体攻击 其他需要任意地址写入的攻击场景 六、技术总结 Large Bin Attack 是一种高级堆利用技术,虽然 glibc 2.30 后增加了防护措施,但在特定条件下仍然可以利用。理解 large bin 的管理机制和检查逻辑是成功利用的关键。在实际漏洞利用中,通常需要结合其他漏洞(如 UAF、栈溢出等)才能实现完整的攻击链。