2025年第十六届蓝桥杯网络安全CTF国赛(总决赛)真题详解

今年是第三届蓝桥杯CTF,相⽐于以往两届,题⽬数量略微多了一点,并且解题人数也有所增加。

第一题:逆向reverse类:encodefile

1.1 题目描述:

题目内容:分析一个用于加密明文的可执行程序,通过识别其加密逻辑成功解密生成的密文文件,恢复出原始数据内容。真题下载地址www.whsjyc.cn网页底部领取。

下载题目:打开后发现一个程序文件,一个加密文件。

1.2 解题步骤:

第一步:拖入die发现64位程序,无壳

第二步:拖入IDA中分析,先查看strings字符串,发现有关键信息flag.txt    enc.dat     key2025lqb

跳转到对应函数,逻辑显示是通过key加密flag.txt数据后存储到enc.dat。

连续3年出的RC4题目,这题大概率只能盲猜涉及到key的加密算法,输入加密文件enc.dat的十六进制数据进行RC4解密

第二题:杂项misc类:flowzip2

2.1 题目描述:

Snipaste_2025-06-21_12-41-15.png

题目内容:

There are many encrypted zip files.真题下载地址www.whsjyc.cn网页底部领取。

下载题目:打开后,解压发现是一个流量包文件。

2.2 解题步骤:

第一步:用老师给的工具打开流量包文件,选择文件->导出对象-> http

1.jpg

第二步:导出发现很多压缩包,并且提示密码是三位数字。

2.3 exp代码:

可以直接编写脚本进行爆破:

import pyzipper  # 支持 AES 加密
import os
import re

def decrypt_and_search_flag():
    zip_files = [f"{i:03d}.zip" for i in range(200)]  # 000.zip ~ 199.zip
    
    for zip_file in zip_files:
        if not os.path.exists(zip_file):
            print(f"⚠️ 文件 {zip_file} 不存在,跳过...")
            continue

        print(f"\n🔍 正在处理 {zip_file}...")
        found_password = None

        # 尝试密码 000 ~ 999
        for pwd in (f"{i:03d}" for i in range(1000)):
            try:
                with pyzipper.AESZipFile(zip_file) as zf:
                    zf.extractall(pwd=pwd.encode(), path="temp_extracted")  # 解压到临时目录
                    found_password = pwd
                    print(f"✅ 解密成功!密码: {pwd}")
                    break
            except (RuntimeError, pyzipper.BadZipFile):
                continue
            except Exception as e:
                print(f"❌ 解压错误: {e}")
                continue

        if not found_password:
            print(f"❌ 未找到 {zip_file} 的密码(尝试 000-999)")
            continue

        # 检查解压的文件是否包含 "flag"
        flag_found = False
        for root, _, files in os.walk("temp_extracted"):
            for file in files:
                file_path = os.path.join(root, file)
                try:
                    with open(file_path, "r", encoding="utf-8", errors="ignore") as f:
                        content = f.read()
                        if "flag" in content.lower():  # 不区分大小写搜索
                            print(f"🚩 发现 flag 在 {file}:")
                            print(content.strip())
                            flag_found = True
                except Exception as e:
                    print(f"⚠️ 无法读取 {file_path}: {e}")

        if not flag_found:
            print("🔍 未找到 flag 相关内容。")

        # 清理临时文件
        for root, _, files in os.walk("temp_extracted"):
            for file in files:
                os.remove(os.path.join(root, file))
        os.rmdir("temp_extracted")

if __name__ == "__main__":
    decrypt_and_search_flag()

第三题:杂项misc类:server_logs

3.1 题目描述:

Snipaste_2025-06-21_12-40-53.png

题目内容:

某服务器在2023-06-15 02:00-04:00期间被入侵,请分析日志并回答:

1.攻击者使用的SSH用户名和IP

2.植入的恶意服务名称

3.泄露机密文件时使用的DNS域名

提交形式:flag{SSH用户名_IP_恶意服务名称(不包括后缀)_DNS域名(固定部分)}

真题下载地址www.whsjyc.cn网页底部领取。

