m0leCon Beginner CTF2024部分wp
字数 2286 2025-08-22 12:22:30
m0leCon Beginner CTF 2024 部分题目解析与教学文档
Web 题目解析
Cookie Shop
题目描述:进入网站后余额为10,flag价格为1000。查看源码发现注释中泄露了Flask的secret_key。
解题步骤:
- 检查网站Cookie,发现包含用户余额信息
- 对Cookie进行base64解码,得到类似
{"balance": 10}的结构 - 修改balance值为1000000,然后重新base64编码
- 将修改后的值
eyJiYWxhbmNlIjogMTAwMDAwMH0=作为新Cookie提交 - 购买flag
关键点:
- Flask的session cookie通常使用base64编码
- 即使有secret_key,有时直接修改base64编码的值也能生效
- 注意JSON格式中的空格和结构
GoSecureIt
题目描述:源码secret.go中泄露了JWT密钥。
解题步骤:
- 获取当前JWT token
- 使用泄露的密钥
schrody_is_always_watching - 在jwt.io网站或本地工具修改role为admin
- 使用新生成的token访问特权接口
关键点:
- JWT由header、payload和signature三部分组成
- 修改payload后需要用相同密钥重新签名
- 在线工具如jwt.io可以方便地编辑和重新签名JWT
Locked Door
题目描述:需要输入8位密码,通过隐藏路由发现SQL注入点。
解题步骤:
- 发现隐藏路由
/rowmawza - 尝试SQL注入:
' OR '1'='1绕过登录 - 下载流量包文件
- 分析流量包发现RSA加密信息:
- n: 144866671565187653968436368127956889323
- e: 65537
- 密文: 71296054321509316776624970111608994994
- 使用SageMathCell分解n并解密:
n = 144866671565187653968436368127956889323 e = 65537 factors = factor(n) p, q = factors[0][0], factors[1][0] phi_n = (p - 1) * (q - 1) d = inverse_mod(e, phi_n) ciphertext = 71296054321509316776624970111608994994 plaintext = power_mod(ciphertext, d, n) - 得到密码
99004462,解锁门
关键点:
- 隐藏路由是常见CTF技巧
- SQL注入万能密码
' OR '1'='1在简单场景有效 - 小整数n可以直接分解因数
- RSA解密需要计算φ(n)和模反元素d
Misc 题目解析
XORed picture
题目描述:PNG图片被16字节随机密钥异或加密。
解题步骤:
- PNG文件头已知:
89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52 - 用已知明文与加密文件头异或得到密钥
- 用密钥解密整个文件
Python实现:
import itertools
def xor(data, key):
return bytes(a ^ b for a, b in zip(data, itertools.cycle(key)))
with open("flag_enc.png", "rb") as fin:
ct = fin.read()
magic_number = bytes.fromhex("89504e470d0a1a0a")
first_chunk_type = b'IHDR'
first_chunk_size = (13).to_bytes(4, "big")
known_pt = magic_number + first_chunk_size + first_chunk_type
key = xor(known_pt, ct[:len(known_pt)])
decrypted_data = xor(ct, key)
with open("flag_dec.png", "wb") as fout:
fout.write(decrypted_data)
关键点:
- 文件格式的固定头部可用于已知明文攻击
- 异或加密是可逆操作:A ⊕ B = C ⇒ A ⊕ C = B
- PNG文件结构:8字节签名 + 4字节长度 + 4字节类型(IHDR)
KIRBY'S FLAG
题目描述:GIF动画每帧包含flag的一部分。
解题步骤:
- 使用工具分解GIF各帧
- 识别每帧中的字符
- 按帧顺序组合字符:
1nh4ling_fl4g5_l1k3_4_b055_15_wh47_k33p5_m3_4l1ve - 用
ptm{}包裹得到flag
关键点:
- GIF动画帧可包含隐藏信息
- 可能需要图像处理或OCR识别字符
- 注意帧顺序和特殊字符(如
_)
pickle soup
题目描述:Python pickle反序列化漏洞。
解题步骤:
- 识别
pickle.loads存在反序列化漏洞 - 构造恶意pickle数据实现RCE
- Base64编码后提交
攻击载荷:
import base64
a='''V__setstate__(S"cat re*"iossystem.'''
print(base64.b64encode(a.encode()))
关键点:
- pickle反序列化可以执行任意代码
- 注意题目对输入长度的限制(本题64字节)
- 使用
__reduce__或__setstate__等魔术方法构造payload
Strange noise
题目描述:音频文件中隐藏摩尔斯电码。
解题步骤:
- 用Audacity打开音频文件
- 查看频谱图,发现700Hz和900Hz间的信号
- 使用滤波器隔离目标频率
- 导出后使用在线摩尔斯解码器解码
关键点:
- 摩尔斯电码可能在特定频率
- 频谱分析是音频隐写常见方法
- 滤波器设置要准确隔离目标信号
PIETcture*
题目描述:与npiet编程语言相关,需要输入密码。
解题思路:
- 题目名提示与Piet语言相关
- 可能需要分析图像中的颜色变化
- 尝试常见CTF密码或空输入
A car hacker's first steps
题目描述:CAN总线通信数据分析。
解题步骤:
- 分析candump.txt文件
- 筛选UDS协议的WDBI(写数据)帧和响应帧
- 提取数据部分并解码
Python实现:
frames = []
with open("candump.txt", "r") as f:
for line in f:
frames.append(line.split("#")[1].strip())
for i in range(len(frames) - 1):
frame = frames[i]
if frame[2:4] == "2E": # WDBI帧
if frames[i + 1][2:4] == "6E": # 正响应
print(bytes.fromhex(frame[8:]).decode("utf-8"), end="")
关键点:
- CAN总线数据通常包含时间戳、接口和ID
- UDS协议中0x2E是写数据请求,0x6E是正响应
- 数据部分可能需要拼接或进一步处理
总结与学习要点
-
Web安全:
- Cookie操作和编码(base64)
- JWT构造和签名
- SQL注入基础技巧
- RSA加密原理和实现
-
杂项技巧:
- 文件格式分析和已知明文攻击
- 多媒体文件隐写分析(GIF、PNG、音频)
- 反序列化漏洞利用
- 协议分析(CAN总线)
-
工具使用:
- base64编解码工具
- jwt.io在线工具
- SageMathCell数学计算
- Audacity音频分析
- 文件分解工具
-
编程技巧:
- Python处理二进制数据
- 加密算法实现
- 数据分析脚本编写
这些题目涵盖了CTF比赛的常见题型和解题思路,适合初学者系统学习网络安全和逆向分析的基本技能。