2025ucsc高校联赛wp

191天前 · CTFのwriteup · 23次阅读

就做出6道那我也要发个博客(bushi)

解题情况

解题过程

1 Web1 ezLaravel-ucsc

操作内容:

直接访问/flag.php,就拿到flag了,纯签到

flag值:

flag{75ba04c8-1076-4361-abd6-088aa6680c32}

1 MISC three-ucsc

操作内容:

根据题目可以看到是分成三部分的flag,首先看第一部分,给了一个png和盲水印工具,但是我没打开(可能是环境问题),但提示的很明显是盲水印,用puzzlesolver跑一下即可得到第一部分的flag

很糊,但还是勉强认出来了第一部分为8f02d3e7

接着看第二部分,给了01二进制数,cyberchef跑一下看看

直接点小魔法棒全出来了,第二部分为-CE89-4D6B-830E-注意要转小写

然后第三部分是一个加密压缩包,010查看后知道是真加密,还有个流量包没用,查看一下找密码。追踪http流可以发现一个shell.php,提权获得了访问权限,往下翻发现打开了个pass.txt,提取出来放字典里跑一下,成功解密zip,拿到最后一部分的flag:5d0cb5695077

image-20250420222053962

flag值:

flag{8f02d3e7-ce89-4d6b-830e-5d0cb5695077}

3 MISC2 USB-ucsc

操作内容:

Ctf-NetA一把梭,签到题

image-20250420222022054

flag值:

flag{ebdfea9b-3469-41c7-9070-d7833ecc6102}

4 MISC4 小套不是套-ucsc

操作内容:

给了三个文件,一个二维码两个压缩包,压缩包都是真加密,扫一下二维码得到tess的密码

打开里面有个压缩包,随波逐流检查发现伪加密,修复一下把里面的图解压一下

image-20250420221954214

用010打开观察jpg文件末尾出现多余的数据,且能看到ihdr,明显是缺少文件头的png,手工修复一下。

得到一张png图片,继续观察010,发现末尾也多出一点东西,是oursecrt的加密特征,寻找以下解密密钥。目光放回没用的最后一个加密压缩包。压缩包里的文件都是四字节大小,尝试crc碰撞,成功获取密钥字符串的多重base编码,cyberchef解码即可

image-20250420221924406

用密钥解密oursecret,得到flag

flag值:

flag{6f6bf445-8c9e-11ef-a06b-a4b1c1c5a2d2}

5 Crypto4 XR4-ucsc

操作内容:

观察代码就是rc4带矩阵加密,把给出的逻辑逆向还原再把给出的矩阵转置恢复回data矩阵即可,用ai将逻辑还原

flag值:

flag{c570ee41-8b09-11ef-ac4a-a4b1c1c5a2d2}

6 Reverse2 easy_re-ucsc

操作内容:

首先die查壳发现无壳,ida打开,反汇编主函数很明显看到flag加密后和输入有个对比,直接把加密逻辑反过来解密就行

flag值:

flag{d7610b86-5205-3bf3-b0f4-84484ba74105}

后续复现misc noshark

neta分析发现qry域名带了很多01二进制数据,放入puzzlesolver转一下得到二维码,需要手工补全两个定位块

image-20250420203728735

image-20250420204507602

得到一个字符串疑似密钥,接着根据题干寻找snow隐写相关的html文件,用刚才的字符串解密,得到后半flag

image-20250420204716482

image-20250420205412944

neta还在ftp里得到一个jpg,用silenteye解密key在穿的png末尾image-20250420210018569

image-20250420205931456

