全程使用Wireshark进行分析
初步分析——确定设备列表
通过 GET DESCRIBE请求的回应
利用搜索器搜索字符串:GET DESCRIPTOR Response DEVICE
- 1.7(包序号:470)
- idVendor: NXP Semiconductors (0x1fc9)
- idProduct: Unknown (0x2016)
- 1.6
GET DESCRIPTOR Response DEVICE
找不到,说明可能该设备在开始记录数据包之前就已连接,我们发现它的数据包非常多,呈连续性,判断为鼠标,用脚本分析后发现没有有价值的数据
分析设备类型
因为Wireshark无法识别idProduct字段的值0x2016,我们需要对数据包的其它配置信息进行深入分析
设定过滤器规则
usb.bus_id == 1 && usb.device_address == 7
搜索GET DESCRIPTOR Response
在465号数据包中找到
INTERFACE DESCRIPTOR (0.0): class Printer
并与题目文件名Printer联想,确定目标设备就是1.7并且是打印机
数据深入分析
排除掉DESCRIPTOR
和CONFIGURATION
描述的连接配置包,只剩下5个包,分别是
476
有明显的控制数据
0000 1c 00 f0 99 19 c4 87 de ff ff 00 00 00 00 08 00 ................
0010 01 01 00 07 00 80 02 32 00 00 00 01 00 32 4d 46 .......2.....2MF
0020 47 3a 34 42 41 52 43 4f 44 45 3b 43 4d 44 3a 54 G:4BARCODE;CMD:T
0030 53 50 4c 32 3b 4d 44 4c 3a 33 42 2d 33 36 33 42 SPL2;MDL:3B-363B
0040 3b 43 4c 53 3a 50 52 49 4e 54 45 52 3b 00 ;CLS:PRINTER;.
通过其中的BARCODE关键词,我们可以认为它是一个条码打印机
通过搜索引擎我们找到它的文档
https://github.com/lokingwei/tspl-printer-php/blob/master/document/%E6%9D%A1%E7%A0%81%E6%9C%BA%E4%B8%AD%E6%96%87%E7%BC%96%E7%A8%8B%E6%89%8B%E5%86%8C.pdf
674
0000 1b 00 10 c0 64 c1 87 de ff ff 00 00 00 00 09 00 ....d...........
0010 00 01 00 07 00 01 03 88 00 00 00 53 49 5a 45 20 ...........SIZE
0020 34 37 2e 35 20 6d 6d 2c 20 38 30 2e 31 20 6d 6d 47.5 mm, 80.1 mm
0030 0d 0a 47 41 50 20 33 20 6d 6d 2c 20 30 20 6d 6d ..GAP 3 mm, 0 mm
0040 0d 0a 44 49 52 45 43 54 49 4f 4e 20 30 2c 30 0d ..DIRECTION 0,0.
0050 0a 52 45 46 45 52 45 4e 43 45 20 30 2c 30 0d 0a .REFERENCE 0,0..
0060 4f 46 46 53 45 54 20 30 20 6d 6d 0d 0a 53 45 54 OFFSET 0 mm..SET
0070 20 50 45 45 4c 20 4f 46 46 0d 0a 53 45 54 20 43 PEEL OFF..SET C
0080 55 54 54 45 52 20 4f 46 46 0d 0a 53 45 54 20 50 UTTER OFF..SET P
0090 41 52 54 49 41 4c 5f 43 55 54 54 45 52 20 4f 46 ARTIAL_CUTTER OF
00a0 46 0d 0a F..
可以看到基本上是包含了打印的页面配置信息
675
à6
¿Þÿÿ éSET TEAR ON
CLS
BITMAP 138,75,26,48,1,<...bitmap data...>
BITMAP 130,579,29,32,1,<...bitmap data...>
BAR 348, 439, 2, 96
BAR 292, 535, 56, 2
BAR 300, 495, 48, 2
BAR 260, 447, 2, 88
BAR 204, 447, 56, 2
BAR 176, 447, 2, 96
BAR 116, 455, 2, 82
BAR 120, 479, 56, 2
BAR 44, 535, 48, 2
BAR 92, 455, 2, 80
BAR 20, 455, 72, 2
BAR 21, 455, 2, 40
BAR 21, 495, 24, 2
BAR 45, 479, 2, 16
BAR 36, 479, 16, 2
BAR 284, 391, 40, 2
BAR 324, 343, 2, 48
BAR 324, 287, 2, 32
BAR 276, 287, 48, 2
BAR 52, 311, 48, 2
BAR 284, 239, 48, 2
BAR 308, 183, 2, 56
BAR 148, 239, 48, 2
BAR 196, 191, 2, 48
BAR 148, 191, 48, 2
BAR 68, 191, 48, 2
BAR 76, 151, 40, 2
BAR 76, 119, 2, 32
BAR 76, 55, 2, 32
BAR 76, 55, 48, 2
BAR 112, 535, 64, 2
BAR 320, 343, 16, 2
BAR 320, 319, 16, 2
BAR 336, 319, 2, 24
BAR 56, 120, 24, 2
BAR 56, 87, 24, 2
BAR 56, 88, 2, 32
BAR 224, 247, 32, 2
BAR 256, 215, 2, 32
BAR 224, 215, 32, 2
BAR 224, 184, 2, 32
BAR 224, 191, 32, 2
BAR 272, 311, 2, 56
BAR 216, 367, 56, 2
BAR 216, 319, 2, 48
BAR 240, 318, 2, 49
BAR 184, 351, 2, 16
BAR 168, 351, 16, 2
BAR 168, 311, 2, 40
BAR 152, 351, 16, 2
BAR 152, 351, 2, 16
PRINT 1,1
通过手册,我们知道BITMAP是绘制BITMAP格式的图形,BAR是画线
根据手册,我们写出相应的解析Python脚本,见附件draw.txt
bar
BAR指令的参数
leftover.bin
第一张BITMAP的数据
补充:leftover.bin的数据产生
tshark -r Printer.pcapng -T fields -e usb.capdata -Y "frame.number == 675" > leftover.hex
然后去掉多余的数据,只留下BITMAP数据
将16进制数转换为2进制数,完成
最终
flag{MY_TSC_hC3pNIkdK}
附件列表: