两个比赛撞到一天了,还好题量都不是很大,题目难度也不是特别高,不过质量也不是很高,但好歹也忙活了一天,最终以红帽第7,津门34(都去冲红帽了)的成绩收尾,也还算不错,在此简单记录下wp
最开始以为m0usb是个啥特殊的usb流量,结果放出了m1bmp才知道就是个题目序号:)
流量包里就是usb流量,内容也比较少,先提取出来
tshark -r usb.pcapng -T fields -e usb.capdata | sed '/^\s*$/d' > usbdata.txt
得到只有 1e 1f 21 25 27 这五种数据的流量,只有一字节的信息所以不可能是鼠标流量,而且坐标也不对,尝试按照键盘流量的方式来做
1e → 1
1f → 2
21 → 4
25 → 8
27 → 0
转换成只有 1 2 4 8 0 这五个数字的字符串,解云影密码
884 0 8 0 81 0 8821 0 81 0 8821 0 42 0 84 0 1 0 421
T H I S I S F L A G
得到flag
flag{THISISFLAG}
bmp隐写方式比较少,常见的就是LSB,直接zsteg一把梭了,再解个base64就是flag
flag{l5DGqF1pPzOb2LU919LMaBYS5B1G01FD}
翻看流量包可以发现dns流量的域名都是一些奇怪的字符串
我们把第一个奇怪的域名复制出来丢进cyberchef,解base64后可以发现是zip的文件头
用tshark把域名信息过滤提取出来
tshark -r tunnel.pcap -T fields -e ip.src -e dns.qry.name -Y 'dns' | grep '192.168.1.103' | grep 'evil.im' > out.txt
再写个脚本还原压缩包,由于有部分丢包现象,所以要判断一下是否重复
import base64
f = open('out.txt', 'r').readlines()
f1 = open('flag.zip', 'w')
f2 = open('base.txt', 'w')
for i in range(len(f) - 1):
if f[i] == f[i + 1]:
continue
a = f[i][14:].strip().replace('.evil.im', '')
if len(a) % 4 == 2:
a += '=='
if len(a) % 4 == 3:
a += '='
#print a
f2.write(a + '\n')
f1.write(base64.b64decode(a))
a = 'QQAAAPs0AAAAAA==' # 把最后一个补上
f2.write(a)
f1.write(base64.b64decode(a))
f1.close()
f2.close()
打开压缩包发现有密码,再结合一堆base64,想到base64隐写,脚本一把梭,得到压缩包密码
password: B@%MG"6FjbS8^c#r
解压得到flag(比赛公告中提到了本题的flag不带符号)
flag{D01nt_5pY_0nmE}
txt打开是乱码,用010打开,复制十六进制,在线网站解一下
flag{we1c0me_t0_redhat2021}
根据题目名可以想到一个有关颜色的编程语言(npiet),刚好不久之前的DASCTF三月赛也出过
data1中是数字0~19,共7067个,分解质因数为 37*191
data2中的数据仔细观察可以发现后面的数据都是有规律的填充,而在填充之前有60字节的数据
RGB三通道对应3个字节,总数60/3刚好对应20个数字,所以想到对应数字转换成颜色,先处理一下data2
000000 0000C0 00FFFF 00FF00 FFC0FF FFC0C0 C0C0FF C0C000 FF00FF FF0000 C00000 C000C0 FFFFFF FFFF00 FFFFC0 00C000 00C0C0 C0FFFF C0FFC0 0000FF
根据分解data1数字总长度唯一得到的长和宽画图
from PIL import Image
x = 37
y = 191
im = Image.new("RGB", (x, y))
f1 = open('data1', 'r').read().split(' ')
f2 = open('data2', 'r').read().split(' ')
flag1 = 0
for xx in range(0, x):
for yy in range(0, y):
rgb = f2[int(f1[flag1])]
flag1 += 1
r = rgb[0:2]
g = rgb[2:4]
b = rgb[4:6]
im.putpixel((xx, yy), (int(r, 16), int(g, 16), int(b, 16)))
im.show()
im.save('out.png')
得到一张图
在线网站识别一下,得到flag
flag{88842f20-fb8c-45c9-ae8f-36135b6a0f11}
需要注意的是一定要保存为png格式,如果是jpg的话会进行有损压缩,无法准确识别到每个像素的信息,就无法得到flag