V3D4's Blog

安全技术记录/分享/交流

0%

DASCTF八月赛-misc-eeeeeeeasyusb

这道题是这次八月赛的一道200分的杂项,脑洞挺多,题目质量也好,不愧是L1near师傅出的题,i了i了

零宽字符和坚果云

首先这道题目给的信息真的非常的少,就一个txt文件,当时比赛的时候真的几乎啥也没看出来

打开txt,可以看到给了一串神秘代码

image-20200827202229483

当时还以为是aes加密啥的,完全没想到居然是个网盘后缀

为什么是坚果云呢?这就涉及到这串字符中的零宽字节隐写了,当时比赛的时候我也发现了这么几个字符文件大小怎么就114字节了,但完全没想零宽字符,我太菜了┭┮﹏┭┮

使用vim就可以清晰的看得到这些零宽字符

image-20200827204340565

这里给出一个解码网站,将整一串字符复制过去解码,可以得到nut,也就想到了坚果云,如图

image-20200827202846411

需要注意的是每个零宽字节网站解码出来的结果可能都不一样,所以比赛的时候有些师傅没解对,参考Ga1@xy’s师傅的这篇博客,这个网站也是师傅这取的

去网上找了一番坚果云的前缀,居然没找到,最后自己注册了一个,发现前缀就是jianguoyun.com/p/,emmm

image-20200827203957785

最后去这个地址可以看到是L1near师傅分享的一个文件,密码就是JmTjw‍‌到此,第一步算是告一段落

image-20200827204132191

USB流量分析与键盘鼠标流量解码脚本

下载下来上面的文件后发现是两个usb的流量包,鉴于之前也没怎么做过usb的流量分析题,所以又进行了一番搜索学习

image-20200827205013862

主要参考了这篇文章fzwjscj师傅的wp

USB协议的数据部分在Leftover Capture Data域之中,在Mac和Linux下可以用tshark命令可以将 leftover capture data单独提取出来 命令如下:

1
2
tshark -r part1.pcapng -T fields -e usb.capdata > usb1data.txt
tshark -r part2.pcapng -T fields -e usb.capdata > usb2data.txt

其中part1是鼠标的,part2是键盘的,提取出来如下图

image-20200827205700648

然后就是要用脚本来进行解码了,这里就直接用fzwjscj师傅写好的脚本了,直接用csdn里的那个脚本是解不出来的,要稍微修改,比赛里也提示了是1 3 5字节

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
#!/usr/bin/env python
# coding=utf-8

nums = []
keys = open('usb1data.txt','r')
posx = 0
posy = 0
res = open('res.txt','a')
for line in keys:
try:
x = int(line[4:6],16)
y = int(line[8:10],16)
if x > 127 :
x -= 256
if y > 127 :
y -= 256
posx += x
posy += y
btn_flag = int(line[0:2],16) # 1 for left , 2 for right , 0 for nothing
# print(line[4:6])
if btn_flag == 1 :
print(posx,posy)
res.write(str(posx)+' '+str(posy))
res.write('\n')
except:
pass
res.close()
#0:2 4:6 8:10对应的就是1,3,5

这个脚本运行后得到的是一串坐标,需要用Gnuplot这个软件来绘制出图片,kali上apt安装就行,至于这个软件怎么用可以看看这篇文章

image-20200827210411134

这里用到的命令是

>plot “res.txt” using 1:2

*以第一列为x轴,第二列为y轴,绘制二维数据图

得到一张上下镜像的图,上下镜像翻转即可得到flag前半段

123.jpg

批注 2020-08-27 192423

flag part1: 166433882cd04aaa

然后就是第二段了,这里也直接贴一个fzwjscj师傅的脚本

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
#!/usr/bin/env python
# coding=utf-8
normalKeys = {"04":"a", "05":"b", "06":"c", "07":"d", "08":"e", "09":"f", "0a":"g", "0b":"h", "0c":"i", "0d":"j", "0e":"k", "0f":"l", "10":"m", "11":"n", "12":"o", "13":"p", "14":"q", "15":"r", "16":"s", "17":"t", "18":"u", "19":"v", "1a":"w", "1b":"x", "1c":"y", "1d":"z","1e":"1", "1f":"2", "20":"3", "21":"4", "22":"5", "23":"6","24":"7","25":"8","26":"9","27":"0","28":"<RET>","29":"<ESC>","2a":"<DEL>", "2b":"\t","2c":"<SPACE>","2d":"-","2e":"=","2f":"[","30":"]","31":"\\","32":"<NON>","33":";","34":"'","35":"<GA>","36":",","37":".","38":"/","39":"<CAP>","3a":"<F1>","3b":"<F2>", "3c":"<F3>","3d":"<F4>","3e":"<F5>","3f":"<F6>","40":"<F7>","41":"<F8>","42":"<F9>","43":"<F10>","44":"<F11>","45":"<F12>"}

shiftKeys = {"04":"A", "05":"B", "06":"C", "07":"D", "08":"E", "09":"F", "0a":"G", "0b":"H", "0c":"I", "0d":"J", "0e":"K", "0f":"L", "10":"M", "11":"N", "12":"O", "13":"P", "14":"Q", "15":"R", "16":"S", "17":"T", "18":"U", "19":"V", "1a":"W", "1b":"X", "1c":"Y", "1d":"Z","1e":"!", "1f":"@", "20":"#", "21":"$", "22":"%", "23":"^","24":"&","25":"*","26":"(","27":")","28":"<RET>","29":"<ESC>","2a":"<DEL>", "2b":"\t","2c":"<SPACE>","2d":"_","2e":"+","2f":"{","30":"}","31":"|","32":"<NON>","33":"\"","34":":","35":"<GA>","36":"<","37":">","38":"?","39":"<CAP>","3a":"<F1>","3b":"<F2>", "3c":"<F3>","3d":"<F4>","3e":"<F5>","3f":"<F6>","40":"<F7>","41":"<F8>","42":"<F9>","43":"<F10>","44":"<F11>","45":"<F12>"}

nums = []
keys = open('data.txt')
for line in keys:
if len(line)!=17: #首先过滤掉鼠标等其他设备的USB流量
continue
nums.append(line[0:2]+line[4:6]) #取一、三字节
keys.close()
output = ""
for n in nums:
if n[2:4] == "00" :
continue

if n[2:4] in normalKeys:
if n[0:2]=="02": #表示按下了shift
output += shiftKeys [n[2:4]]
else :
output += normalKeys [n[2:4]]
else:
output += '[unknown]'
print('output :\n' + output)

得到输出

1
2
output :
056<F2><F2><F2><F2><F3><F2><F2><F2><F3><F3>4<F2><F2><F2><F2><F2><F2><F2><F2><F3><F3>29<F2><F2><F2><F2><F3><F2><F2><F2><F2><F3>522<F2><F2><F2><F2><F3>

这最后还是需要一点脑洞,根据part1又16位,part2应该也有16位,已知的9位以及35个F2,F3,以可知道5个F2,F3为一个字符,所以位培根密码,F2是a,F3是b,最后解码即可

flag part2:056bd4ad29bb522b

flag

flag:166433882cd04aaa056bd4ad29bb522b