从一道题学习打印机流量(RCTF2019-Printer)

打开流量包以后发现前面全是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}

不知道为什么提交的时候,第二段字符都要小写??

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值