justCTF2025-Pwn部分WP
字数 1734 2025-09-01 11:25:54

justCTF2025 Pwn题目分析与利用技术详解

shellcode_printer题目分析

程序功能与漏洞点

  1. 程序使用mmap分配一块可读可写可执行的内存区域(addr)
  2. 程序通过stream打开一个"黑洞文件"
  3. 使用循环将用户输入通过fprintf写入该文件
  4. 关键漏洞:fprintf存在格式化字符串漏洞
  5. addr每次循环后自增2

利用思路

  1. 利用格式化字符串的%c%hn一次性向addr区域写入2字节shellcode
  2. addr区域先写入read调用,再写入完整shellcode
  3. 利用addr自增特性,使用jmp loop(\xee\xfe)短跳使RIP回到addr起始地址
  4. 当执行到read的shellcode时,RSI正好指向syscall的下一个地址,可完成shellcode续写

EXP关键点

  • 需要爆破,成功率约为1/8
  • 使用格式化字符串漏洞构造特定字节写入
  • 利用短跳实现循环执行

prospector题目分析

程序功能与漏洞点

  1. 使用mmap申请可读可写的地址区域
  2. sub_10FD函数存在223字节的栈溢出
  3. 可覆盖v4控制第二次输入失败,构造无限循环和任意地址写
  4. sub_1075中的sub_1000可泄漏mmap申请地址的内容

利用思路

  1. 泄漏的地址为mmap申请地址前四个字节相加去掉最高字节
  2. 接收泄漏地址后还原最高字节并整除2得到mmap地址前4字节
  3. 通过GDB确定地址最后三位为0,只需爆破1字节
  4. mmap地址与ld-linux-x86-64.so.2偏移固定
  5. 利用ld-linux-x86-64.so.2中的ROP链劫持程序流

EXP关键点

  • 泄漏地址会在栈上造成破坏,需覆盖返回地址后固定位置为1
  • 不能通过原返回地址返回,需利用多层函数调用的栈结构
  • 劫持1字节返回到syscall附近位置
  • 控制RBP为mmap申请地址,利用第二次read写入数据控制寄存器

jctfcoin题目分析

程序功能与漏洞点

  1. 堆题目,sub_1753存在堆溢出可覆盖下一个chunk的size字段
  2. 可造成堆块吞并
  3. 程序加载了自定义libc但非必要
  4. add函数会额外增加0x20堆块大小

利用思路

  1. 申请大块中间夹2个小块的形式
  2. 修改第一个大块将4个堆块全部放入unsortbin
  3. 申请第一个大块大小的堆块,可在第一个小块中show出libc地址
  4. 将2个小块作为一个堆块申请出来,控制第二个小块的fd地址
  5. 泄漏heap基地址,使用tcachebin attack劫持__IO_list_all
  6. 最后攻击house of apple2实现getshell

EXP关键点

  • 远程和本地heap地址偏移可能相差0x30
  • 需要精确计算堆布局
  • 利用堆溢出修改关键size字段
  • 组合使用unsortbin和tcachebin技术

babyheap题目分析

程序功能与漏洞点

  1. delete_chunk中存在UAF漏洞
  2. 程序只能申请和使用0x30大小的堆块

利用思路

  1. 泄漏堆地址和key后攻击heap头或修改其他chunk的size
  2. 通过释放操作获得libc地址
  3. 获得libc地址和heap基地址后
  4. 劫持__IO_list_all并在堆上构造house of apple2

EXP关键点

  • 需要精确控制堆布局
  • 利用UAF泄漏关键信息
  • 使用house of apple2技术完成利用

通用技术总结

  1. 格式化字符串利用

    • 使用%hn等格式化字符实现精确内存写入
    • 结合程序特性构造循环执行
  2. 堆利用技术

    • 堆溢出修改size字段
    • unsortbin和tcachebin的组合利用
    • UAF漏洞的信息泄漏
    • house of apple2攻击技术
  3. 地址泄漏与计算

    • 通过部分泄漏信息还原完整地址
    • 爆破少量字节提高利用成功率
    • 固定偏移的计算与利用
  4. ROP链构造

    • 利用ld.so中的gadget
    • 栈破坏情况下的返回控制
    • 多层函数调用栈的利用

