2025-强网杯主赛道-WriteUp
字数 3162 2025-11-11 12:34:26
CTF竞赛WriteUp教学文档:强网杯主赛道解题思路与技巧
密码学(CRYPTO)篇
1. check-little ezran
解题思路
- 问题分析:该题目基于NTRU密码系统,观察到多项式\(x^n+1\)含有因子\(x+1\)。
- 关键发现:在模\(x+1\)下,由于\(x \equiv -1\),多项式可简化为系数正负交替相加。
- LLL算法应用:
- 在\(\frac{Z_q[x]}{x+1}\)环中,\(f\)和\(g_i\)模\(x+1\)后为小量。
- 使用LLL(Lenstra-Lenstra-Lovász)格基约减算法区分这些量。
- 后续步骤:
- 获得coin后,使用Mersenne Twister(MT)预测密钥。
技术要点
- NTRU特性利用:利用多项式环的特殊结构简化问题。
- 格基约减:LLL算法在密码分析中的典型应用场景。
2. sk
解题思路
- 加密形式分析:加密公式为\(\Sigma_i P_i \cdot (u \cdot pt^i \pmod{p})\),是公钥相关的整数环上线性组合。
- 规模差异利用:公钥与模数\(p\)规模差异显著,适合LLL直接求解。
- 概率性处理:由于成功率非100%,需多次运行算法。
- 私钥伪造:获知明文后,构造有效私钥解密(无额外检查机制)。
技术要点
- 线性代数攻击:利用公钥规模特性转化为线性求解问题。
- LLL的适用条件:模数与系数规模差异大时的典型处理方法。
杂项(MISC)篇
1. Personal Vault
- 方法:直接暴力搜索字符串"flag{"。
2. 谍影重重6.0
流量分析阶段
- 协议识别:UDP流量中包含RTP语音数据。
- 数据提取:
- Wireshark中启用RTP_UDP协议分析。
- 通过"电话 → RTP → RTP流"定位数据流。
- 导出音频流(Play Streams → 选择流 → Export from Cursor)。
音频处理阶段
- 音量增强:原始音频音量过小,需使用音频工具(如Audacity)进行增幅。
- 批量转换:编写脚本将pcap批量转为WAV格式并自动增益。
信息提取阶段
- AI语音转文字:使用语音识别工具转换音频内容。
- 关键数据发现:
- 发现数字串:651466314514271616614214660701456661601411451426071146666014214371656514214470
- 观察特征:仅含0-7数字,判断为八进制编码。
- 解码过程:
- 八进制转十六进制:5f3eb916bf08e610aeb09f60bc955bd8
- 解密7z压缩包获得音频和文本文件。
情报分析
- 地点:双鲤湖西岸南山茶铺
- 日期:24日(廿四)
- 时间:辰时正过三刻(8点45分)
- 历史关联:结合真实事件确定为1949年10月24日8时45分
- 最终Flag:2a97dec80254cdb5c526376d0c683bdd
3. BlackPearl
数据识别
- 文件类型:1200000_fc.raw为原始PCM数据
- 采样率:1,200,000 Hz(与无线电信标相关)
GNU Radio处理
- 配置参数:Variable值设置为1,200,000
- 格式转换:RAW转WAV观察频谱特征
摩斯密码解码
- 频谱分析:在频谱图中识别摩斯电码模式
- 手动解码:对照摩斯电码表翻译信号
- Base32转换:解码后得到RAR文件
密码破解
- 视觉识别:在频谱图右上角发现隐藏数字
- 掩码爆破:对不清晰数字位进行爆破(模式:1d3c8c??82d?)
- 最终密码:1d3c8c7582dd
- Flag获取:flag{fa61cde1c174b-79a8-5cb9-3ea464e3dbca}
逆向工程(REVERSE)篇
1. tradre
反调试机制
- Fork监控:父进程通过SIGALRM限制执行时间(60秒)
- 断点检测:收到SIGCHLD时检查是否为int3指令
- 控制流混淆:基于基本块状态转移函数动态决定执行路径
基本块结构分析
struct BasicBlock {
void* branch_ptr; // 分支指针
int (*transfer_func)(); // 状态转移函数
// 返回值含义:
// 0/1 - jcc真假分支
// 2 - 自定义ret指令
// 3 - 兼容性call(库函数)
// 4 - 自定义call指令
// 5 - switch语句
}
恢复控制流
- 结构体转储:通过switch语句实现转储所有基本块关系
- 拓扑排序:以ret为叶子节点,忽略call目标分支
- 指令修补:
- 替换int3为原指令
- 添加jmp指令修复非连续基本块
- 重定位RIP寻址和跳转指令
加密算法识别
- 伪随机数:srand(0x10000)生成掩码
- AES实现:标准AES加密,密钥通过伪随机数生成
- 密文恢复:异或伪随机数得到原始密文
2. butterfly
加密流程分析
- 分块处理:64比特数据块分割
- 加密步骤:
- 与64比特密钥逐字节XOR
- 交换奇偶字节位置
- 循环左移1位
- 与密钥字节相加
实现技术
- SIMD指令:pxor、psllq、psrlq、por、paddb等
- MMX编码:密钥存储格式
漏洞利用(PWN)篇
1. flag-market
漏洞利用链
- 初始状态:flag读取后存放于堆地址
- 输入漏洞:输入255时scanf溢出到BSS段
- 利用步骤:
- 覆盖printf参数为格式化字符串
- 泄露堆地址定位flag
- 通过%s直接泄露flag内容
2. bph
漏洞分析
- 初始泄露:%s格式化字符串泄露地址信息
- 任意写漏洞:malloc失败时在size指向位置写0字节
- 利用技术:参考R3CTF2024类似题型
利用过程
- IO结构体攻击:
- 覆盖stdin的IO_buf_base末字节
- 控制0x64字节写入范围(stdin到stdout)
- 保留fgets触发的任意写能力
- 内存恢复:gdb dump原始内存数据并恢复
- 栈地址泄露:通过stdout泄露environ获取栈地址
- ROP链构造:openat-read-writeROP链获取flag
Web安全篇
1. yamcs
白盒测试发现
- 项目性质:监控系统项目
- 代码执行点:Text字段包含可执行Java代码
黑盒测试过程
- 功能分析:正常输出float类型监控值
- 命令执行尝试:
- 本地文件创建成功
- 远程反弹shell失败(不出网)
- 回显带出:修改payload通过正常输出通道回显数据
2. 日志系统
漏洞链分析
- 参数解析不一致:
- 检查使用$_SERVER['QUERY_STRING']
- 拼接使用$_GET数组
- 数组键名混淆:timestamp[day]与timestamp[day]$解析差异
- 文件上传绕过:上传00.php实现RCE
权限提升
- 服务发现:ps aux显示jboss 4.2.3(端口4446)
- 漏洞利用:参考y4er文章复现CVE漏洞
- payload构造:CCK1反序列化payload
- 代理设置:suo5建立HTTP代理
- 文件查找:find命令搜索flag文件
3. bbjv
漏洞识别
- SpEL注入:存在Spring表达式语言注入漏洞
- 目录遍历:读取System.getProperty("user.home")目录
利用方法
- 属性修改:将user.home指向/tmp目录
- Flag读取:直接读取目标文件
4. SecretVault
鉴权机制分析
- 权限要求:uid为0时获取flag
- 鉴权方式:基于X-User头(默认值0)
- 漏洞点:Connection头中的HTTP请求头不会被代理转发
利用方法
- 头注入:Connection头中写入HTTP请求头
- 默认值利用:使X-User保持默认值0通过鉴权
文档说明:本文档详细记录了强网杯主赛道各题目的解题思路、技术要点和实现方法,涵盖密码学、杂项、逆向工程、漏洞利用和Web安全等多个领域的关键技术点。