从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 攻击条件
- 能够分配和释放 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 关键代码分析
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,主要功能包括:
- 创建 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 关键部分解析
# 构造 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)
四、防御措施
- 及时更新 glibc 版本
- 避免使用存在漏洞的堆管理函数
- 实现严格的输入验证和边界检查
- 使用安全的内存管理实践
五、攻击应用场景
- House of Banana
- House of Apple 系列攻击
- tcache_mp 结构体攻击
- 其他需要任意地址写入的攻击场景
六、技术总结
Large Bin Attack 是一种高级堆利用技术,虽然 glibc 2.30 后增加了防护措施,但在特定条件下仍然可以利用。理解 large bin 的管理机制和检查逻辑是成功利用的关键。在实际漏洞利用中,通常需要结合其他漏洞(如 UAF、栈溢出等)才能实现完整的攻击链。