UofTCTF 2026 部分wp
字数 2066
更新时间 2026-01-31 12:21:22
UofTCTF 2026 赛事题解教学文档
1. MISC 题型详解
1.1 Encryption Service
漏洞原理:AES-CBC加密服务存在xargs参数拆分漏洞
- 服务端使用
xargs调用加密脚本时,当参数总长度超过ARG_MAX限制会自动拆分执行 - 精心构造输入可使flag落入第二批处理,使用已知密钥加密
利用步骤:
- 发送大量padding触发xargs拆分(约65500个"A ")
- 在padding后插入已知密钥(如
00112233445566778899aabbccddeeff) - 获取最后一批加密结果,用已知密钥解密
关键技术点:
# 关键解密代码
iv = binascii.unhexlify(flag_enc_hex[:32])
ct = binascii.unhexlify(flag_enc_hex[32:])
cipher = AES.new(KNOWN_KEY_BYTES, AES.MODE_CBC, iv)
decrypted = cipher.decrypt(ct)
1.2 Guess_The_Number
侧信道攻击原理:利用短路求值和时间差异实现四叉搜索
- Python的
and/or运算符具有短路特性 - 构造昂贵计算表达式(如
2**(2**25))产生时间差异 - 每次查询可获得2比特信息(Yes/No × 快/慢)
查询构造策略:
- 将搜索区间[L,R]分为四段
- 设计表达式使得每段对应不同的输出和时间组合:
- [L,q1): True + 快
- [q1,q2): False + 快
- [q2,q3): True + 慢
- [q3,R]: False + 慢
1.3 reverse-wordle
约束求解方法:基于Wordle规则反向推导起始词
- 黄色格子:字母存在但位置错误
- 黑色格子:字母不存在或已被占用
- 对三个已知答案模式进行模式匹配
求解算法:
def yellow_mask(guess, answer):
# 先处理绿色正确位置
# 再根据剩余字母计数判断黄色位置
# 返回黄色位置的二进制掩码
结果:唯一满足条件的起始词是"squib"
1.4 vibe-code
漏洞利用链:PoW绕过 + C代码注入
- 使用官方Sloth PoW求解器通过验证
- 检测到C代码后服务端会编译执行
- 构造恶意C程序获得RCE:
#include <stdlib.h>
int main() { system("/bin/sh"); }
关键技巧:发送EOF(\x04)结束输入流
1.5 Lottery
命令注入漏洞:bash算术表达式注入
- 正则
^[0-9a-fA-F]+缺少结尾锚定$ let "g = 0x$guess"执行算术表达式- 利用
arr[$(cmd)]语法执行命令
盲注技术:使用sleep时间侧信道逐字符读取flag
- 构造条件使字符正确时触发sleep
- 通过响应时间差异判断字符内容
2. Forensic 题型
2.1 Baby Exfil
恶意软件分析:Python数据窃取脚本
- 遍历特定扩展名文件(.docx, .png, .jpeg, .jpg)
- 使用弱密钥异或加密:
G0G0Squ1d3Ncrypt10n - 将加密数据hex编码后上传
解密方法:
def xor_file(data, key):
return bytes(b ^ ord(key[i % len(key)]) for i, b in enumerate(data))
3. Crypto 题型
3.1 Gamblers_Fallac
MT19937预测攻击:状态恢复与输出预测
- Python random使用Mersenne Twister PRNG
- 内部状态624个32位值,获得连续输出可恢复状态
- 使用randcrack库预测未来随机数
攻击流程:
- 收集624个server_seed值
- 使用RandCrack恢复状态
- 预测后续随机数控制游戏结果
3.2 Leaked_d
RSA私钥泄露攻击:从d分解n
- 已知
e*d ≡ 1 mod φ(n) - 计算
k = e*d - 1 = r * s(s为奇数) - 通过随机基测试分解n
数学推导:
- 对随机g,计算
x = g^s mod n - 通过
gcd(x-1, n)有很大概率得到p或q
3.3 MT247/MT347
线性代数在密码学中的应用
- MT247:基于循环向量和可交换算子的多项式表示
- MT347:椭圆曲线离散对数问题的格攻击
关键技术:
- 有限域上的矩阵运算
- LLL格基约化算法
- 子群判定和特征值分析
3.4 UofT LFSR Labyrinth
滤波LFSR密码分析:SMT求解器攻击
- 48位LFSR + 非线性滤波函数
- 使用Z3求解器建立布尔约束系统
- 基于80位已知密钥流恢复初始状态
建模要点:
- 将LFSR状态位定义为Z3布尔变量
- 精确实现WG滤波器的代数正规形式
- 添加密钥流约束求解
4. Reverse 题型
4.1 Baby Flag Checker
动态分析技术:猴子补丁调试
- 挂钩
str.__eq__方法监控字符串比较 - 记录所有比较的字符串对
- 通过比较模式推断flag验证逻辑
关键技术代码:
def hooked_eq(self, other):
if isinstance(self, str) and isinstance(other, str):
print("COMPARE:", repr(self), repr(other))
return orig_eq(self, other)
str.__eq__ = hooked_eq
5. 通用解题技巧总结
5.1 侧信道攻击模式
- 时间侧信道:利用执行时间差异泄露信息
- 错误侧信道:通过错误消息差异获取信息
- 资源侧信道:内存、网络等资源使用模式分析
5.2 密码学漏洞模式
- 弱随机数生成器(PRNG)预测
- 密钥管理错误(硬编码、泄露)
- 实现逻辑漏洞(边界条件、异常处理)
5.3 逆向工程技术
- 动态插桩监控程序行为
- API挂钩拦截关键函数调用
- 约束求解自动化解题过程
本教学文档涵盖了UofTCTF 2026的主要题型和解题技术,重点突出了各类题目的核心漏洞原理和利用方法,为CTF参赛者提供了全面的技术参考。