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落入第二批处理,使用已知密钥加密

利用步骤

  1. 发送大量padding触发xargs拆分(约65500个"A ")
  2. 在padding后插入已知密钥(如00112233445566778899aabbccddeeff
  3. 获取最后一批加密结果,用已知密钥解密

关键技术点

# 关键解密代码
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代码注入

  1. 使用官方Sloth PoW求解器通过验证
  2. 检测到C代码后服务端会编译执行
  3. 构造恶意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库预测未来随机数

攻击流程

  1. 收集624个server_seed值
  2. 使用RandCrack恢复状态
  3. 预测后续随机数控制游戏结果

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参赛者提供了全面的技术参考。

 全屏