以上技术细节和利用方法在实际漏洞利用中需要根据具体环境进行调整,特别是地址计算和爆破部分需要充分考虑目标环境特性。

justCTF2025 Pwn题目分析与利用技术详解 shellcode_ printer题目分析 程序功能与漏洞点 程序使用 mmap 分配一块可读可写可执行的内存区域( addr ) 程序通过 stream 打开一个"黑洞文件" 使用循环将用户输入通过 fprintf 写入该文件 关键漏洞: fprintf 存在格式化字符串漏洞 addr 每次循环后自增2 利用思路 利用格式化字符串的 %c 和 %hn 一次性向 addr 区域写入2字节shellcode 在 addr 区域先写入 read 调用,再写入完整shellcode 利用 addr 自增特性,使用 jmp loop ( \xee\xfe )短跳使RIP回到 addr 起始地址 当执行到 read 的shellcode时,RSI正好指向 syscall 的下一个地址,可完成shellcode续写 EXP关键点 需要爆破,成功率约为1/8 使用格式化字符串漏洞构造特定字节写入 利用短跳实现循环执行 prospector题目分析 程序功能与漏洞点 使用 mmap 申请可读可写的地址区域 sub_10FD 函数存在223字节的栈溢出 可覆盖 v4 控制第二次输入失败,构造无限循环和任意地址写 sub_1075 中的 sub_1000 可泄漏 mmap 申请地址的内容 利用思路 泄漏的地址为 mmap 申请地址前四个字节相加去掉最高字节 接收泄漏地址后还原最高字节并整除2得到 mmap 地址前4字节 通过GDB确定地址最后三位为0,只需爆破1字节 mmap 地址与 ld-linux-x86-64.so.2 偏移固定 利用 ld-linux-x86-64.so.2 中的ROP链劫持程序流 EXP关键点 泄漏地址会在栈上造成破坏,需覆盖返回地址后固定位置为1 不能通过原返回地址返回,需利用多层函数调用的栈结构 劫持1字节返回到 syscall 附近位置 控制RBP为 mmap 申请地址,利用第二次 read 写入数据控制寄存器 jctfcoin题目分析 程序功能与漏洞点 堆题目, sub_1753 存在堆溢出可覆盖下一个chunk的size字段 可造成堆块吞并 程序加载了自定义libc但非必要 add 函数会额外增加0x20堆块大小 利用思路 申请大块中间夹2个小块的形式 修改第一个大块将4个堆块全部放入unsortbin 申请第一个大块大小的堆块,可在第一个小块中show出libc地址 将2个小块作为一个堆块申请出来,控制第二个小块的fd地址 泄漏heap基地址,使用tcachebin attack劫持 __IO_list_all 最后攻击house of apple2实现getshell EXP关键点 远程和本地heap地址偏移可能相差0x30 需要精确计算堆布局 利用堆溢出修改关键size字段 组合使用unsortbin和tcachebin技术 babyheap题目分析 程序功能与漏洞点 delete_chunk 中存在UAF漏洞 程序只能申请和使用0x30大小的堆块 利用思路 泄漏堆地址和key后攻击heap头或修改其他chunk的size 通过释放操作获得libc地址 获得libc地址和heap基地址后 劫持 __IO_list_all 并在堆上构造house of apple2 EXP关键点 需要精确控制堆布局 利用UAF泄漏关键信息 使用house of apple2技术完成利用 通用技术总结 格式化字符串利用 : 使用 %hn 等格式化字符实现精确内存写入 结合程序特性构造循环执行 堆利用技术 : 堆溢出修改size字段 unsortbin和tcachebin的组合利用 UAF漏洞的信息泄漏 house of apple2攻击技术 地址泄漏与计算 : 通过部分泄漏信息还原完整地址 爆破少量字节提高利用成功率 固定偏移的计算与利用 ROP链构造 : 利用ld.so中的gadget 栈破坏情况下的返回控制 多层函数调用栈的利用 以上技术细节和利用方法在实际漏洞利用中需要根据具体环境进行调整,特别是地址计算和爆破部分需要充分考虑目标环境特性。