i 春秋 CTF 大本营 basic 部分 writeup
二、题目解析
1. 回旋 13 踢
解题思路
核心识别:题目中 “13” 是关键线索,对应ROT13 编码(凯撒密码的特殊形式,字母移位 13 位,A↔N、B↔O...Z↔M);
解码规则:将字母按顺序移位 13 位,例如:
s + 13 → f、y + 13 → l、n + 13 → a、t + 13 → g;
操作:对题目给出的编码字符串逐字母移位,拼接后得到 flag。
辅助截图
2. 小苹果
解题思路
文件分析:题目提供wav音频文件,推测为音频隐写;
核心工具:SilentEye(专门用于提取音频中隐藏的信息,支持多种隐写算法);
操作步骤:
打开SilentEye,导入目标wav文件;
选择 “Decode” 功能,提取隐藏内容,直接获得 flag。
关键提示
该题核心是识别隐写工具,只要知道SilentEye适配音频隐写,即可快速解题。
3. Ropgadge
解题思路
题目特征:给出一串汇编指令,需计算其对应的 16 进制机器码;
核心工具:rasm2(Radare2 框架中的工具,支持多架构汇编 / 反汇编);
工具参数说明:
-a:指定架构(如 x86、mips,本题默认 x86);
-b:指定位数(32 位 / 64 位,本题默认 32 位);
-d/-D:反汇编 16 进制字符串(本题需汇编,无需该参数);
操作命令:
rasm2 "xchg eax,esp;ret;mov ecx,[eax];mov [edx],ecx;pop ebx;ret"
执行后得到的 16 进制字符串即为关键结果,进一步处理可获 flag。
4. Easyrsa
解题思路
题目信息:已知 RSA 加密参数:C=0xdc2eeeb2782c、N=322831561921859、e=23,需解密求 flag;
核心步骤:
大整数分解(N→p*q):使用yafu工具分解 N,命令:
yafu factor(322831561921859)
得到p=0x16ae0a3、q=0xcf22e1;
进制转换:将所有参数统一为 16 进制:
N=0x1259d14921543、E=0x17、C=0xdc2eeeb2782c;
RSA 解密脚本:用 Python 编写解密脚本,计算私钥d,再通过M = C^d mod N得到明文;
# 示例脚本(需导入rsa库或手动实现扩展欧几里得算法)
import rsa
from rsa import common
# 已知参数(16进制转十进制)
N = int("1259d14921543", 16)
p = int("16ae0a3", 16)
q = int("cf22e1", 16)
e = int("17", 16)
C = int("dc2eeeb2782c", 16)
# 计算私钥d
phi = (p-1) * (q-1)
d = common.inverse(e, phi)
# 解密得到明文(十进制转16进制,再转字符串)
M = pow(C, d, N)
flag = bytes.fromhex(hex(M)[2:]).decode()
print("flag:", flag) # 输出 PCTF{3a5Y}
辅助截图
大整数分解结果:
(原文本地截图,此处省略,核心为得到 p 和 q)
解密脚本执行结果:
(原文本地截图,此处省略,核心为输出PCTF{3a5Y})
5. 爱吃培根的你
解题思路
题目特征:给出字符串bacoN is one of aMerICa'S sWEethEartS...,提示 “培根”,对应培根密码;
培根密码规则:将大写字母视为B,小写字母视为A,组成二进制序列(A=0、B=1),再按 5 位一组解码为字母;
操作步骤:
处理字符串:大写→B、小写→A,得到序列:
AAAABAAAAAAAABAABBABABBAAABAAABAAABABBAAABBABBAABAAABABABBABABBABAAABB;
分组解码:每 5 位对应一个字母(A=00000、B=00001...),拼接后得到 flag。
辅助截图
(原文本地截图,此处省略,核心为解码过程与结果)
6. 熟悉的声音
解题思路
题目特征:给出字符串XYYY YXXX XYXX XXY XYY X XYY YX YYXX,提示 “声音”,对应摩斯密码;
映射规则:X对应摩斯密码的.(点),Y对应-(划);
操作步骤:
转换为摩斯密码:.- --.. .-.. ..- .-- . .-- -. --..;
摩斯解码:得到JBLUWEWNZ;
凯撒移位:尝试移位(结合 CTF 常见 flag 格式),最终得到正确 flag。
辅助截图
(原文本地截图,此处省略,核心为摩斯解码与凯撒移位过程)
7. 加密的文档
解题思路
题目特征:带密码的压缩包,推测为ZIP 伪加密(文件头与数据区加密标记不一致);
伪加密原理:ZIP 文件中,加密标记位于文件头的第 3、4 字节,0900为加密,0000为未加密,伪加密是故意修改该标记导致的 “假加密”;
操作步骤:
用WinHex打开压缩包,找到文件头加密标记(偏移 0x04-0x05);
修改标记:将0900改为0000,保存后解压;
处理解压后的doc文件:用binwalk分离隐藏内容(binwalk -e 文件名.doc),在word/media目录下找到image2文件,打开得到 flag。
辅助截图
WinHex 修改加密标记:
(原文本地截图,此处省略,核心为修改 0900→0000)
binwalk 分离结果:
(原文本地截图,此处省略,核心为找到 media 目录下的 image2)
8. Shellcode
解题思路
题目特征:给出一段 Shellcode 字符串,需执行查看输出;
核心工具:shellcodeexec(GitHub 地址:https://github.com/inquisb/shellcodeexec,专门用于执行 Shellcode);
操作步骤:
克隆工具:git clone https://github.com/inquisb/shellcodeexec;
执行 Shellcode:
python shellcodeexec.py -x86 "题目给出的Shellcode字符串"
工具执行后输出 flag。
辅助截图
(原文本地截图,此处省略,核心为工具执行结果)
9. Base64
解题思路
题目特征:给出字符串GUYDIMZVGQ2DMN3CGRQTONJXGM3TINLGG42DGMZXGM3TINLGGY4DGNBXGYZTGNLGGY3DGNBWMU3WI===,尝试 Base64 解码失败,推测为Base32 编码;
操作步骤:
Base32 解码:用在线工具或 Python 解码,得到 16 进制字符串:
504354467b4a7573745f743373745f683476335f66346e7d;
16 进制转字符串:用WinHex或 Python 转换,得到 flag:
hex_str = "504354467b4a7573745f743373745f683476335f66346e7d"
flag = bytes.fromhex(hex_str).decode()
print(flag) # 输出 PCTF{Just_t3st_h4v3_f4n}
辅助截图
Base32 解码结果:
(原文本地截图,此处省略,核心为得到 16 进制字符串)
16 进制转字符串结果:
(原文本地截图,此处省略,核心为输出 flag)
10. 手贱的 A 君
解题思路
题目特征:给出字符串d78b6f302l25cdc811adfe8d4e7c9fd34,疑似 MD5 哈希,但包含异常字符l(小写 L);
问题定位:MD5 哈希仅包含 0-9、a-f,l为手误输入,删除后得到正确哈希:d78b6f30225cdc811adfe8d4e7c9fd34;
操作:用 MD5 解密工具(如 CMD5)解密,得到 flag:hack。
辅助截图
哈希修正前后对比:
(原文本地截图,此处省略,核心为删除l)
MD5 解密结果:
(原文本地截图,此处省略,核心为输出hack)
11. Veryrsa
解题思路
题目特征:直接给出 RSA 参数p、q、e,需计算私钥d并解密得到 flag;
核心步骤:
计算欧拉函数phi = (p-1) * (q-1);
求私钥d(e的模逆,即d = e^(-1) mod phi);
解密:若给出密文C,则M = C^d mod N(N = p*q),转换为字符串得到 flag;
示例脚本:
# 假设题目给出p、q、e、C(此处用占位符表示)
p = 123456789 # 题目实际p值
q = 987654321 # 题目实际q值
e = 65537 # 题目实际e值
C = 1234567890 # 题目实际C值
N = p * q
phi = (p-1) * (q-1)
d = pow(e, -1, phi) # Python 3.8+支持pow求模逆
M = pow(C, d, N)
flag = bytes.fromhex(hex(M)[2:]).decode()
print(flag)
辅助截图
脚本执行结果:
(原文本地截图,此处省略,核心为输出 flag)
12. 实验室 logo
解题思路
题目特征:给出一张图片,推测为图片隐写,需提取隐藏图层;
核心工具:StegSolve(用于分析图片的不同通道、帧,提取隐藏信息);
操作步骤:
用StegSolve打开图片,选择Analyse → Frame Browser;
切换不同帧(Frame),在第二帧中直接看到 flag。