USB 映射 python
USB mapping with 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
为什么会这样?
根据 usb.pcap 文件中的数据集,您可能需要调整 INIT_X 和 INIT_Y 变量。问题是 struct.unpack returns 是一个带符号的值,因此如果数据超过 127,则它显示为负数并且您超出了数组边界。如果数据真的总是正值,您可以对其进行测试并将其强制为正值。类似于:
data = [item + 256 if item < 0 else item for item in data]
正如 Steve Cohen 所注意到的,您的数据是 -128...127 范围内的无符号字节,但如果这些是数组的索引,那么它们很可能应该是无符号的。
Python的struct在大多数情况下都有格式字符,请使用正确的:
data = struct.unpack("BBBB", buf[-4:]) # tuple of four unsigned bytes
在阅读一些 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
为什么会这样?
根据 usb.pcap 文件中的数据集,您可能需要调整 INIT_X 和 INIT_Y 变量。问题是 struct.unpack returns 是一个带符号的值,因此如果数据超过 127,则它显示为负数并且您超出了数组边界。如果数据真的总是正值,您可以对其进行测试并将其强制为正值。类似于:
data = [item + 256 if item < 0 else item for item in data]
正如 Steve Cohen 所注意到的,您的数据是 -128...127 范围内的无符号字节,但如果这些是数组的索引,那么它们很可能应该是无符号的。
Python的struct在大多数情况下都有格式字符,请使用正确的:
data = struct.unpack("BBBB", buf[-4:]) # tuple of four unsigned bytes