菜鸟第一次打省赛,浅浅混了个省三QAQ。。
初赛
Misc
题目名称 好怪哦
下载下来得到一个数据逆置的压缩包,直接用逆置脚本
1
2
3
4
5
6
7
|
input = open('fuck.zip', 'rb')
input_all = input.read()
ss = input_all[::-1]
output = open('flag.zip', 'wb')
output.write(ss)
input.close()
output.close()
|
然后解压得到一个缺少png文件头的png文件,补上文件头:89 50 4e 47
打开得到一张CRC有问题的图片,直接上脚本爆破即可拿到flag
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
|
import binascii
import struct
import sys
file = input("图片的地址")
fr = open(file,'rb').read()
data = bytearray(fr[0x0c:0x1d])
crc32key = eval('0x'+str(binascii.b2a_hex(fr[0x1d:0x21]))[2:-1])
#原来的代码: crc32key = eval(str(fr[29:33]).replace('\\x','').replace("b'",'0x').replace("'",''))
n = 4095
for w in range(n):
width = bytearray(struct.pack('>i', w))
for h in range(n):
height = bytearray(struct.pack('>i', h))
for x in range(4):
data[x+4] = width[x]
data[x+8] = height[x]
crc32result = binascii.crc32(data) & 0xffffffff
if crc32result == crc32key:
print(width,height)
newpic = bytearray(fr)
for x in range(4):
newpic[x+16] = width[x]
newpic[x+20] = height[x]
fw = open(file+'.png','wb')
fw.write(newpic)
fw.close
sys.exit()
|
题目名称 神奇的棋盘
下载解压得到一张棋盘图片和一段棋盘加密后的密码:
这段密码是古典密码中的Polybius密码,直接去除逗号拉入随波逐流解密
得到密文:agaxxdaggvggvdvadavxdgadvgdvaaddddfxafafdgdvxxdggdggdxddfddxvgxadgvdfxvvaaddxdxxaddvgggxgxxxxgxxggxgdvvvgggagaaaagaaggagdddagagggaggagagaaavaaaxgxgggxggxgxgxxxv
然后用zsteg跑那个board的图片,得到一串base32,解密得到位移key:
JRQXG5CLMV4XWWLVONQXS6LEON6Q====
LastKey{Yusayyds}
然后用CaptfEncode解ADFGVX密码:
得到一串十六进制字符串 ,最后直接十六进制转字符串得到flag
DASCTF{d859c41c530afc1c1ad94abd92f4baf8}
题目名称 segmentFlow
下载后得到一个压缩包,里面有一个流量文件和七个4字节的文本文件
使用Github上的CRC爆破脚本进行爆破每个文本文件的CRC值,得到解压密码
用tshark导出数据
tshark -r segmentFlow.pcapng -Y “http.request” -T fields -e http.file_data > data1.txt
1
2
3
4
5
6
7
8
9
|
f = open('data.txt','r')
data=f.read()
data=data.split('&sa066b32bfb3e7=')
#print(data.split('&sa066b32bfb3e7='))
#以这个字符串为分隔符,后面八位就是我们要的数据
for i in range(1,len(data)):
#从第一个到最后一个列表
print(data[i][:8],end='')
#一个列表元素的前八位
|
打开压缩包即可得到flag
Reverse
题目名称 ManyCheck
三层验证,前两层拉入ida看或者直接用计算器算出结果:77、55、49
第三层根据ida里的算法,直接写个for循环就出来了:1198089844
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#include <bits/stdc++.h>
using namespace std;
int main()
{
for (int v1 = 0; v1 <= 1718896489; v1++)
{
int v2 = 16;
int v3 = (v1 >> (32 - v2)) | (v1 << v2);
if (v3 == 1718896489)
printf("%d", v1);
}
return 0;
}
|
Web
题目名称 nisc_easyweb
扫出 /api/record/文件 里面有个发送get请求功能的php,利用hackbar发送get请求即可得到flag
题目名称 nisc_学校门户网站
不知道是不是非预期,直接注册然后登录即可得到flag
题目名称 吃豆人吃豆魂
进入web开发者工具,找到game的源码,在index.js中有对生命值和分数的定义,修改分数为10000000,再次请求页面,直接弹出flag
决赛
Misc
题目名称 checkin_gift
下载附件压缩包并解压,得到一张jpg图片,在010中打开
发现图片末尾有一段base64编码,解码即可得到flag:DASCTF{e0155eb8a30c9c3cb0e56708da87bcc5}
题目名称 m4a
下载附件压缩包并解压,可以得到一个m4a.m4a
文件,用VLC打开发现是一个莫斯电码的音频文件
直接使用AU打开,然后手敲出莫斯电码并解码
1
|
-... .- ....- ...-- -... -.-. . ..-. -.-. ..--- ----- ....-
|
解码莫斯可以得到:BA43BCEFC204
用010打开m4a文件,根据zip的文件头发现文件末尾藏了一个逆序的zip压缩包
逆序一下文件,把压缩包提取出来,并使用之前得到的密码解压,可以得到atbash.txt
,内容如下
1
|
(+w)v&LdG_FhgKhdFfhgahJfKcgcKdc_eeIJ_gFN
|
最后对密文先解码rot47
,再atbash
解码即可得到flag:DASCTF{5e0f98a95f79829b7a484a54066cb08f}
题目名称 Unkn0wnData
解压附件压缩包,得到一张flag.png
使用zsteg
扫一下上面这张图片
发现图片末尾藏了一段base64编码,然后LSB中也隐写了一个压缩包
解码上面那段base64可以得到一串emoji表情
1
2
3
|
Where1sKey?
🙃💵🌿🎤🚪🌏🐎🥋🚫😆✅🍍🎤🐘🌏ℹ⌨😍🎈✉🤣🛩🍌🚪🍴ℹ☺🚹❓🍴🔬🌪🍵👣🔄☃👌😎👌🔄👌🔪🍌👁🍍🍌🌏🎃🚰🍵🐍🎅✅🍍🦓😎😊🤣🏹🍍💧🔄🔄🤣👁🥋🚫☺🍴😁🚫😇🚰⏩😍🌿💵🦓😇🛩✖🕹🐎📂📂💧🗒🗒
|
尝试用zsteg
提取出隐写的数据,并用010转换为压缩包并解压
解压后可以得到1.txt
,内容如下:
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
data:
0000100000000000
00000c0000000000
00000e0000000000
00002a0000000000
0000100000000000
0000040000000000
0000080000000000
00002a0000000000
0000160000000000
00000b0000000000
00000c0000000000
00001c0000000000
00002a0000000000
00002c0000000000
0200340000000000
00002a0000000000
0200090000000000
00000c0000000000
0000110000000000
0000070000000000
0200170000000000
00002a0000000000
0200170000000000
00000b0000000000
0000080000000000
0000120000000000
00002a0000000000
0200150000000000
0000080000000000
0000040000000000
00000f0000000000
00000a0000000000
00002a0000000000
02000e0000000000
0000080000000000
00001c0000000000
00000a0000000000
00002a0000000000
0000040000000000
0000110000000000
0000070000000000
00000f0000000000
00002a0000000000
0200100000000000
0000040000000000
00000e0000000000
0000080000000000
0000080000000000
00002a0000000000
02000c0000000000
0000170000000000
02001e0000000000
0000070000000000
00002a0000000000
|
感觉是键盘的数据,因此使用USB流量分析中的脚本进行提取
1
2
3
|
mik<DEL>mae<DEL>shiy<DEL><SPACE>:<DEL>FindT<DEL>Theo<DEL>Realg<DEL>Keyg<DEL>andl<DEL>Makee<DEL>It!d<DEL>
mimashi FindTheRealKeyandMakeIt!
密码是找到真正的密钥
|
这里发现真正的key被<DEL>
字符删去了,因此我们把删去的字符单独提取出来得到:key:Toggled
最后使用得到的密钥解一个emoji-AES
即可得到flag:DASCTF{ad15eecd2978bc5c70597d14985412c4}
题目名称 hard_Digital_plate
下载附件压缩包并解压,可以得到一个hard_Digital_plate.pcapng
流量包
用wireshark打开,发现提示流量包损坏,因此我们使用010打开
在流量包末尾发现藏了一个zip压缩包,直接用010手动提取出来
提出来的压缩包解压后可以得到oursecret.jpg
,文件名提示了oursecret隐写
因此我们需要继续寻找解密的密钥
打开并翻看流量包,发现有USB流量的特征,赛后知道了是数位板的流量
尝试使用 tshark
导出这一字段的数据
1
|
tshark -r hard_Digital_plate.pcapng -T fields -e usb.capdata | sed '/^\s*$/d' > out.txt
|
导出的部分数据如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
|
088076259e38000000000000
088074259b38000000000000
088072259838000000000000
088070259438000000000000
08806e259038000000000000
08816c258c38f00000000000
08816a258838d40100000000
088164258038190400000000
088161257d38170500000000
08815d257a380c0600000000
0881592577380e0700000000
088155257438110800000000
|
经过分析,发现前四位的数据0881
是无效的数据,应该表示的是设备的特征
然后[4:8]
的数据表示X坐标,[8:12]
的数据表示的是Y坐标,[12:16]
的数据则表示压感
这里要注意的一点就是这里坐标的数据是以小端序存储的,所以需要字节交换
我这里就直接高字节的数据乘上 0xff
然后加上低字节数据转为十进制坐标了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
with open("out.txt","r") as f:
lines = f.readlines()
def draw_pic1():
x = []
y = []
for line in lines:
if(int(line[12:16],16) != 0):
press_data = int(line[12:16],16)
x.append(int(line[6:8],16)*0xff+int(line[4:6],16))
y.append(-1 * (int(line[10:12],16)*0xff+int(line[8:10],16)))
plt.scatter(x,y)
plt.grid() # 显示网格
plt.show()
|
根据提取出的数据得到坐标,然后画图可以得到下图
得到密钥:kfae5y4wi2shwj81y2kda6ax7x
结合之前得到的oursecret.jpg
,我们使用oursecret结合上面的密钥进行解密
可以得到一个flag.txt,提取出来并打开可以得到如下内容:
1
|
U2FsdGVkX18jQgWzhln3pPiVK8gaBxIzhY1JWcFlKiRdBkV/jDmEBxJV9PZmwBJ7MU3IdNf4hWryZLYRLuxA4w==
|
感觉是AES解密了,解密需要密钥,因此我们继续寻找解密的密钥
在oursecret.jpg
的exif信息中发现Hint
猜测是需要我们根据压感大小提取先前的数位板数据
写一个脚本,查看一下数位板的压感数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
press_lst = []
with open("out.txt","r") as f:
lines = f.readlines()
def draw_pic2():
x = []
y = []
for line in lines:
if(int(line[12:16],16) != 0):
press_data = int(line[12:16],16)
press_lst.append(press_data)
if(press_data < 65000):
x.append(int(line[6:8],16)*0xff+int(line[4:6],16))
y.append(-1 * (int(line[10:12],16)*0xff+int(line[8:10],16)))
plt.scatter(x,y)
plt.grid() # 显示网格
plt.show()
|
发现有很多65331
的数据,因此我们尝试把压感数据低于65000
的坐标都提取出来并画图
得到AES的密钥:w12kax,最后解密AES即可得到flag:DASCTF{46f7bd763f4f6ec266ed481bc576f7b0}
完整数位板流量解题代码如下:
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
35
36
37
38
39
40
|
import matplotlib.pyplot as plt
press_lst = []
with open("out.txt","r") as f:
lines = f.readlines()
def draw_pic1():
x = []
y = []
for line in lines:
if(int(line[12:16],16) != 0):
press_data = int(line[12:16],16)
x.append(int(line[6:8],16)*0xff+int(line[4:6],16))
y.append(-1 * (int(line[10:12],16)*0xff+int(line[8:10],16)))
plt.scatter(x,y)
plt.grid() # 显示网格
plt.show()
def draw_pic2():
x = []
y = []
for line in lines:
if(int(line[12:16],16) != 0):
press_data = int(line[12:16],16)
press_lst.append(press_data)
if(press_data < 65000):
x.append(int(line[6:8],16)*0xff+int(line[4:6],16))
y.append(-1 * (int(line[10:12],16)*0xff+int(line[8:10],16)))
plt.scatter(x,y)
plt.grid() # 显示网格
plt.show()
if __name__ == "__main__":
draw_pic1()
draw_pic2()
print(press_lst)
|