CTF实战:从USB鼠标流量到Flag,我是如何用Wireshark和gnuplot一步步画出来的
第一次参加BUU CTF比赛时,我遇到了一道关于USB鼠标流量分析的题目。作为一个刚入门的新手,面对一堆看似杂乱无章的流量数据,我完全不知道从何下手。经过几天的摸索和无数次的失败尝试,我终于成功提取出了隐藏在鼠标移动轨迹中的Flag。下面,我将详细记录整个解题过程,希望能帮助其他遇到类似问题的CTF爱好者。
1. 初步分析捕获文件
拿到题目提供的pcap文件后,我首先用Wireshark打开查看。在过滤器中输入usb,可以看到大量的USB HID数据包。这些数据包包含了鼠标的移动和点击信息。
关键观察点:
- 每个数据包都包含8字节的
Leftover Capture Data - 数据格式符合典型的USB鼠标流量特征
为了更深入地分析,我决定使用tshark工具提取原始数据:
tshark -r usb.pcap -T fields -e usb.capdata > usbdata.txt但运行后发现生成的文件中有很多空行,这会影响后续处理。经过搜索,我找到了解决方案:
tshark -r usb.pcap -T fields -e usb.capdata | sed '/^\s*$/d' > usbdata.txt提示:使用sed命令可以过滤掉空行,确保数据文件干净整洁
2. 解析鼠标数据格式
USB鼠标流量通常由4个字节组成(8个十六进制字符),每个字节都有特定含义:
| 字节位置 | 含义 | 说明 |
|---|---|---|
| 1-2 | 按键状态 | 0x00无按键,0x01左键,0x02右键 |
| 3-4 | X轴移动 | 有符号数,正数右移,负数左移 |
| 5-6 | Y轴移动 | 有符号数,正数下移,负数上移 |
| 7-8 | 滚轮 | 本题中未使用 |
我编写了一个Python脚本来解析这些数据:
def parse_mouse_data(input_file, output_file): with open(input_file, 'r') as f_in, open(output_file, 'w') as f_out: for line in f_in: line = line.strip() if len(line) == 8: # 确保是鼠标数据 # 格式化输出为冒号分隔 formatted = ':'.join([line[i:i+2] for i in range(0, 8, 2)]) f_out.write(formatted + '\n')3. 处理坐标数据
将原始数据转换为坐标点时,我遇到了几个关键问题:
- 符号位处理:鼠标移动数据是有符号的,需要正确处理负数
- 按键过滤:只需要记录特定按键状态下的坐标
- 累积坐标:需要累加每次的偏移量,而不是使用绝对值
经过多次调试,最终的处理代码如下:
def convert_to_coordinates(input_file, output_file): pos_x, pos_y = 0, 0 with open(input_file, 'r') as f_in, open(output_file, 'w') as f_out: for line in f_in: if len(line.strip()) != 11: # 包括冒号和换行符 continue parts = line.strip().split(':') btn = int(parts[0], 16) x = int(parts[1], 16) y = int(parts[2], 16) # 处理有符号数 if x > 127: x -= 256 if y > 127: y -= 256 pos_x += x pos_y += y # 只记录右键点击时的坐标 if btn == 0x02: f_out.write(f"{pos_x} {pos_y}\n")注意:在实际比赛中,可能需要尝试不同的按键过滤条件,本题中右键点击时的坐标才是关键
4. 使用gnuplot绘制轨迹
有了坐标数据后,我尝试用gnuplot绘制鼠标移动轨迹。最初直接使用:
gnuplot -e "plot 'xy.txt' with lines; pause -1"但发现图形太小,无法辨认。经过多次调整,最终确定了合适的参数:
gnuplot -e "set terminal png size 1024,768; set output 'flag.png'; plot 'xy.txt' with lines lw 2;"关键参数说明:
set terminal png size 1024,768:设置输出图片大小with lines lw 2:使用线宽为2的线条连接点
绘制出的图形清晰地显示了Flag内容。整个过程让我深刻体会到,CTF比赛中流量分析题目不仅需要技术知识,更需要耐心和细致的调试。