2025春秋杯冬季赛pwn方向题解
字数 1814 2025-08-22 12:23:30
2025春秋杯冬季赛PWN方向题解教学文档
1. bypass题目分析
漏洞点
- 信息泄露:当main函数中输入格式不正确时,会输出puts函数地址,泄露libc地址
- 特殊输入触发:输入长度为4且内容为\x00时会进入compare函数
- compare函数漏洞:
- 两次read都是向buf读取且长度都是0x200
- 第一次读取会复制到KEY中,第二次读取会复制到VAL中
- VAL距离rbp超过0x200,但复制过程遇\x00停止,可以从buf一直复制到KEY,导致溢出
- 需要注意rbp-2h是复制的index,需要合理控制i让复制过程正确进行
利用方法
- 利用信息泄露获取libc地址
- 通过精心构造的输入触发compare函数中的溢出漏洞
- 控制程序流执行ROP链
2. gender_simulation题目分析
漏洞点
- 信息泄露:菜单里直接给出了libc地址
- 输入劫持:在输入"2 2"后再输入可以直接劫持程序流
- 后门函数:性别为"购物袋"时存在栈溢出漏洞
利用方法
- 直接利用栈溢出写ROP链执行system('/bin/sh')
3. riya题目分析
漏洞点
- 输入"n"直接跳到LABEL_10送shell
利用方法
- 直接输入"n"即可获取shell
4. toys题目分析
漏洞点
- 栈溢出:存在栈溢出漏洞
- gadget限制:缺少pop_rdi_ret等常用gadgets
- 输出限制:程序中的puts输出的都是rodata段的数据
利用思路
- 泄露libc地址:
- strlen_len的参数是rbp-0x80
- 修改strlen_got为puts_plt
- 在rbp-0x80布置libc地址
- 修改strlen_got的方法:
- 利用fgets向rbp-0x80的位置写
- 修改rbp为strlen_got+0x80
- 再用fgets输入覆盖strlen_got为puts_plt
- 栈迁移:
- 不能直接迁移到got表(会覆盖有用地址)
- 需要迁移到程序段高地址写ROP链
EXP分析
-
第一次输入:
p = b'\x00' * 0x80 + p64(got_addr + 0x800) + p64(main)设置rbp = got + 0x800
-
第二次输入:
p = b'\x00' * 0x80 + p64(got_addr + 0x100) + p64(main) + p64(strlen_got + 0x80) + p64(main) + p64(strlen_got + 0x98) + p64(strlen) + p64(strlen_got + 0x700) + p64(main)设置rbp = got + 0x100
-
第三次输入:
p = p64(0) + p64(got_addr + 0x820) + p64(leave_ret) + p64(0) + p64(got_addr + 0x830) + p64(leave_ret) p = p.ljust(0x80, b'\x00') + p64(got_addr + 0x810) + p64(leave_ret)设置rbp = got + 0x810
程序流控制
- leave_ret迁移到got_addr+0x818,执行main
- 两次pop rbp后rbp变成strlen_got+0x80
- fgets向rbp-0x80(strlen_got)读,发送p64(puts_plt)修改strlen_got
- leave_ret迁移到rbp+8=got_addr+0x828=>strlen
- 执行main中的strlen(实际是puts),泄露setvbuf_got
- 最后ret是leave_ret再次迁移到main
- 最后一次利用栈溢出写ROP链执行system('/bin/sh')
5. rogue_like题目分析
三次选择机制
-
第一次选择武器:
- case 1: 设置libc中任意64位地址为0
- case 2: 写libc中任意地址一个byte
- case 3: 泄露/proc/self/maps中的地址
-
第二次选择祝福:
- case 1: 会崩溃
- case 2和3: 给任意地址加上5以内的值
-
第三次选择挑战:
- case 1: 溢出0x10
- case 2: 输出0x120后输入0xf0,无溢出
- case 3: 两次read,一次刚好到rbp,存在栈的off-by-null
利用思路
-
绕过canary:
- 第一次选1,改tls中的canary为0
- 第二次选2,让got表中的alarm+5得到syscall
- 第三次选3,利用第二次read控制rax执行syscall
-
执行ROP:
- 程序中已有/bin/sh
- 组合三次选择来绕过canary并执行ROP
总结
本次比赛中的PWN题目主要考察了以下技术点:
- 信息泄露技术(puts地址、/proc/self/maps等)
- 栈溢出漏洞利用
- GOT表劫持技术
- 栈迁移技术
- Canary绕过技术
- 特殊输入触发漏洞
- ROP链构造
每道题目都有其独特的利用思路,需要结合题目提供的功能和限制条件来设计利用链。特别是toys题目,在没有常用gadgets的情况下,通过巧妙的栈迁移和GOT表修改实现了利用,展示了高级的漏洞利用技术。