用python进行USB映射

时间:2016-05-09 07:32:49

标签: wireshark python

在阅读一些CTF写作时,我遇到了这个脚本

#!/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 个答案:

答案 0 :(得分:3)

根据usb.pcap文件中的数据集,您可能需要调整INIT_X和INIT_Y变量。问题是struct.unpack返回一个带符号的值,所以如果数据超过127,那么它会显示为负数,并且你超出了数组边界。如果数据确实总是正数,则可以测试该数据并将其强制为正值。类似的东西:

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

答案 1 :(得分:0)

正如史蒂夫科恩注意到你的数据是-128 ... 127范围内的无符号字节,但如果它们是数组的索引,那么它们应该是无符号的。

Python struct在大多数情况下都有格式字符,请使用正确的字符:

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