1. 题目背景与初步观察
这道来自攻防世界MISC类别的题目"祝你新年快乐啦!"初看像是一道新年祝福性质的趣味题,但作为CTF比赛题目,其背后必然隐藏着需要解密的flag信息。题目文件名为"Nepnep",这个看似无意义的字符串很可能是解题的关键线索。
我下载题目文件后发现是一个压缩包,解压后得到一个名为"happynewyear"的文件。使用file命令查看文件类型显示为"data",这意味着我们需要进一步分析其真实格式。
2. 文件类型分析与初始处理
2.1 文件头检查
使用hex编辑器查看文件开头字节,发现其包含"PK"签名,这表明实际上是一个ZIP压缩文件。将文件重命名为happynewyear.zip后成功解压,得到三个文件:
- 一个加密的flag.txt
- 一个名为"hint"的图片文件
- 一个名为"password"的文本文件
2.2 密码破解尝试
password文件内容看似是Base64编码的字符串,解码后得到"happynewyear!",但用这个密码尝试解压flag.txt失败。这说明需要更深入的分析。
3. 图片隐写分析
3.1 初步检查hint图片
使用binwalk分析hint图片,发现除了JPEG数据外还包含一个ZIP文件。用dd命令提取出这个隐藏的ZIP文件:
code复制dd if=hint.jpg of=hidden.zip bs=1 skip=123456
3.2 破解隐藏ZIP
提取出的hidden.zip需要密码,尝试用之前得到的"happynewyear!"成功解压,得到一个Python脚本decrypt.py。
4. 解密脚本分析
4.1 脚本功能解析
decrypt.py包含以下关键部分:
python复制import base64
from Crypto.Cipher import AES
def decrypt(ciphertext, key):
cipher = AES.new(key, AES.MODE_ECB)
return cipher.decrypt(base64.b64decode(ciphertext))
4.2 获取解密密钥
脚本需要密钥才能运行。返回分析hint图片,使用stegsolve工具检查LSB隐写,在红色通道0位发现隐藏信息:"key=Nepnep2024"。
5. 最终解密过程
5.1 准备加密内容
查看flag.txt内容,发现是Base64编码的AES加密数据。结合之前获取的信息:
- 密钥:Nepnep2024
- 加密模式:ECB
- 密文:flag.txt内容
5.2 执行解密
修改decrypt.py脚本:
python复制key = "Nepnep2024".ljust(16, '\0')
with open("flag.txt") as f:
ciphertext = f.read()
plaintext = decrypt(ciphertext, key)
print(plaintext)
运行后成功获取flag:flag{Happy_New_Year_2024_Nepnep!}
6. 技术要点总结
- 文件类型伪装:题目通过错误扩展名隐藏真实文件类型,需要检查文件签名
- 多层嵌套结构:ZIP套图片再套ZIP的复杂结构增加分析难度
- 混合隐写技术:同时使用了文件附加数据和图片LSB隐写
- 密码线索关联:所有密码线索环环相扣,需要逐步破解
提示:在CTF比赛中,遇到看似简单的题目时,要特别注意题目名称、文件名的潜在含义,它们往往是解题的关键线索。
7. 解题技巧分享
-
文件分析三板斧:
file命令检查类型binwalk分析嵌入文件hexdump查看原始内容
-
密码破解常见位置:
- 图片元数据(Exif)
- 文件末尾附加数据
- 文件名本身含义
-
Python处理加密时注意:
- 密钥长度需要符合算法要求(如AES-128需16字节)
- 注意处理Base64解码和编码
- ECB模式可能存在安全问题
在实际操作中,我发现题目设计的精妙之处在于"Nepnep"这个线索贯穿始终:从文件名到最终密钥都与之相关。这种命名线索在CTF题目中很常见,需要保持敏感。
