打开流量包以后发现前面全是Interrupt_in类型的输入流量,没有什么发现,看到
发现GET DESCRIPTOR Request CONFIGURATION,也就是请求获取配置描述符,说明host请求获得1.7.0这个设备的配置信息,作用就是为了和1.7.0连接,再看看1.7.0的返回包Response,发现借口描述符哪里写了1.7.0的类型为printer,所以确定这是打印机流量
往下看还有一个设备描述符
这里可以获得这些信息:
bLength: 18: 描述符长度,18字节。
bDescriptorType: 0x01 (DEVICE): 描述符类型,表示这是一个设备描述符。
bcdUSB: 0x0200: 表示支持的USB协议版本,这里是USB 2.0。
bDeviceClass: Device (0x00): 设备类别,这里是通用设备,没有特定的类别。
bDeviceSubClass: 0: 设备子类别,没有特定的子类别。
bDeviceProtocol: 0 (Use class code info from Interface Descriptors): 设备协议,表示从接口描述符获取类别信息。
bMaxPacketSize0: 64: 端点0(Control Endpoint)的最大包大小为64字节。
idVendor: NXP Semiconductors (0x1fc9): USB供应商ID,这里是NXP Semiconductors的ID。
idProduct: Unknown (0x2016): 产品ID,这里是未知的产品ID。
bcdDevice: 0x0100: 设备的固件版本号,这里是版本1.0。
iManufacturer: 1: 制造商字符串的索引,通常对应设备描述符中的字符串描述符。
除了设备描述符和配置描述符意外还有这些描述符:
USB 描述符类型包括:
设备描述符(Device Descriptor):描述整个 USB 设备的基本信息,如 USB 协议版本、设备类别、制造商信息等。
配置描述符(Configuration Descriptor):描述设备的一个配置,包括该配置的接口数、端点数等信息。
接口描述符(Interface Descriptor):描述设备的一个接口,包括接口的类别、子类别、协议等信息。
端点描述符(Endpoint Descriptor):描述设备的一个端点,包括端点的方向、传输类型、最大数据包大小等信息。
其他描述符(Other Descriptors):用于描述设备的其他特性和功能。
再往下看还能找到设备的ID信息:
1.7.0回显的设备id显示,制造商(MFG)为4BARCODE,查询发现这是一个标签打印机厂商,采用TSPL2协议,产品号码为3B-363B,产品类新为打印机,这也是很有用的信息。
接着剩余往下的主要都是下一个USB设备1.6.0和1.6.1和主机的交互了。
然而我们再下面一堆的输入(INTERRUPT_IN)发现了两个BULK_OUT输出的包,其中一个包的数据特别大,由对包得分析可知,从接口类别InterfaceClass可以看出1.7.1仍然是打印机。
看看包的字节数据发现里面有两个bitmap和一堆bar还有一个set tear on cls 上网查知道这个是tsc条形码打印机的指令
其中bitmap是用来绘制位图,bar是用来绘制黑块的(因为是条形码打印嘛)
BAR x,y,width,height
这个指令就表示在坐标(x,y)处绘制一个宽为width高为height的块
根据数据写一个python脚本绘图
from PIL import Image
barcode_img=Image.new('1',(800,800),color=1)
barcode_pixel=barcode_img.load()
instruction_file=open("BAR.txt","r")
instruction=instruction_file.read().split("\n")
for i in range(len(instruction)):
instruction[i]=instruction[i].split(",")
for j in range(len(instruction)):
x,y,width,height=instruction[j]
for v in range(int(height)):
for h in range(int(width)):
tx=int(x)+h
ty=int(y)+v
barcode_pixel[tx,ty]=0
barcode_img.show()
然后画完是这个样子
下一步就是处理那俩bitmap指令,一共是两个图,但是只要一个脚本就够了
BITMAP x,y,width,height,mode,data
(x,y)仍为起点
但是需要注意的是width以字节为单位,height则以点为单位,data是要填充的数据,原理图如下(TSPL编程的官方文档)TSPL编程官方文档
然后,填充数据就是如下图的填充方法,这里把字节变成了比特位,0仍然为黑色,1仍然为白色;所以这里是需要把bitmap指令后面的数据手动提出来的,我是复制十六进制,放到010然后二进制复制到文件里面就可以读了
然后脚本如下
from PIL import Image
bitmap_ins1=[138,75,26,48]
bitmap_ins2=[130,579,29,32]
data1_file=open("data1.txt","r")
data1=data1_file.read()
counter=0
bitmap=Image.new("1",(800,800))
bitmap_pixel=bitmap.load()
x,y,width,height=bitmap_ins1
for v in range(height):
for h in range(8*width):
tx=x+h
ty=y+v
bitmap_pixel[tx,ty]=eval(data1[counter])
counter+=1
bitmap.show()
分别对两个数据使用这个脚本
得到:
拼接图片的内容得到:
flag{my_tsc_hC3pNIkdK}
不知道为什么提交的时候,第二段字符都要小写??