第三届阿里云CTF官方Writeup
字数 2537 2025-08-29 08:30:30

阿里云CTF第三届官方Writeup深度解析

目录

  1. Pwn类题目解析
  2. Web类题目解析
  3. Crypto类题目解析
  4. Misc类题目解析
  5. Reverse类题目解析

Pwn类题目解析

beebee

漏洞分析:

  1. 内核中添加了一个存在漏洞的函数bpf_aliyunctf_xor_proto
  2. arg3_type被错误地设置为MEM_RDONLY,导致可以修改只读映射
  3. check_mem_access()中存在寄存器值不一致的问题

利用方法:

  1. 利用KASLR关闭的特性
  2. 适配bpf_skb_load_bytes()来破坏栈结构
  3. 最终获取flag

broken_compiler

题目概述:

  • 实现了一个C语言子集编译器,将用户程序编译为MIPS汇编
  • 使用SPIM运行编译后的代码

漏洞利用:

  1. 漏洞点:

    • 对struct类型返回值的处理不当
    • struct类型的struct字段处理不当
  2. 利用方法:

    • 通过stack use-after-scope实现任意地址写入
    • 劫持返回地址到shellcode区域
    • 使用shellcode进行open-read-write操作输出flag
  3. Shellcode编写:

    # SPIM提供的syscall调用号在$v0寄存器
    # open/read/write调用号分别为13/14/15
    # 参数依次存储在$a0/$a1/$a2
    

broken_simulator

利用步骤:

  1. 泄漏SPIM基址:

    • 通过读取/proc/self/maps泄漏程序基址
  2. 利用类型混淆漏洞:

    • 通过read syscall构造虚假的instruction指针
    • 实现任意地址读
  3. 实现任意地址free:

    • 伪造指令指针后写入内容实现任意地址free
    • 结合任意地址读和任意地址free实现任意地址写
  4. 实现任意shellcode执行:

    • 劫持GOT表
    • 修改内存权限为rwx
    • 布局shellcode并执行

Web类题目解析

Rust Action

漏洞分析:

  1. 配置文件注入:

    • route::upload_job直接使用format宏格式化Cargo.toml
    • 可通过workflow.yaml的description字段注入配置
  2. 利用方法:

    • 上传两个Job,利用lib.path字段跨目录引用
    • 通过覆盖cargo命令将flag字符作为exit code返回

完整利用:

// 构造两个Job: A和B
// Job A的main.rs作为library
// Job B的lib.path指向Job A的main.rs
// 运行Job B实现RCE

Jtools

漏洞利用链:

  1. 利用com.feilong.core.util.comparator.PropertyComparator的compare方法触发getter调用
  2. 通过动态代理触发MapProxy的invoke
  3. 到达BeanConverter的JDK二次反序列化点绕过黑名单

POC:

// 构造特定序列化数据
// 利用链触发后写入flag到/tmp/desc.txt

Espresso Coffee

Continuation API漏洞:

  1. 漏洞原理:

    • ContinuationImplstackFrameHead字段记录了调用栈信息
    • 通过修改该字段可以劫持控制流
  2. 利用方法:

    • 修改FrameRecord结构的nextmethodpointers等字段
    • 构造ROP链实现RCE

关键Gadget:

// sun.print.UnixPrintJob.PrinterSpooler#run方法
// 包含Runtime.exec调用

Crypto类题目解析

OhMyDH

题目分析:

  • 实现CSIDH群组行为在四元代数下的实现
  • 已知O₀, O₁=a₁⋆O₀, O₂=a₂⋆O₀,计算(a₁a₂)⋆O₀

解决方法:

  1. 计算连接理想I = span{ab | a∈O₁, b∈O₂}
  2. 在Z[√-p]下找到I的嵌入I'
  3. 利用可交换性质还原目标order

LinearCasino

McEliece框架分析:

  • (U,U+V)-Codes在特定参数下的可区分性
  • 区分SGP中G是否为随机F₂矩阵或[U U+V]

