2026.7.19(5)【brainfuck】神秘龙卷风

📌 题目信息

项目内容
题目名称神秘龙卷风
题目来源BUUCTF Misc
题目类型Misc(杂项)
子分类压缩包破解 + 编码识别
考点RAR暴力破解、Brainfuck编程语言识别与解码
难度
最终 Flagflag{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 工具进行暴力破解:

  1. 打开 ARCHPR,加载加密的 .rar 文件
  2. 攻击类型:选择“暴力破解”
  3. 范围:勾选“数字 (0-9)”
  4. 密码长度:最小长度 = 最大长度 = 4
  5. 点击“开始”破解


破解得到压缩包密码:5463

⚠️ 注意:如果 ARCHPR 报错或破解失败,可以尝试使用 RARPasswordUnlocker 或其他 RAR 破解工具。

第 3 步:解压得到“外星人代码”

用密码 5463 解压压缩包,得到一个 .txt 文本文件。

打开后,内容全是类似这样的符号:

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++...

这些符号由 +.> 等字符组成,看起来像是一堆乱码,但实际上是一种编程语言的代码。

第 4 步:识别“外星人代码”——Brainfuck

搜索后发现,这是一种名为 Brainfuck 的极简编程语言。

Brainfuck 的典型特征:

  • 仅由 <>+-.[] 八个字符组成
  • 会出现大量的 +- 符号
  • 看起来像是一串“外星文”

💡 识别技巧:如果你看到一段文本几乎只包含 +-><[]., 这8个字符,且 +- 特别多,那极大概率就是 Brainfuck 代码。

第 5 步:Brainfuck 解码获取 Flag

.txt 文件中的 Brainfuck 代码全部复制,粘贴到在线解码工具中运行:

⚠️ 注意:有些工具可能需要去掉代码中的空格和换行符再解码。如果解码报错,尝试只复制有效代码部分。

运行后得到 Flag。

🏁 最终 Flag

flag{e4bbef8bdf9743f8bf5b727a9f6332a8}
#图片中的最后的ÿ不需要
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值