# 第一届 “吾杯” 网络安全技能大赛

# Web

# Sign

题目提示了 “输入密码即可使用蚁剑”,直接尝试蚁剑连接即可,然后在根目录下发现 flag 文件

Web-Sgin2.png
Web-Sign1.png
Web-Sign.png

# Crypto

# Easy

题目中给出的伪代码和数据描述了如何生成密钥流并用它来 解密 flagkey = "hello world" 是解密的密钥。

要恢复原始的 flag ,我们需要逆向加密过程,步骤如下:

  1. 初始化状态
    • 我们将 S 数组初始化为 0-255 ,并用 key 填充 T 数组。
  2. 扰乱数组
    • 按照伪代码中给定的方式,通过 s[i]s[j] 的交换来扰乱数组 S
  3. 生成密钥流
    • 通过伪代码中的逻辑生成密钥流。
  4. 解密操作
    • 使用生成的密钥流与加密后的 flag 数据进行异或操作,恢复原始的 flag

编写脚本:

# RC4解密实现

def rc4_decrypt(key, encrypted_flag):
    # 初始化S和T数组
    S = list(range(256))
    T = [ord(key[i % len(key)]) for i in range(256)]

    # 初始化密钥流生成
    j = 0
    for i in range(256):
        j = (j + S[i] + T[i]) % 256
        S[i], S[j] = S[j], S[i]

    # 解密过程
    i = j = 0
    decrypted_flag = []
    for m in range(len(encrypted_flag)):
        i = (i + 1) % 256
        j = (j + S[i]) % 256
        S[i], S[j] = S[j], S[i]
        x = (S[i] + S[j]) % 256
        decrypted_flag.append(encrypted_flag[m] ^ S[x])

    return bytes(decrypted_flag).decode('utf-8', errors='ignore')


# 读取1.txt中的加密内容
hex_data = 'd8d2 963e 0d8a b853 3d2a 7fe2 96c5 2923 3924 6eba 0d29 2d57 5257 8359 322c 3a77 892d fa72 61b8 4f'
encrypted_flag = bytes.fromhex(hex_data.replace(' ', ''))

# 解密
key = 'hello world'
flag = rc4_decrypt(key, encrypted_flag)

print("解密后的flag:", flag)

image-20241201213143503.png

# MISC

# Sign

签到题,直接丢到 **“随波逐流”** 一把梭,得到结果

MISC-Sign.png

# 太极

根据题目的几个提示,可以猜到是拼音有关,先查看页面给出的内容,转换一下字体,得到正确的中文内容

2024-12-01-213614.png
然后根据提示分析拼音提取的规律,不难发现是根据每个字符的位置按照 “1、2、3、4、5” 的顺序循环,这里需要注意的是不够的字符就重头循环,随后可以得到后面的字符内容

完整的 flag: WuCup{tieny-lieig-sieau-bunig-jieay}

# 旋转木马

给了两个很大的文件,这里最先开始尝试了 base64 分别解码,有点问题,厨子还解不了,后面发现两段内容的格式差不多,尝试在 flag1 后拼接 flag2 的内容

0.png

这里知道厨子解不了这么大的后,想到编写脚本解 base64,然后即是循环解 base64,得到内容:1.png

循环解 base64 脚本:

# -*- coding:utf-8 -*-
# 使用说明:直接在脚本中设置文件路径,脚本会读取并进行多次Base64解码

import base64


def base64decoding_from_file(file_path):
    try:
        with open(file_path, 'r') as file:
            # 读取文件中的Base64编码内容
            src = file.read().strip()

        num = 0
        while True:
            try:
                # 尝试Base64解码
                src = base64.b64decode(src)
                num += 1
            except Exception as e:
                # 解码失败,打印结果并结束循环
                print(f"[+] The result of decoding is: {src.decode('utf-8', 'ignore')}")
                print(f"[+] The number of decoding is: {num}")
                break
    except FileNotFoundError:
        print(f"[-] Error: The file '{file_path}' was not found.")
    except Exception as e:
        print(f"[-] An error occurred: {e}")


if __name__ == '__main__':
    # 直接在此指定你的Base64编码文件路径
    file_path = r'path'  # 在这里替换为你的文件路径
    base64decoding_from_file(file_path)

将这段内容丢到 **“随波逐流”** 一把梭,即可得到 flag:
2.png

# 原神启动!

给了一个图片和一个压缩包,压缩包发现有密码,从图片入手,尝试后发现用 **“Stegsolve”** 工具查看 Red plane 2 下有密码 1: WuCup{7c16e21c-31c2-439e-a814-bba2ca54101a}

image-20241201215330710.png
解开压缩包后,发现是 docx 文件,docx 文件可以直接改后缀为 zip 文件,解压。

又发现一个 img.zip 文件,同样需要密码,同时在 media 目录下发现一张图片,能隐约看到字符,同样是 **“Stegsolve”** 工具查看 Gray bits 得到密码 2: WuCup{6bb9d97d-7169-434b-a7cf-0ee0b6fdfa30}

image-20241201220543031.png

解压 img.zip 后得到 text.zip 文件,这里最先想到直接爆破,但考虑到前几个密码的格式,爆破时间也不现实,就回头找 docx 里面是否还藏了东西,后来逐个检查文件内容,发现 /word/document.xml 内容有断断续续的密码,拼接后即是密码 3: WuCup{f848566c-3fb6-4bfd-805a-d9e102511784}

image-20241201220209452.png

最后解出 text.txt 内容:
image-20241201220400676