区分方法:

  1. 计算G⊥⊥ = [U⊥⊥ V⊥⊥; V⊥⊥]
  2. dim(G∩G⊥⊥) = 10大概率成立
  3. 或通过计算C·C^T观察秩

PRFCasino

漏洞利用:

  1. 观察T+T<<<20结构的特殊性
  2. 利用模17的性质进行区分
  3. 构造特定输入观察输出分布

Misc类题目解析

softHash

题目要求:

  1. 构造填充使"do you know..."和"give me the..."的hash差异≤6bit
  2. 提交6个不同样本
  3. 两个stage(包含/不包含special token)

解决方法:

  1. 使用GCG(Gradient-based Candidate Generation)算法
  2. 设计合适的loss函数(Dice loss + l2 loss)
  3. 初始化adversarial prefix并迭代优化

Gacha Game

漏洞分析:

  1. 漏洞一:

    • merge指令未检查character1和character2是否为同一账户
    • 导致可以无限升级角色不消耗资源
  2. 漏洞二:

    • 在admin创建地牢前向boss地址转账
    • 导致create_account失败,直接满足flag条件

利用方法:

  1. 利用漏洞一升级角色
  2. 计算boss地址并提前转账
  3. 触发地牢生成失败直接获取flag

Reverse类题目解析

mba

漏洞分析:

  1. mba_tactic.cppcoeff_type为long long
  2. 但计算basis_comb时使用int类型
  3. 导致整数溢出问题

触发方法:

// 构造特定表达式触发整数溢出
// 例如使用basis vector中包含2或-2的bool function

flag-LS

题目分析:

  1. 实现.flag文件的Language Server Extension
  2. 对内容进行base58、翻转、凯撒密码处理
  3. 凯撒密码偏移从13开始每次+1

解密方法:

  1. 尝试三种算法分别解密
  2. 根据md5第一个字符验证解密正确性
  3. 爆破凯撒密码最终偏移量

easy-cuda-rev

解题要点:

  1. 学习PTX汇编和CUDA编程模型
  2. 分析6个加密过程的中间结果
  3. 逆向最后一个加密过程的PTX汇编
  4. 实现CUDA解题脚本

关键步骤:

  1. 使用CUDA开发包的binutils工具
  2. 对比输入输出分析算法
  3. 实现并行解密程序

总结

本届阿里云CTF涵盖了多个安全领域的高级技术点,包括:

  1. 内核漏洞利用
  2. 编译器/模拟器漏洞
  3. Web应用安全
  4. 密码学分析
  5. 逆向工程

每个题目都设计精巧,需要选手具备扎实的基础知识和创新的解题思路。通过分析这些writeup,可以深入理解现代安全攻防的前沿技术。

