2016-05-09 54 views
4

在閱讀一些CTF寫起坐我碰到這個腳本來USB映射與蟒蛇

#!/usr/bin/env python 
import struct 
import Image 
import dpkt 

INIT_X, INIT_Y = 100, 400 

def print_map(pcap, device): 
    picture = Image.new("RGB", (1200, 500), "white") 
    pixels = picture.load() 

    x, y = INIT_X, INIT_Y 

    for ts, buf in pcap: 
     device_id, = struct.unpack("b", buf[0x0B]) 

     if device_id != device: 
      continue 

     data = struct.unpack("bbbb", buf[-4:]) 

     status = data[0] 
     x = x + data[1] 
     y = y + data[2] 

     if (status == 1): 
      for i in range(-5, 5): 
       for j in range(-5, 5): 
        pixels[x + i , y + j] = (0, 0, 0, 0) 
     else: 
      pixels[x, y] = (255, 0, 0, 0) 
    picture.save("riverside-map.png", "PNG") 

if __name__ == "__main__": 

    f = open("usb.pcap", "rb") 
    pcap = dpkt.pcap.Reader(f) 
    print_map(pcap, 5) 
    f.close() 

當我在我的usb.pcap運行它,我得到這個錯誤:

Traceback (most recent call last): 
     File "test.py", line 39, in <module> 
     print_map(pcap, n) 
     File "test.py", line 31, in print_map 
     pixels[x, y] = (255, 0, 0, 0) 
    IndexError: image index out of range 

爲什麼正在發生?

+2

作爲調試的第一步,嘗試打印出x和y。這個問題不適合這個網站,所以我已經投票結束了。 – paj28

回答

3

根據您的usb.pcap文件中的數據集,您可能需要調整INIT_X和INIT_Y變量。問題是struct.unpack返回一個有符號值,所以如果數據超過127,那麼它顯示爲負數,並且超出了數組邊界。如果數據確實總是正面的,那麼您可以對此進行測試並將其強制爲正值。喜歡的東西:

data = [item + 256 if item < 0 else item for item in data] 
0

正如史蒂夫·科恩注意到你的數據是無符號字節在-128 ... 127之間,但如果這些數組比大多數的指標或許他們應該是無符號。

Python的struct有大多數情況下格式的字符,請使用正確的:

data = struct.unpack("BBBB", buf[-4:]) # tuple of four unsigned bytes