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,
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值