阿里云CTF第三届官方Writeup深度解析 目录 Pwn类题目解析 Web类题目解析 Crypto类题目解析 Misc类题目解析 Reverse类题目解析 Pwn类题目解析 beebee 漏洞分析 : 内核中添加了一个存在漏洞的函数 bpf_aliyunctf_xor_proto arg3_type 被错误地设置为 MEM_RDONLY ,导致可以修改只读映射 在 check_mem_access() 中存在寄存器值不一致的问题 利用方法 : 利用KASLR关闭的特性 适配 bpf_skb_load_bytes() 来破坏栈结构 最终获取flag broken_ compiler 题目概述 : 实现了一个C语言子集编译器,将用户程序编译为MIPS汇编 使用SPIM运行编译后的代码 漏洞利用 : 漏洞点 : 对struct类型返回值的处理不当 struct类型的struct字段处理不当 利用方法 : 通过stack use-after-scope实现任意地址写入 劫持返回地址到shellcode区域 使用shellcode进行open-read-write操作输出flag Shellcode编写 : broken_ simulator 利用步骤 : 泄漏SPIM基址 : 通过读取 /proc/self/maps 泄漏程序基址 利用类型混淆漏洞 : 通过read syscall构造虚假的instruction指针 实现任意地址读 实现任意地址free : 伪造指令指针后写入内容实现任意地址free 结合任意地址读和任意地址free实现任意地址写 实现任意shellcode执行 : 劫持GOT表 修改内存权限为rwx 布局shellcode并执行 Web类题目解析 Rust Action 漏洞分析 : 配置文件注入 : route::upload_job 直接使用format宏格式化Cargo.toml 可通过workflow.yaml的description字段注入配置 利用方法 : 上传两个Job,利用lib.path字段跨目录引用 通过覆盖cargo命令将flag字符作为exit code返回 完整利用 : Jtools 漏洞利用链 : 利用 com.feilong.core.util.comparator.PropertyComparator 的compare方法触发getter调用 通过动态代理触发MapProxy的invoke 到达BeanConverter的JDK二次反序列化点绕过黑名单 POC : Espresso Coffee Continuation API漏洞 : 漏洞原理 : ContinuationImpl 的 stackFrameHead 字段记录了调用栈信息 通过修改该字段可以劫持控制流 利用方法 : 修改 FrameRecord 结构的 next 、 method 、 pointers 等字段 构造ROP链实现RCE 关键Gadget : Crypto类题目解析 OhMyDH 题目分析 : 实现CSIDH群组行为在四元代数下的实现 已知O₀, O₁=a₁⋆O₀, O₂=a₂⋆O₀,计算(a₁a₂)⋆O₀ 解决方法 : 计算连接理想I = span{ab | a∈O₁, b∈O₂} 在Z[ √-p ]下找到I的嵌入I' 利用可交换性质还原目标order LinearCasino McEliece框架分析 : (U,U+V)-Codes在特定参数下的可区分性 区分SGP中G是否为随机F₂矩阵或[ U U+V ] 区分方法 : 计算G⊥⊥ = [ U⊥⊥ V⊥⊥; V⊥⊥ ] dim(G∩G⊥⊥) = 10大概率成立 或通过计算C·C^T观察秩 PRFCasino 漏洞利用 : 观察T+T<< <20结构的特殊性 利用模17的性质进行区分 构造特定输入观察输出分布 Misc类题目解析 softHash 题目要求 : 构造填充使"do you know..."和"give me the..."的hash差异≤6bit 提交6个不同样本 两个stage(包含/不包含special token) 解决方法 : 使用GCG(Gradient-based Candidate Generation)算法 设计合适的loss函数(Dice loss + l2 loss) 初始化adversarial prefix并迭代优化 Gacha Game 漏洞分析 : 漏洞一 : merge 指令未检查character1和character2是否为同一账户 导致可以无限升级角色不消耗资源 漏洞二 : 在admin创建地牢前向boss地址转账 导致 create_account 失败,直接满足flag条件 利用方法 : 利用漏洞一升级角色 计算boss地址并提前转账 触发地牢生成失败直接获取flag Reverse类题目解析 mba 漏洞分析 : mba_tactic.cpp 中 coeff_type 为long long 但计算 basis_comb 时使用int类型 导致整数溢出问题 触发方法 : flag-LS 题目分析 : 实现.flag文件的Language Server Extension 对内容进行base58、翻转、凯撒密码处理 凯撒密码偏移从13开始每次+1 解密方法 : 尝试三种算法分别解密 根据md5第一个字符验证解密正确性 爆破凯撒密码最终偏移量 easy-cuda-rev 解题要点 : 学习PTX汇编和CUDA编程模型 分析6个加密过程的中间结果 逆向最后一个加密过程的PTX汇编 实现CUDA解题脚本 关键步骤 : 使用CUDA开发包的binutils工具 对比输入输出分析算法 实现并行解密程序 总结 本届阿里云CTF涵盖了多个安全领域的高级技术点,包括: 内核漏洞利用 编译器/模拟器漏洞 Web应用安全 密码学分析 逆向工程 每个题目都设计精巧,需要选手具备扎实的基础知识和创新的解题思路。通过分析这些writeup,可以深入理解现代安全攻防的前沿技术。