2025春秋杯冬季赛pwn方向题解
字数 1814 2025-08-22 12:23:30

2025春秋杯冬季赛PWN方向题解教学文档

1. bypass题目分析

漏洞点

  1. 信息泄露:当main函数中输入格式不正确时,会输出puts函数地址,泄露libc地址
  2. 特殊输入触发:输入长度为4且内容为\x00时会进入compare函数
  3. compare函数漏洞
    • 两次read都是向buf读取且长度都是0x200
    • 第一次读取会复制到KEY中,第二次读取会复制到VAL中
    • VAL距离rbp超过0x200,但复制过程遇\x00停止,可以从buf一直复制到KEY,导致溢出
    • 需要注意rbp-2h是复制的index,需要合理控制i让复制过程正确进行

利用方法

  • 利用信息泄露获取libc地址
  • 通过精心构造的输入触发compare函数中的溢出漏洞
  • 控制程序流执行ROP链

2. gender_simulation题目分析

漏洞点

  1. 信息泄露:菜单里直接给出了libc地址
  2. 输入劫持:在输入"2 2"后再输入可以直接劫持程序流
  3. 后门函数:性别为"购物袋"时存在栈溢出漏洞

利用方法

  • 直接利用栈溢出写ROP链执行system('/bin/sh')

3. riya题目分析

漏洞点

  • 输入"n"直接跳到LABEL_10送shell

利用方法

  • 直接输入"n"即可获取shell

4. toys题目分析

漏洞点

  1. 栈溢出:存在栈溢出漏洞
  2. gadget限制:缺少pop_rdi_ret等常用gadgets
  3. 输出限制:程序中的puts输出的都是rodata段的数据

利用思路

  1. 泄露libc地址
    • strlen_len的参数是rbp-0x80
    • 修改strlen_got为puts_plt
    • 在rbp-0x80布置libc地址
  2. 修改strlen_got的方法
    • 利用fgets向rbp-0x80的位置写
    • 修改rbp为strlen_got+0x80
    • 再用fgets输入覆盖strlen_got为puts_plt
  3. 栈迁移
    • 不能直接迁移到got表(会覆盖有用地址)
    • 需要迁移到程序段高地址写ROP链

EXP分析

  1. 第一次输入:

    p = b'\x00' * 0x80 + p64(got_addr + 0x800) + p64(main)
    

    设置rbp = got + 0x800

  2. 第二次输入:

    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

  3. 第三次输入:

    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

程序流控制

  1. leave_ret迁移到got_addr+0x818,执行main
  2. 两次pop rbp后rbp变成strlen_got+0x80
  3. fgets向rbp-0x80(strlen_got)读,发送p64(puts_plt)修改strlen_got
  4. leave_ret迁移到rbp+8=got_addr+0x828=>strlen
  5. 执行main中的strlen(实际是puts),泄露setvbuf_got
  6. 最后ret是leave_ret再次迁移到main
  7. 最后一次利用栈溢出写ROP链执行system('/bin/sh')

5. rogue_like题目分析

三次选择机制

  1. 第一次选择武器

    • case 1: 设置libc中任意64位地址为0
    • case 2: 写libc中任意地址一个byte
    • case 3: 泄露/proc/self/maps中的地址
  2. 第二次选择祝福

    • case 1: 会崩溃
    • case 2和3: 给任意地址加上5以内的值
  3. 第三次选择挑战

    • case 1: 溢出0x10
    • case 2: 输出0x120后输入0xf0,无溢出
    • case 3: 两次read,一次刚好到rbp,存在栈的off-by-null

利用思路

  1. 绕过canary

    • 第一次选1,改tls中的canary为0
    • 第二次选2,让got表中的alarm+5得到syscall
    • 第三次选3,利用第二次read控制rax执行syscall
  2. 执行ROP

    • 程序中已有/bin/sh
    • 组合三次选择来绕过canary并执行ROP

总结

本次比赛中的PWN题目主要考察了以下技术点:

  1. 信息泄露技术(puts地址、/proc/self/maps等)
  2. 栈溢出漏洞利用
  3. GOT表劫持技术
  4. 栈迁移技术
  5. Canary绕过技术
  6. 特殊输入触发漏洞
  7. ROP链构造

每道题目都有其独特的利用思路,需要结合题目提供的功能和限制条件来设计利用链。特别是toys题目,在没有常用gadgets的情况下,通过巧妙的栈迁移和GOT表修改实现了利用,展示了高级的漏洞利用技术。

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分析 第一次输入: 设置rbp = got + 0x800 第二次输入: 设置rbp = got + 0x100 第三次输入: 设置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表修改实现了利用,展示了高级的漏洞利用技术。