📌 题目信息
| 项目 | 内容 |
|---|---|
| 题目名称 | 神秘龙卷风 |
| 题目来源 | BUUCTF Misc |
| 题目类型 | Misc(杂项) |
| 子分类 | 压缩包破解 + 编码识别 |
| 考点 | RAR暴力破解、Brainfuck编程语言识别与解码 |
| 难度 | ⭐ |
| 最终 Flag | flag{e4bbef8bdf9743f8bf5b727a9f6332a8} |
🛠️ 使用工具
- ARCHPR(Advanced RAR Password Recovery)—— RAR压缩包暴力破解工具
- Brainfuck在线解码工具
📝 解题思路
题目描述:“神秘龙卷风转转转,科学家用四位数字为它命名,但是发现解密后居然是一串外星人代码!!”
关键词提示:“四位数字” + “外星人代码”
第 1 步:下载附件,发现加密压缩包
下载题目附件后,解压得到一个 .rar 加密压缩包。
尝试用 7-Zip 打开,发现不是伪加密,确实需要密码。
补充:ZIP 伪加密的判断(和 RAR 的区别)
- 用 7-Zip 打开 ZIP,如果弹窗提示密码,但取消后依然能显示内部文件列表,那就是伪加密。
- 此时用十六进制编辑器打开 ZIP,找到
50 4B 01 02(中央目录),将其后面第 9 个字节(通用位标志)的末位(0x01)改为0x00,就能解除加密。 - RAR 不存在这种简单的“改一个字节就能解除”的机制(因为 RAR 的 AES 加密会校验整体数据完整性),所以遇到 RAR,老老实实暴力破解或找字典是正途。
也可以使用python脚本判断。
import struct
import os
import sys
def check_rar_encryption(filepath):
"""
检测 RAR 文件的加密标志,并给出伪加密判断建议。
支持 RAR 4.x 旧格式(CTF中最常见)。
"""
if not os.path.exists(filepath):
print(f"[-] 文件不存在: {filepath}")
return
with open(filepath, 'rb') as f:
# 1. 读取 RAR 魔术字 (4字节: Rar!)
magic = f.read(4)
if magic != b'Rar!':
print("[-] 不是有效的 RAR 文件 (魔术字不匹配)")
return
print("[+] 识别为 RAR 文件格式")
# 2. 遍历 RAR 块头 (主头 & 文件头)
has_encrypt_flag = False
file_header_found = False
header_count = 0
while True:
# 读取基础头信息: HEAD_CRC (2字节), HEAD_TYPE (1字节), HEAD_FLAGS (2字节), HEAD_SIZE (2字节)
head_raw = f.read(7)
if len(head_raw) < 7:
break # 文件结束或数据不足
head_crc, head_type, head_flags, head_size = struct.unpack('<H B H H', head_raw)
# HEAD_TYPE: 0x72 = 主头, 0x74 = 文件头, 0x7A = 注释头等
if head_type == 0x72:
type_name = "主头 (Main)"
elif head_type == 0x74:
type_name = "文件头 (File)"
file_header_found = True
elif head_type == 0x7A:
type_name = "注释头 (Comment)"
else:
type_name = f"未知头 (0x{head_type:02X})"
# 检查加密标志: HEAD_FLAGS 的第 15 位 (0x8000)
is_encrypted = bool(head_flags & 0x8000)
if is_encrypted:
has_encrypt_flag = True
flag_status = "🔴 已置位 (加密标志打开)"
else:
flag_status = "🟢 未置位 (加密标志关闭)"
print(f" [{header_count}] 类型: {type_name} | 标志位: 0x{head_flags:04X} | {flag_status}")
# 为了完整解析,需要跳过 HEAD_SIZE 之后的数据。
# 注意:HEAD_SIZE 包含当前头部总长度。
# 我们已经读了 7 字节,如果 HEAD_SIZE > 7,需要跳过剩余部分。
remaining_head = head_size - 7
if remaining_head > 0:
f.seek(remaining_head, os.SEEK_CUR)
# 如果是文件头 (0x74),读取其附加的 PACK_SIZE / UNPACK_SIZE 等
# 但为了不无限循环,我们只需要知道加密标志是否存在即可。
# 这里我们只解析前几个头,找到文件头即可。
if head_type == 0x74:
# 找到了文件头,理论上读取文件名等后续数据
# 但对于 RAR 3.x+,如果标志位 0x8000 置位,文件名区域是加密的。
# 我们在这里检测完毕后可以跳出循环了。
break
# 防止死循环,最多解析20个头
header_count += 1
if header_count > 20:
break
# 3. 输出综合判断
print("\n" + "="*50)
if not has_encrypt_flag:
print("[结论] 该 RAR 文件未加密,可以直接解压。")
else:
print("[结论] 该 RAR 文件设置了加密标志。")
if file_header_found:
print("[建议] 虽然检测到文件头,但 RAR 3.x+ 格式下文件头数据是加密的。")
print("[判断] 请用 7-Zip 打开:")
print(" - 如果取消密码后能看到文件名 -> 可能是伪加密(可尝试修改标志位)。")
print(" - 如果取消密码后一片空白 -> 真实加密(只能暴力破解)。")
else:
print("[判断] 未找到文件头,推测为 RAR5 或高强度加密,大概率是真加密。")
print("="*50)
if __name__ == "__main__":
if len(sys.argv) < 2:
print("用法: python check_rar_encrypt.py <目标RAR文件路径>")
else:
check_rar_encryption(sys.argv[1])

第 2 步:根据提示暴力破解密码
题目明确提示“四位数字”命名,所以密码范围是 0000 ~ 9999。
使用 ARCHPR 工具进行暴力破解:
- 打开 ARCHPR,加载加密的
.rar文件 - 攻击类型:选择“暴力破解”
- 范围:勾选“数字 (0-9)”
- 密码长度:最小长度 = 最大长度 = 4
- 点击“开始”破解

破解得到压缩包密码:5463
⚠️ 注意:如果 ARCHPR 报错或破解失败,可以尝试使用 RARPasswordUnlocker 或其他 RAR 破解工具。
第 3 步:解压得到“外星人代码”
用密码 5463 解压压缩包,得到一个 .txt 文本文件。
打开后,内容全是类似这样的符号:
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++...
这些符号由 +、.、> 等字符组成,看起来像是一堆乱码,但实际上是一种编程语言的代码。
第 4 步:识别“外星人代码”——Brainfuck
搜索后发现,这是一种名为 Brainfuck 的极简编程语言。
Brainfuck 的典型特征:
- 仅由
<>+-.[]八个字符组成 - 会出现大量的
+和-符号 - 看起来像是一串“外星文”
💡 识别技巧:如果你看到一段文本几乎只包含
+、-、>、<、[、]、.、,这8个字符,且+和-特别多,那极大概率就是 Brainfuck 代码。
第 5 步:Brainfuck 解码获取 Flag
将 .txt 文件中的 Brainfuck 代码全部复制,粘贴到在线解码工具中运行:
⚠️ 注意:有些工具可能需要去掉代码中的空格和换行符再解码。如果解码报错,尝试只复制有效代码部分。
运行后得到 Flag。
🏁 最终 Flag
flag{e4bbef8bdf9743f8bf5b727a9f6332a8}
#图片中的最后的ÿ不需要
【brainfuck】神秘龙卷风&spm=1001.2101.3001.5002&articleId=163792129&d=1&t=3&u=9fa7d051908543ac95e761b905e2e90e)
7万+

被折叠的 条评论
为什么被折叠?



