1. 程式人生 > >記一道USB流量分析CTF題

記一道USB流量分析CTF題

拿到資料包使用wireshark開啟後看到Protocol 為USB協議,搜到了一篇關於USB流量分析的文章

下面看題

這裡寫圖片描述

USB協議的資料部分在Leftover Capture Data域之中,在Mac和Linux下可以用tshark命令可以將 leftover capture data單獨提取出來 命令如下:

tshark -r usb1.pcapng -T fields -e usb.capdata > usbdata.txt

執行命令並檢視usbdata.txt 發現數據包長度為八個位元組

這裡寫圖片描述

這裡查到USB流量分為鍵盤流量和滑鼠流量。

鍵盤資料包的資料長度為8個位元組,擊鍵資訊集中在第3個位元組,每次key stroke都會產生一個keyboard event usb packet。

滑鼠資料包的資料長度為4個位元組,第一個位元組代表按鍵,當取0x00時,代表沒有按鍵、為0x01時,代表按左鍵,為0x02時,代表當前按鍵為右鍵。第二個位元組可以看成是一個signed byte型別,其最高位為符號位,當這個值為正時,代表滑鼠水平右移多少畫素,為負時,代表水平左移多少畫素。第三個位元組與第二位元組類似,代表垂直上下移動的偏移。

這裡資料包長度是八個位元組顯然為鍵盤資料包

第53頁有usb keyboard的對映表 根據這個對映表有寫指令碼解碼得出的資料包

這裡寫圖片描述

貼指令碼

mappings = { 0x04:"A",  0x05:"B",  0x06:"C", 0x07:"D", 0x08:"E", 0x09:"F", 0x0A:"G",  0x0B:"H", 0x0C:"I",  0x0D:"J", 0x0E:"K", 0x0F:"L", 0x10:"M", 0x11:"N",0x12:"O",  0x13:"P", 0x14:"Q", 0x15:"R", 0x16:"S", 0x17:"T", 0x18:"U",0x19:"V", 0x1A:"W", 0x1B:"X", 0x1C:"Y", 0x1D:"Z", 0x1E:"1", 0x1F:"2", 0x20:"3", 0x21:"4", 0x22:"5",  0x23:"6", 0x24:"7", 0x25:"8", 0x26:"9", 0x27:"0", 0x28:"\n", 0x2a:"[DEL]",  0X2B:"    ", 0x2C:" ",  0x2D:"-", 0x2E:"=", 0x2F:"[",  0x30:"]",  0x31:"\\", 0x32:"~", 0x33:";",  0x34:"'", 0x36:",",  0x37:"." }
nums = []
keys = open('usbdata.txt')
for line in keys:
    if line[0]!='0' or line[1]!='0' or line[3]!='0' or line[4]!='0' or line[9]!='0' or line[10]!='0' or line[12]!='0' or line[13]!='0' or line[15]!='0' or line[16]!='0' or line[18]!='0' or line[19]!='0' or line[21]!='0' or line[22]!='0':
         continue
    nums.append(int(line[6:8],16))
keys.close()
output = ""
for n in nums:
    if n == 0 :
        continue
    if n in mappings:
        output += mappings[n]
    else:
        output += '[unknown]'
print 'output :\n' + output

執行改指令碼便可得到輸出結果如下:

這裡寫圖片描述

另附滑鼠流量資料包轉換指令碼

nums = [] 
keys = open('data.txt','r') 
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 : 
    print posx , posy 
keys.close()

轉換後會得到一系列座標點,需要輔以gnuplot 或者其他的繪圖工具畫出即可。