今年是第三届蓝桥杯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 题目描述:

题目内容:
There are many encrypted zip files.真题下载地址www.whsjyc.cn网页底部领取。
下载题目:打开后,解压发现是一个流量包文件。

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


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

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 题目描述:

题目内容:
某服务器在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 题目描述:

题目内容:
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 题目描述:

题目内容:
对由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 题目描述:

题目内容:
这是一个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。

![]()
1196

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



