2025第十六届蓝桥杯大赛(软件赛)网络安全赛 Writeup
2025第十六届蓝桥杯大赛(软件赛)网络安全赛 Writeup
情报收集
黑客密室逃脱
根据网页提示,一步步进行,最后得到读取文件接口,尝试读取./,报错:

得知这个python文件为app.py,直接读取源码:

发现它将key写入了文件中,读取key:

secret_key8969
密文在一开始的页面中,
编写脚本如下:
def simple_encrypt(text, key):
encrypted = bytearray()
for i in range(len(text)):
char = text[i]
key_char = key[i % len(key)]
encrypted.append(ord(char) + ord(key_char))
return encrypted.hex()
def simple_decrypt(text, key):
encrypted = bytearray()
for i in range(len(text)):
char = text[i]
key_char = key[i % len(key)]
encrypted.append(char - ord(key_char))
return encrypted
print(simple_decrypt(b''.fromhex('d9d1c4d9e0da90a197ae9e716e66a7959aa592a8c0cd98a6706d699aa098c6abc6ab93cecada9b6f98b6'),'secret_key8969'))
数据分析
ezEvtx
下载文件,双击打开,按事件ID排序,找到了一个跟别的事件id不同的事件:

答案即为 confidential.docx。
flowzip
wireshark 打开,过滤器设置为 tcp contains "flag":

直接看到 flag。
密码破解
Enigma
打开网页,是cyberchef的网页,打开自己的本地Cyberchef,设置相同的参数,解出原文:

file:///D:/Windows/CTF%20tools/Cryptography/CyberChef/CyberChef_v10.19.4.html#recipe=Enigma('3-rotor','LEYJVCNIXWPBQMDRTAKZGFUHOS','A','A','EKMFLGDQVZNTOWYHXUSPAIBRCJ%3CR','A','A','AJDKSIRUXBLHWTMCQGZNPYFVOE%3CF','A','A','BDFHJLCPRTXVZNYEIWGAKMUSQO%3CW','A','A','AY%20BR%20CU%20DH%20EQ%20FS%20GL%20IP%20JX%20KN%20MO%20TZ%20VW','',true)&input=SUxCREEgTUhTV1ggTU9STlogRERET1QgS1VZWkEgVlNCSkM&oeol=NEL
原文为:
HELLO CTFER THISI SAMES SAGEF ORYOU
ECBTrain
根据尝试,发现用户名相同时,得到的auth相同,且base64解码后总为16字节,猜测auth为用户名加密后的结果,用户名不能设置为admin,结合题目提示,第二块明文设置为admin,脚本如下:
from pwn import *
p = remote("8.147.132.32", 18450)
p.recvuntil('请输入选项编号: '.encode())
p.sendline(b'1')
p.sendline(b'a'*16+b'admin')
p.sendline(b'aaa')
p.interactive()

得到auth后base64解码,截取后16字节后base64编码,选择登录,输入auth,得到flag。
easy_AES
关键点在于key1是由key0进行置换后得到的,尝试编写脚本爆破置换表后进行解密。
编写脚本如下:
from Crypto.Cipher import AES # 导入AES加密模块
# from secret import flag # 从secret模块导入flag(假设为明文)
import random, os # 导入random和os模块用于随机数生成
# 为消息填充字节,使其长度为16的倍数
def pad(msg):
return msg + bytes([16 - len(msg) % 16 for _ in range(16 - len(msg) % 16)])
# 对密钥进行随机置换,生成新密钥
def permutation(key):
tables = [hex(_)[2:] for _ in range(16)] # 生成0-15的十六进制表(去掉"0x"前缀)
random.shuffle(tables) # 随机打乱表
newkey = "".join(tables[int(key[_], 16)] for _ in range(len(key))) # 根据原密钥生成新密钥
return newkey
# 生成初始密钥key0及其置换密钥key1
def gen():
key0 = os.urandom(16).hex() # 随机生成16字节密钥并转为十六进制字符串
key1 = permutation(key0) # 对key0进行置换生成key1
return key0, key1
# 使用key0和key1进行双重AES加密
def encrypt(key0, key1, msg):
aes0 = AES.new(key0, AES.MODE_CBC, key1) # 用key0加密,key1作为CBC模式的IV
aes1 = AES.new(key1, AES.MODE_CBC, key0) # 用key1解密,key0作为CBC模式的IV
return aes1.decrypt(aes0.encrypt(msg)) # 先加密后解密生成密文
def decrypt(key0,

最低0.47元/天 解锁文章
8132

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



