是一道较为少见的将鼠标流量混淆的题,值得一做 ~
附件链接:https://pan.baidu.com/s/1fpg74JkqogQflV0z6xTVHA 提取码:x2v4
有关USB流量的知识点详解可见:USB流量知识点小结
上文提到的内容在本篇文章中将不再赘述~
下载附件得到流量包,打开看到Protocol一栏清一色的USB,很显然是USB流量,tshark提取一下
tshark -r jerry.pcapng -T fields -e usb.capdata | sed '/^\s*$/d' > usbdata.txt
得到长度为16的流量数据,不带冒号可以加一下冒号
f=open('usbdata.txt','r')
fi=open('out.txt','w')
while 1:
a=f.readline().strip()
if a:
if len(a)==16: # 鼠标流量的话len改为8
out=''
for i in range(0,len(a),2):
if i+2 != len(a):
out+=a[i]+a[i+1]+":"
else:
out+=a[i]+a[i+1]
fi.write(out)
fi.write('\n')
else:
break
fi.close()
观察得到的数据,8字节的长度理论上应该是键盘流量,跑一下键盘流量的脚本,却没有输出
再看得到的数据,可以发现第一字节大部分都是01
,而在鼠标流量中第一字节的01
恰好代表了鼠标左键的按键信息,但是鼠标流量数据长度只有四字节,我们可以尝试一下用鼠标流量脚本提取前四字节的数据,看看能否得到按键坐标的信息
nums = []
keys = open('out.txt','r')
f = open('xy.txt','w')
posx = 0
posy = 0
for line in keys:
# if len(line) != 12 :
# continue
x = int(line[3:5],16)
y = int(line[6:8],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
if btn_flag == 1 : # 1 代表左键
f.write(str(posx))
f.write(' ')
f.write(str(posy))
f.write('\n')
f.close()
打开生成的xy.txt
文件,可以看到很工整的坐标,正是转换鼠标流量的结果
也就是说这道题出题人将本应该四字节长度的鼠标流量混淆成八字节的长度,以此来增加题的难度
其实题目的标题和题目附件的名字也都有一些提示:T&J
暗示猫和老鼠,而jerry
的名字也暗示了鼠标
将得到的坐标用gnuplot转换成图片
得到图像,看似为上下颠倒的flag,convert命令翻转一下即可
convert -flip 1.png 2.png
得到flag:hexCTF{y3t_an0th3r_pc4p_ch4ll3nge}
总体来看本题并不难,一个单纯的鼠标流量分析,出题人将数据长度稍加混淆,如果可以辨别出来数据的真实面目,就可以轻松解决这道题了