3.2 解题步骤:

第一步:在auth.log中发现:

SSH 用户名: attacker

攻击者 IP: 192.168.42.77

第二步:在syslog中发现:

恶意服务名称: hidden_backdoor(不包括 .service 后缀)

第三步:在dnsmasq.log中发现:

DNS 域名固定部分: data.leak.ev

按照题目要求进行组合得到最终flag为flag{attacker_192.168.42.77_hidden_backdoor_data.leak.ev}。

第四题:密码学Crypto类:xxtea

4.1 题目描述:

Snipaste_2025-06-21_12-41-47.png

题目内容:

It's getting hard to even copy the data this time.真题下载地址www.whsjyc.cn网页底部领取。

4.2 解题步骤:

第一步:打开题目发现是xxtea加密,这种加密题目在培训班讲过多次解法。

第二步:复制出十六进制代码,直接用赛博厨师逆向解密即可

获得答案flag{4eb88a16-be48-4de2-ab2a-ed09a09ed386}

第五题:逆向reverse类:rand_pyc

5.1 题目描述:

Snipaste_2025-06-21_12-44-09.png

题目内容:

对由Python打包生成的exe文件进行逆向处理,提取并还原出其核心源码,以便进一步分析程序逻辑并获得正确的输入。真题下载地址www.whsjyc.cn网页底部领取。

5.2 解题步骤:

第一步:打开题目发现python逆向题目,直接用老师上课时候教过的方法解题就可以了。先使用pyinstxtractor将exe反编译为pyc文件:

第二步:然后使用uncompyle6将pyc反编译为py源代码:

5.3 exp代码:

检查输入Flag的Base64编码拼接"_easyctf"后,每个字符作为随机种子生成的数字是否匹配预设的列表。编写脚本爆破并重排序回去得到flag:

import random
import base64

# 预计算字符到随机数的映射
char_to_rand = {}
for c in range(0, 128):
    random.seed(c)
    rand_num = random.randint(1000000, 9999999)
    char_to_rand[rand_num] = chr(c)

# 给定的随机数列表
iii111 = [
    4417023, 5690625, 9639225, 1327718, 4417023, 5085550, 5752075, 
    9556690, 5240080, 6431679, 3428007, 3189766, 3438336, 5757818, 
    3189766, 5690625, 4148389, 2254831, 6292433, 2122126, 5240080, 
    6431679, 9488271, 2464675, 7216908, 5757818, 3189766, 5690625, 
    3438336, 6431679, 2360475, 6002055, 5240080, 9040261, 8655414, 
    9347278, 3438336, 2254831, 2122126, 5135281, 2360475, 9347278, 
    4417023, 1327718, 3438336, 3448715, 9488271, 5501611, 5240080, 
    5757818, 9488271, 5501611, 5240080, 9347278, 4148389, 1714134, 
    9923116, 4267438, 4263793, 5752075, 2464675, 7777627, 6002055, 
    3485900
]

# 逆向Base64字符串
base64_str = ""
for num in iii111:
    if num in char_to_rand:
        base64_str += char_to_rand[num]
    else:
        print(f"Unknown random number: {num}")
        base64_str += "?"

print("Base64 + suffix:", base64_str)

# 提取并解码Base64部分
base64_part = base64_str.split("_easyctf")[0]
flag = base64.b64decode(base64_part).decode()
print("Flag:", flag)

第六题:web漏洞类:fastcoll

6.1 题目描述:

Snipaste_2025-06-21_12-42-35.png

题目内容:

这是一个MD5碰撞挑战:你能找到两个不同文件,但却拥有相同的MD5值吗?真题下载地址www.whsjyc.cn网页底部领取。

6.2 解题步骤:

这种题目老师在上课时候讲过,就是web题目里面的md5漏洞

创建tmp.txt文件,写入gamelab

然后使用fastcoll工具生成:

fastcoll_v1.0.0.5.exe -p tmp.txt -o msg1.bin msg2.bin

使用Cyberchef取生成的两个文件的Base64值提交到靶机即可得到Flag。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值