SillyCTF2 wp
字数 5558
更新时间 2026-04-12 12:27:19
SillyCTF2 Writeup 教学文档
概述
本文档基于提供的链接内容,详细解析SillyCTF2比赛的解题思路和技巧,涵盖密码学、Web安全、隐写术、逆向工程等多个领域。本教学文档旨在通过实例讲解,帮助读者掌握CTF比赛中的常见题型和解题方法。
题目解析与教学
1. Esoteric 类别
1.1 Pibble
- 题型:Misc(杂项)
- 解题思路:题目页面包含两张可点击图片,其中一张图片(Untitled(1).png)中直接写有Flag。
- Flag:
SillyCTF{w@$h_my_b3ll@y}
1.2 Simple Ciphers
- 题型:密码学(古典编码)
- 解题思路:题目给出的密文是Base64编码,直接使用Base64解码工具或在线网站解码即可。
- Flag:
SillyCTF{wow_that_was_a_simple_way_to_encode_text}
1.3 Simple Ciphers 2
- 题型:密码学(古典编码)
- 解题思路:题目提示为Base16编码,使用Base16(Hex)解码即可。
- Flag:
sillyCTF{pretty_simple_cipher_I_think}
2. Brainrot Apocalypse 类别
2.1 Quick Maths
- 题型:Misc
- 解题思路:简单的数学计算题,计算 9 + 10 的结果。注意题目要求提交时需要包含Flag格式。
- Flag:
SillyCTF{19}
2.2 Only in Ohio
- 题型:Misc / 编码
- 解题思路:
- 题目提供的TXT文件看似是字符画,但最后两行混有Brainfuck代码。
- 提取文本中所有的Brainfuck符号(
><+-.,[])。 - 将提取出的符号作为有效的Brainfuck程序运行,其输出即为Flag。
- Flag:
sillyCTF{toilet_in_ohio}
2.3 Six to the Seven
- 题型:Misc / 隐写
- 解题思路:
- 题目提供一个名为
sixtotheseven.pptx的PPTX文件。PPTX文件本质上是ZIP压缩包。 - 将PPTX文件后缀改为
.zip后解压,或使用归档工具直接打开。 - 在解压后的
ppt/slides/目录下,查看所有slide*.xml文件。 - 观察发现,每张幻灯片中只包含三种图片之一:
image2.png(内容为数字6)、image3.png(内容为数字7)、image4.jpg(空白分隔图)。 image4.jpg每隔9张幻灯片出现一次,因此可以推断:每8张包含6或7的幻灯片为一组,每组之后跟随一张空白图作为分隔符。- 将每组8张幻灯片中的图片内容进行二进制映射:6 -> 0, 7 -> 1。
- 将每组得到的8位二进制数转换为ASCII字符,拼接后即可得到Flag。
- 题目提供一个名为
- Flag:
sillyCTF{haha_six_seven}
2.4 Sussiest Challenge
- 题型:OSINT(开源情报搜集)
- 解题思路:
- 题目要求查找Amogus Wiki中角色“Amogus”的生日。
- 访问Amogus Wiki页面:
https://amogus.fandom.com/wiki/Amogus。 - 在页面正文中查找,或通过页面搜索功能找到“Birthday”字段。根据文档,该信息位于页面正文第263-265行,内容为“January 1st”。
- Flag:
sillyCTF{january_1}
2.5 Hit Me
- 题型:Web安全
- 解题思路:这是一道涉及前端源码泄露、开发模式漏洞和JWT密钥硬编码的题目。
- 信息收集:打开题目提供的在线Blackjack站点,检查浏览器开发者工具(Console/Network)。发现页面加载了Vite开发模式的客户端脚本(
@vite/client),表明网站运行在开发环境下,源码可能未打包和混淆。 - 前端源码泄露:通过
fetch直接请求前端源码文件,如/src/main.tsx、/src/App.tsx、/src/api/client.ts等,成功获取源代码。 - 分析API:从
client.ts中获取后端API地址和关键接口,包括/api/shop/buy-flag。 - 发现JWT密钥:在分析认证逻辑时,发现JWT Token使用HS256算法,且密钥硬编码在代码中为
‘admin’。这允许攻击者伪造任意用户的Token。 - 服务端源码泄露:由于运行在Vite开发模式,前端可以尝试通过
/@fs机制访问服务器端的真实文件。通过构造请求读取/server/server.js,成功获取完整的后端源代码。 - 获取Flag:在后端源码
server.js中,直接查看/api/shop/buy-flag路由的实现,发现Flag硬编码在代码中:const FLAG = 'sillyCTF{brainrot_god}';。
- 信息收集:打开题目提供的在线Blackjack站点,检查浏览器开发者工具(Console/Network)。发现页面加载了Vite开发模式的客户端脚本(
- Flag:
sillyCTF{brainrot_god}
3. Coding Korner 类别
3.1 The End of Linux
- 题型:Web安全 / 逻辑漏洞
- 解题思路:
- 根据题目名和提示“Y2K all over again...”,联想到Unix系统的2038年问题(32位有符号整数时间戳溢出)。
- 打开站点,使用浏览器开发者工具监控网络请求。点击页面按钮后,发现向
/api/status发送了一个POST请求,请求体中包含一个timestamp字段。 - 尝试修改请求中的
timestamp值为32位有符号整数能表示的最大值+1,即2147483648,然后重新发送请求。 - 后端检测到时间戳溢出,返回包含Flag的响应。
- Flag:
sillyctf{maybe_n0t_the_3nd}
3.2 Coding Horror
- 题型:Web安全 / 暴力破解
- 解题思路:
- 题目登录界面存在一个不安全的“两次尝试”机制。根据文档中的密码表,用户名固定为
admin。 - 攻击流程:使用密码字典中的每个密码进行尝试。可以先输入一个错误密码消耗第一次机会,再输入待测试的密码。如果第二次尝试的密码正确,则登录成功并返回Flag。
- 通过脚本自动化这个过程,遍历提供的密码字典,最终找到正确密码。
- 题目登录界面存在一个不安全的“两次尝试”机制。根据文档中的密码表,用户名固定为
- Flag:
sillyCTF{th3_w0rst_bru73f0rc3_pr0t3ct10n_3v3r}
4. Are You Entertained 类别
4.1 Hidden Mickey
- 题型:Misc / 趣味知识
- 解题思路:
- 题目图片展示了一个水族箱底部用石头摆出的“隐藏米奇”(Hidden Mickey)图案。
- 通过资料查找(如AllEars网站或迪士尼官方信息)可知,该场景位于EPCOT主题公园的“The Seas with Nemo & Friends”游乐设施结束后的大型水族馆(SeaBase)区域。
- Flag:
sillyCTF{the_seas_with_nemo_&_friends}
5. South Park 类别
5.1 Cartman's Business Venture
- 题型:Misc / 文件隐写
- 解题思路:
.docx文件本质上是ZIP压缩包。将文件后缀改为.zip后解压。- 在解压后的文件中,找到
customXml目录下的item1.xml文件。 - 用文本编辑器打开
item1.xml,在XML注释中发现一段Base64编码的字符串。 - 对该字符串进行Base64解码,得到Flag。
- Flag:
SillyCTF{cartman_homework_solutions}
6. Krazy Crypto 类别
6.1 Excellent Crypto Challenge
- 题型:密码学(椭圆曲线)
- 解题思路:
- 题目给出了椭圆曲线参数、基点G、公钥Q、临时点R以及两段密文
cipher_1和cipher_2。 - 核心漏洞:用于生成临时点R的随机数
k(nonce)过小(k = 247439),可以暴力破解。 - 攻击步骤:
a. 在椭圆曲线上计算R = k * G,通过循环递增k,直到找到与题目给出的R点相等的点,从而得到正确的k值。
b. 计算共享密钥S = k * Q。
c. 取S点的x坐标,计算其SHA256哈希值作为密钥key。
d. 使用key与密文cipher_1和cipher_2进行逐字节异或解密。 - 其中一段明文为提示信息,另一段明文即为Flag。
- 题目给出了椭圆曲线参数、基点G、公钥Q、临时点R以及两段密文
- Flag:
sillyCTF{Can't_Be_Reusing_NONCE}
6.2 Really Small Adversity
- 题型:密码学(RSA)
- 解题思路:
- 题目给出了一个非常小的RSA公钥(n, e)和密文c。
- 由于模数n极小(
0xFFFFFFFFFFFE5FFFFFFFFFFC25),可以直接分解为两个质数p和q。 - 解密步骤:
a. 分解n,得到p = 4503599627370449,q = 4503599627370517。
b. 计算欧拉函数φ(n) = (p-1)*(q-1)。
c. 已知公钥指数e = 65537,计算私钥指数d = e^(-1) mod φ(n)。
d. 计算明文m = c^d mod n,将得到的整数转换为字节或字符串。
- Flag:
sillyCTF{R$A_FunNy_HA!}
6.3 Can‘t have a salad without Lattice
- 题型:密码学(格密码 / 后量子密码)
- 解题思路:
- 题目提供了一个Wolfram CDF文件(
lattice.cdf)。将其作为文本文件打开,在文件末尾发现密文flag_enc和43组(u, v)向量数据。 - 分析数据:
- 所有向量元素的值都在0到3328之间,暗示模数
q = 3329。 - 5种不同的u向量循环出现,每个u对应一组v向量。对于每个固定的u,其对应的v向量的每个坐标只有两个可能值(例如,1274或2939)。
- 观察发现,每对值
(a, b)满足b = (a + 1665) mod 3329,其中1665 = (q+1)//2。这表明每个坐标用“是否加上1665”来编码一个比特位。
- 所有向量元素的值都在0到3328之间,暗示模数
- 比特提取规则:
- 对于每个坐标,确定其基准值(base)和偏移值(shifted = (base + 1665) mod 3329)。
- 如果坐标值等于基准值,则对应比特为
1;如果等于偏移值,则对应比特为0(根据题目具体实现,规则也可能相反,需根据数据验证)。
- 密钥恢复:
- 从43个块中,每个块提取3个比特,共129比特。前128比特组成一个AES密钥。
- 提取出的密钥为:
encryptionkey123。
- 解密Flag:
flag_enc是Base64编码的字符串,解码后得到48字节数据。- 前16字节是AES-CBC模式的初始向量(IV),后32字节是密文。
- 使用恢复出的密钥
encryptionkey123和IV,用AES-CBC模式解密,即可得到Flag明文。
- 题目提供了一个Wolfram CDF文件(
7. Welcome to SillyCTF 2 类别
7.1 Hello Silly World
- 题型:Misc(签到题)
- Flag:
sillyCTF{welcome_to_silly_ctf_2!}
7.2 CREATE A MEME!
- 题型:Misc
- 解题思路:按照题目要求,上传一张猫的meme图片即可。
- Flag:
sillyCTF{Mememememmememememememmememememem67}
8. Listen Up 类别
8.1 Musical Genius
- 题型:Misc / 音频隐写
- 解题思路:
- 题目提供一个WAV音频文件
Groovy_Beat.wav。 - 使用音频分析工具(如Audacity、Sonic Visualiser)或编写Python脚本(使用
matplotlib或librosa库)生成该音频的频谱图(Spectrogram)。 - 在生成的频谱图中,仔细观察特定频率范围(例如0-3500 Hz)和时间段,可能会发现以图像形式隐藏的Flag文本。
- 题目提供一个WAV音频文件
- Flag:
sillyCTF{A_horrible_beat}
总结与技巧
- 文件格式:熟悉常见文件格式的内部结构(如ZIP、PPTX、DOCX),它们常被用于隐藏信息。
- 开发环境:生产环境中遗留的开发模式(如Vite dev server)、源码映射或未打包的源码是严重的安全漏洞,可能导致关键逻辑和密钥泄露。
- 时间戳与整数溢出:注意与时间、数值范围相关的逻辑漏洞,如2038年问题、整数溢出等。
- 密码学:
- 弱随机数:在椭圆曲线密码学中,重复或可预测的随机数(nonce)会完全破坏安全性。
- 小参数攻击:在RSA中,过小的模数n可以被快速分解。
- 编码识别:熟练掌握Base64、Base16、Brainfuck等编码的特征和解码方法。
- 信息隐写:Flag可能隐藏在图片的像素、音频的频谱、文件的注释或元数据中。
- OSINT:善于利用搜索引擎和公开资料(如Wiki、文档)查找特定信息。
相似文章
相似文章