这个参数给的很明确,猫脸变化,找个脚本一跑就行((下面是参考脚本没有改参数)

from PIL import Image

def arnold(infile: str, outfile: str = None, a: int = 1, b: int = 1, shuffle_times: int = 1, reverse: bool = False) -> None:

"""
Arnold猫脸变换函数

Parameters:
    infile - 输入图像路径
    outfile - 输出图像路径
    a - Anrold 变换参数
    b - Anrold 变换参数
    shuffle_times - 置乱次数
    reverse - 逆变换
"""
inimg = Image.open(infile)
width, height = inimg.size
indata = inimg.load()
outimg = Image.new(inimg.mode, inimg.size)
outdata = outimg.load()

for _ in range(shuffle_times):
    for x in range(width):
        for y in range(height):
            if reverse:
                nx = ((a * b + 1) * x - a * y) % width
                ny = (y - b * x) % height
            else:
                nx = (x + a * y) % width
                ny = (b * x + (a * b + 1) * y) % height
            outdata[ny, nx] = indata[y, x]

outimg.save(outfile if outfile else "arnold_"+infile, inimg.format)

arnold("before.png", "encode.png", 9, 39, 1)
arnold("encode.png", "decode.png", 9, 39, 1, True)

前半截也得到

img

reverse ez debug

可以动调一把梭,但好巧不巧坏了,扒出来主函数,swap,rc4init,rc4crypt用ai跑一下出调试代码,注意加密数据还有v6的值

import struct

====================== RC4 初始化(对应 rc4_init)======================

def rc4_init(key):

sbox = list(range(256))
j = 0
key_len = len(key)
for i in range(256):
    j = (j + sbox[i] + key[i % key_len]) % 256
    sbox[i], sbox[j] = sbox[j], sbox[i]
return sbox
====================== RC4 加解密(对应 rc4_crypt)======================

def rc4_crypt(sbox, data_bytes):

v5 = 0  # 对应 C 代码中的 v5(初始化为 0)
v4 = 0  # 对应 C 代码中的 v4(初始化为 0)
decrypted = []
for i in range(len(data_bytes)):
    v5 = (v5 + 1) % 256          # v5 = (v5 + 1) % 256
    v4 = (v4 + sbox[v5]) % 256    # v4 = (v4 + sbox[v5]) % 256
    sbox[v5], sbox[v4] = sbox[v4], sbox[v5]  # 交换 sbox[v5] 和 sbox[v4]
    key_byte = sbox[(sbox[v5] + sbox[v4]) % 256]  # 生成密钥字节
    decrypted_byte = data_bytes[i] ^ key_byte     # 异或解密
    decrypted.append(decrypted_byte)
return bytes(decrypted)
====================== 主逻辑:处理输入数据 ======================
密钥:"UCSC" 转换为字节(ASCII:0x55, 0x43, 0x53, 0x43)

key = b"UCSC"

待解密的 v5 数组(__int64 小端序存储,每个占 8 字节)

v5_values = [

0xf83c7a0eec839b08,
0x6a5fc85838a80e3f,
0x225f1b81391e8aab,
0xb1e975647a309f64,
0x90bd7bab00000000

]

将 __int64 转换为小端字节流(C 语言原生格式)

data_bytes = b""
for num in v5_values:

data_bytes += struct.pack('>Q', num)  # 小端序转换
初始化 & 解密

sbox = rc4_init(key)
decrypted_data = rc4_crypt(sbox, data_bytes)

====================== 新增:大端序输出处理 ======================

def bytes_to_big_endian_ints(byte_data):

"""将字节流按大端序解析为 64 位整数列表"""
ints = []
for i in range(0, len(byte_data), 8):
    chunk = byte_data[i:i+8]
    if len(chunk) < 8:
        break  # 不足 8 字节时忽略(正常情况不会发生)
    big_endian_int = struct.unpack('>Q', chunk)[0]
    ints.append(big_endian_int)
return ints

def bytes_to_hex_with_endian(byte_data, endian='little'):

"""按指定端序分组显示十六进制(每 8 字节一组)"""
hex_str = byte_data.hex()
groups = []
for i in range(0, len(hex_str), 16):  # 每组 8 字节对应 16 个十六进制字符
    group = hex_str[i:i+16]
    if endian == 'big':
        group = group[::-1]  # 大端序需反转每组字符(每 2 字节交换,总长度反转)
    groups.append(group)
return ' '.join(groups)
====================== 输出结果(含大端序)=====================

print("==================== 小端序相关输出 ====================")
print("原始数据(小端字节流,十六进制):", data_bytes.hex())
print("解密后数据(字节流):", decrypted_data)
print("解密后字符串(小端解析):", decrypted_data.decode('ascii', errors='ignore'))

print("\n==================== 大端序相关输出 ====================")

大端序十六进制(每 8 字节一组,高位在前)

big_endian_hex = bytes_to_hex_with_endian(decrypted_data, endian='big')
print("解密后数据(大端序十六进制,每组 8 字节):", big_endian_hex)

大端序整数(若数据有意义)

big_endian_ints = bytes_to_big_endian_ints(decrypted_data)
print("解密后数据(大端序 64 位整数):", big_endian_ints)

大端序字节流(用于验证,实际 RC4 处理的是原始字节序)
注意:RC4 不依赖端序,此处仅为显示格式转换

big_endian_bytes = b''
for num in v5_values:

big_endian_bytes += struct.pack('>Q', num)  # 仅用于演示大端序原始数据(非解密对象)

print("\n原始数据(大端序字节流,仅演示):", big_endian_bytes.hex())

image-20250420221831311

👍 0

none

最后修改于32天前

评论

贴吧 狗头 原神 小黄脸
收起

贴吧

  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡
  • 贴吧泡泡

狗头

  • 狗头
  • 狗头
  • 狗头
  • 狗头
  • 狗头
  • 狗头
  • 狗头
  • 狗头
  • 狗头
  • 狗头
  • 狗头
  • 狗头

原神

  • 原神
  • 原神
  • 原神
  • 原神
  • 原神
  • 原神
  • 原神
  • 原神
  • 原神
  • 原神
  • 原神
  • 原神
  • 原神
  • 原神
  • 原神
  • 原神
  • 原神
  • 原神
  • 原神
  • 原神
  • 原神
  • 原神
  • 原神

小黄脸

  • 小黄脸
  • 小黄脸
  • 小黄脸
  • 小黄脸
  • 小黄脸
  • 小黄脸
  • 小黄脸
  • 小黄脸
  • 小黄脸
  • 小黄脸
  • 小黄脸
  • 小黄脸
  • 小黄脸
  • 小黄脸
  • 小黄脸
  • 小黄脸
  • 小黄脸
  • 小黄脸
  • 小黄脸
  • 小黄脸
  • 小黄脸
  • 小黄脸
  • 小黄脸
  • 小黄脸
  • 小黄脸
  • 小黄脸
  • 小黄脸
  • 小黄脸
  • 小黄脸
  • 小黄脸
  • 小黄脸
  • 小黄脸
  • 小黄脸
  • 小黄脸
  • 小黄脸
  • 小黄脸
  • 小黄脸
  • 小黄脸
  • 小黄脸
  • 小黄脸
  • 小黄脸
  • 小黄脸
  • 小黄脸
  • 小黄脸
  • 小黄脸

目录

avatar

n1tro

这里是ctf菜狗n1troの小站

18

文章数

0

评论数

3

分类

awsl!

awsl!