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

  1. unsorted bin attack - 把main_arena附近的内容写进去
  2. large_bin attack - 写一个堆地址进去
  3. 其他攻击方式

4. 攻击流程示例

以2.27版本为例的攻击步骤:

  1. 分配一个大小合适的chunk(根据目标地址与main_arena.fastbinsY的距离计算)
  2. 泄露libc地址
  3. 利用unsorted bin attack修改global_max_fast
  4. 释放大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. 攻击步骤

  1. 泄露libc地址

    • 分配并释放一个大chunk,通过UAF泄露libc地址
  2. House Of Corrosion准备

    • 计算printf_arginfo_tableprintf_function_table与main_arena的偏移
    • 分配对应大小的chunk
  3. 修改global_max_fast

    • 使用unsorted bin attack修改global_max_fast
  4. 触发House Of Corrosion

    • 释放特定chunk,使printf_arginfo_table指向我们控制的chunk
  5. 布置payload

    • 在chunk中布置数据,使得__printf_arginfo_table[88](对应%X)指向one_gadget
  6. 绕过保护

    • 释放另一个chunk使printf_function_table不为0

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

四、防御与检测

  1. House Of Corrosion防御

    • 检查fastbin chunk大小是否合法
    • 加强对global_max_fast的保护
  2. House Of Husk防御

    • 检查格式化字符串是否合法
    • 保护__printf_arginfo_table__printf_function_table
  3. 通用防御

    • 启用FORTIFY_SOURCE
    • 使用最新的glibc版本
    • 启用ASLR和PIE

五、技术要点总结

  1. House Of Corrosion关键点

    • 精确计算目标地址对应的chunk大小
    • 可靠地修改global_max_fast
    • 理解fastbin数组的索引机制
  2. House Of Husk关键点

    • 确定自定义格式化字符的spec值
    • 确保printf_function_table不为0
    • 精确控制__printf_arginfo_table的内容
  3. 交叉利用优势

    • House Of Corrosion提供任意地址写能力
    • House Of Husk提供稳定的控制流劫持
    • 两者结合可绕过更多保护机制
House Of Corrosion与House Of Husk交叉利用技术详解 一、House Of Corrosion攻击技术 1. 基本原理 House Of Corrosion是一种通过攻击 main_arena 结构体中的 fastbinY 数组来实现利用的攻击技术。 main_arena 结构体关键部分: 2. 攻击核心机制 fastbinY 数组基于 &main_arena.fastbinsY 的值进行偏移 通过数组溢出可以写到 main_arena 下方的位置 计算目标地址对应chunk大小的公式: 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调用链分析 关键检查点: 4. 关键数据结构 __register_printf_specifier 函数注册自定义格式化字符: 三、交叉利用技术实战 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 触发House Of Corrosion : 释放特定chunk,使 printf_arginfo_table 指向我们控制的chunk 布置payload : 在chunk中布置数据,使得 __printf_arginfo_table[88] (对应%X)指向one_ gadget 绕过保护 : 释放另一个chunk使 printf_function_table 不为0 3. EXP关键代码解析 四、防御与检测 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提供稳定的控制流劫持 两者结合可绕过更多保护机制