第三届阿里云CTF官方Writeup
字数 2537 2025-08-29 08:30:30
阿里云CTF第三届官方Writeup深度解析
目录
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编写:
# SPIM提供的syscall调用号在$v0寄存器 # open/read/write调用号分别为13/14/15 # 参数依次存储在$a0/$a1/$a2
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返回
完整利用:
// 构造两个Job: A和B
// Job A的main.rs作为library
// Job B的lib.path指向Job A的main.rs
// 运行Job B实现RCE
Jtools
漏洞利用链:
- 利用
com.feilong.core.util.comparator.PropertyComparator的compare方法触发getter调用 - 通过动态代理触发MapProxy的invoke
- 到达BeanConverter的JDK二次反序列化点绕过黑名单
POC:
// 构造特定序列化数据
// 利用链触发后写入flag到/tmp/desc.txt
Espresso Coffee
Continuation API漏洞:
-
漏洞原理:
ContinuationImpl的stackFrameHead字段记录了调用栈信息- 通过修改该字段可以劫持控制流
-
利用方法:
- 修改
FrameRecord结构的next、method、pointers等字段 - 构造ROP链实现RCE
- 修改
关键Gadget:
// sun.print.UnixPrintJob.PrinterSpooler#run方法
// 包含Runtime.exec调用
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类型 - 导致整数溢出问题
触发方法:
// 构造特定表达式触发整数溢出
// 例如使用basis vector中包含2或-2的bool function
flag-LS
题目分析:
- 实现.flag文件的Language Server Extension
- 对内容进行base58、翻转、凯撒密码处理
- 凯撒密码偏移从13开始每次+1
解密方法:
- 尝试三种算法分别解密
- 根据md5第一个字符验证解密正确性
- 爆破凯撒密码最终偏移量
easy-cuda-rev
解题要点:
- 学习PTX汇编和CUDA编程模型
- 分析6个加密过程的中间结果
- 逆向最后一个加密过程的PTX汇编
- 实现CUDA解题脚本
关键步骤:
- 使用CUDA开发包的binutils工具
- 对比输入输出分析算法
- 实现并行解密程序
总结
本届阿里云CTF涵盖了多个安全领域的高级技术点,包括:
- 内核漏洞利用
- 编译器/模拟器漏洞
- Web应用安全
- 密码学分析
- 逆向工程
每个题目都设计精巧,需要选手具备扎实的基础知识和创新的解题思路。通过分析这些writeup,可以深入理解现代安全攻防的前沿技术。