2021第四届浙江省大学生网络与信息安全竞赛预赛writeup记录


misc

听说你在找flag?

参考:
1.http://www.werewolfcjj.top/2021/10/24/2021%e6%b5%99%e6%b1%9f%e7%9c%81%e8%b5%9b%e5%8f%8a%e8%b5%9b%e5%90%8e%e5%a4%8d%e7%8e%b0/
Foremost或者010搜50 4b 03 04分出最上面一个zip

预期的解应该是根据压缩包的提示找

1
2
3
4
The most specific one and its delay, repeat twice
最多的特殊的和他的delay,重复两次
1*1000/10=100
2*1000/25=80

misc1-1.jpg

apng的delay知识
然后在找到他的帧块数,从0数到10。就是1080,在重复两次就是10801080
misc1-2.jpg

爆破zip文件包。爆破应该就是非预期的解了
10801080
找到压缩包里最大的图片
图片2.png

往后看,有base64
图片3.png

扔CyberChef里。保存成png图片
图片4.png

其他块无问题。尝试修改高度
图片5.png

图片里的base64抄下来,继续扔进去解密。
图片6.png

拿着上一步的密码去解rar的文件
图片7.png

qrimg

再次参考大佬的脚本
1.http://www.werewolfcjj.top/2021/10/24/2021%e6%b5%99%e6%b1%9f%e7%9c%81%e8%b5%9b%e5%8f%8a%e8%b5%9b%e5%90%8e%e5%a4%8d%e7%8e%b0/

脚本的原理就是打开每张图片,在来取出blue通道的最低图片,用黑白填充。最后在pyzbar解码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from PIL import Image
import pyzbar.pyzbar as pyzbar

for count in range(1,313):
img = Image.open('.//img-pic//'+str(count)+'.png')
img = img.convert('RGB')
width,height=img.size
result = ""
for i in range(0,height):
for j in range(0,width):
tmp = img.getpixel((j,i))
result += bin(tmp[2])[-1]
a = 0
pic = Image.new("RGB",(288,360))
for y in range(0,360):
for x in range(0,288):
if(result[a] == '0'):
pic.putpixel([x,y],(0,0,0))
else:
pic.putpixel([x,y],(255,255,255))
a += 1
img_size = pic.size
barcodes = pyzbar.decode(pic)
for barcode in barcodes:
barcodeDATA = barcode.data.decode("utf-8")
print(barcodeDATA,end="")


reverse

crackPYC

这边主要的参考文章:

1.
https://bbs.pediy.com/thread-246683.htm

2.
https://docs.python.org/2.7/library/dis.html

3.
https://docs.python.org/zh-cn/3/library/dis.html

把python的字节码翻译成python语言。
这块翻译的是文件下半部分针对key的处理
crackpyc-2.jpg

这一块就是针对key和data出最后flag的操作
把文件翻译成字节码。方便自己查看。
python2 -m dis exp.py

1
2
3
4
5
6
7
8
9
先把变量和数组翻译出来,一对一对的翻译。
这里的最前面应该是data[i],有个binary_subscr处理。

然后就是下面应该就是key,i,len(key)三个。然后倒着来看,把len(key)+binary_modulo就是%len(key)。然后就是i%len(key)。

最后还有个key,有个binary_subscr的处理。就是key[i%len(key)]。

在加上最后的binary_xor。再把上面的data[i]和key[i%len(key)]合起来。就是a+=chr(data[i]^key[i%len(key)])

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
for i in range(len(data))

BINARY_SUBSCR
实现 TOS = TOS1[TOS] 。
data[i]

data[i]^key[i%len(key)]

BINARY_MODULO
实现 TOS = TOS1 % TOS

BINARY_SUBSCR
实现 TOS = TOS1[TOS]

BINARY_XOR
实现 TOS = TOS1 ^ TOS

最后的脚本就如下了,抄自0rays-wp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def initkey():
num=0
key=[]
for i in range(8):
num -= 7508399208111569251
num %= 4294967295
key.append(num >> 24)
return key
data=[108,17,42,226,158,180,96,115,64,24,38,236,179,179,34,22,81,113,38,215,165,135,68,7,119,97,45,254,250,172,43,62]
key=initkey()
a=""
for i in range(len(data)):
a+=chr(data[i]^key[i%len(key)])
print(a)

crackpyc-1.jpg

还有一种应该是把文件分成了两个来解读,先算出了key

1
2
3
4
5
6
num = 0
key=[]
for i in range(8):
num = (num - 7508399208111569251) %4294967295
key.append(num>>24)
print(key)

crackpyc-3.jpg

再把key带回计算得到flag

1
2
3
4
5
6
key = [40, 80, 121, 161, 202, 242, 27, 67]
text = [108,17,42,226,158,180,96,115,64,24,38,236,179,173,34,22,81,113,38,215,165,135,68,7,119,97,45,254,250,172,43,62]
flag = ""
for i in range(len(text)):
flag += chr(key[i%len(key)] ^ text[i])
print(flag)#DASCTF{0hH_My_9Uy!_vou_D_1T_0^0}

crackpyc-4.jpg


crypto

Easy Railfence

直接爆破offset和key的
crypto1-1.jpg

改自0rays的脚本,前面都是一样的,就是给了m,然后循环x和y。根据生成后的字符串来控制了两个括号位置的约束。跑出的后面应该也是括号位置相同?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import hashlib
import sys
data = []
def encrypt(c,rails,offset):
try:
c = '$' * offset + c
length = len(c)
result = {x: "" for x in range(rails)}
for a in range(length):
width = rails * 2 - 2
num = a % width
if (num < rails):
result.update({num: result[num] + c[a]})
else:
ll = 2 * rails - 2 - num
result.update({ll: result[ll] + c[a]})
d = ""
for k in range(rails):
d = d + result[k]
d = d.replace('$', '')
data.append(d)
# print(data)
# with open("ts.txt","w") as tw:
# tw.write(data)
for i in data:
if i[23] == '}' and i[42] == '{':
print(i,rails,offset)
except:
pass
m = "flag{111111111111111111111111111111111111111111111111111111111}"
for x in range(0,20):
for y in range(0,20):
encrypt(m,x,y)
# print(a)

crypto1-2.jpg


web

checkin

直接抓包,看response,头部有flag