今年是第三届蓝桥杯CTF,相⽐于以往两届,题⽬数量略微多了一点,并且解题人数也有所增加。
第一题:逆向reverse类:encodefile
1.1 题目描述:
题目内容:分析一个用于加密明文的可执行程序,通过识别其加密逻辑成功解密生成的密文文件,恢复出原始数据内容。
下载题目:打开后发现一个程序文件,一个加密文件。
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.
下载题目:打开后,解压发现是一个流量包文件。
编辑
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.
4.2 解题步骤:
第一步:打开题目发现是xxtea加密,这种加密题目在培训班讲过多次解法。
第二步:复制出十六进制代码,直接用赛博厨师逆向解密即可
获得答案flag{4eb88a16-be48-4de2-ab2a-ed09a09ed386}
第五题:逆向reverse类:rand_pyc
5.1 题目描述:
题目内容:
对由Python打包生成的exe文件进行逆向处理,提取并还原出其核心源码,以便进一步分析程序逻辑并获得正确的输入。
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值吗?
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。