menu Ga1@xy's Wor1d
记一道鼠标流量分析题
676 浏览 | 2020-04-13 | 阅读时间: 约 2 分钟 | 分类: Write Up,MISC | 标签: Misc,刷题wp
请注意,本文编写于 647 天前,最后修改于 647 天前,其中某些信息可能已经过时。

是一道较为少见的将鼠标流量混淆的题,值得一做 ~

[HexionCTF] T&J

附件链接: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转换成图片

  • 注意plot后一定要用双引号包含文件的名称

得到图像,看似为上下颠倒的flag,convert命令翻转一下即可

convert -flip 1.png 2.png

得到flag:hexCTF{y3t_an0th3r_pc4p_ch4ll3nge}

总结

总体来看本题并不难,一个单纯的鼠标流量分析,出题人将数据长度稍加混淆,如果可以辨别出来数据的真实面目,就可以轻松解决这道题了

全部评论

info 评论功能已经关闭了呐!