全程使用Wireshark进行分析
预备知识——USB地址格式
常见地址格式为 X.Y.Z
- X表示USB总线ID
- Y表示USB设备ID
- 对应的过滤值为
usb.device_address
- Z表示USB设备的端口
初步分析——确定设备列表
通过 GET DESCRIBE请求的回应
利用搜索器搜索字符串:GET DESCRIPTOR Response DEVICE
- 2.2
- idVendor: Alienware Corporation (0x187c)
- idProduct: Unknown (0x0550)
- 外星人的不明设备,先不管
- 2.3
- idVendor: Realtek Semiconductor Corp. (0x0bda)
- idProduct: Unknown (0x0550)
- Realtek 的不明设备,先不管
- 2.15
- idVendor: Microsoft Corp. (0x045e)
- idProduct: Xbox360 Controller (0x028e)
- 微软的Xbox360游戏控制器,重点观察
- 2.5
- idVendor: Unknown (0x2104)
- idProduct: Unknown (0x030b)
- 2.6
- idVendor: Darfon Electronics Corp. (0x0d62)
- idVendor: Darfon Electronics Corp. (0x0d62)
- 2.7
- idVendor: Intel Corp. (0x8087)
- idProduct: Unknown (0x0a2b)
过滤数据包
我们找到了重点目标,对数据包进行过滤
usb.bus_id == 2 && usb.device_address == 15
数据分析
可以发现2.15.0
主要负责交流配置信息,而2.15.2
全为带有LCD域的USB数据,因此我们可以开始分析2.15.2
的协议信息
最后提取信息
本题略有脑洞,我在比赛时也没想到,最终的提取信息居然是通过IO图表,官方给出的解释是,XBOX震动一次会产生4个相同的流量包,每次连续震动之间会产生明显的时间偏差,那我们就来看看IO图表吧(间隔调整为100ms能更清楚看出间隔)
变更过滤器为
usb.addr == "2.15.2"
最后得到,每一行为每一个阶段的数据包数量
2+2=4
2+2=4
2*8=16
2*8+1*2*2=20
2+2=4
2*8=16
最后每个除以4得到
1 1 4 5 1 4
去除空格
114514
取md5哈希
c4d038b4bed09fdb1471ef51ec3a32cd
flag就是这串md5哈希值了