[NISACTF 2022]损坏的flag
本篇将分享一道关于 USB 流量分析的 CTF 题目解题思路,题目来自 [NISACTF 2022]损坏的flag。
1. 识别文件类型并加载
文件类型识别:
使用 010 Editor 打开附件atta.NISACTF_2022flag
,观察到其文件头为D4 C3 B2 A1
,这是 libpcap 格式的典型特征(Magic Number)。加载流量包:
将文件名后缀修改为.pcap
,然后使用 Wireshark 打开。观察发现流量包内容为 USB 协议数据。
2. 提取键盘流量数据
流量特征分析:
在 Wireshark 中,可以看到 USB 数据包的Leftover Capture Data
字段长度为 8 字节,且通常只有第 3 个字节非零。这是 USB HID 键盘数据的典型特征。使用 tshark 批量提取:
为了提取所有键盘击键数据,可使用tshark
命令行工具。执行以下命令:1
tshark -r atta.NISACTF_2022flag.pcap -T fields -e usb.capdata > usbdata.txt
该命令会从流量包中提取所有
usb.capdata
字段,并将其保存到usbdata.txt
文件中。
3. 映射数据并破译 Flag
编写转换脚本:
usbdata.txt
中的数据是十六进制的键盘扫描码,需要根据 USB HID Usage Tables 将其转换为可读字符。以下 Python 脚本可实现此转换:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15# -*- coding:utf-8 -*-
mappings = {0x04:"A", 0x05:"B", 0x06:"C", 0x07:"D", 0x08:"E", 0x09:"F", 0x0a:"G", 0x0b:"H", 0x0c:"I", 0x0d:"J", 0x0e:"K", 0x0f:"L", 0x10:"M", 0x11:"N", 0x12:"O", 0x13:"P", 0x14:"Q", 0x15:"R", 0x16:"S", 0x17:"T", 0x18:"U", 0x19:"V", 0x1a:"W", 0x1b:"X", 0x1c:"Y", 0x1d:"Z",0x1e:"1", 0x1f:"2", 0x20:"3", 0x21:"4", 0x22:"5", 0x23:"6",0x24:"7",0x25:"8",0x26:"9",0x27:"0",0x28:"<RET>",0x29:"<ESC>",0x2a:"<DEL>", 0x2b:" ",0x2c:"<SPACE>",0x2d:"-",0x2e:"=",0x2f:"[",0x30:"]",0x31:"\",0x32:"<NON>",0x33:";",0x34:"'",0x35:"`",0x36:",",0x37:".",0x38:"/",0x39:"<CAP>",0x3a:"<F1>",0x3b:"<F2>", 0x3c:"<F3>",0x3d:"<F4>",0x3e:"<F5>",0x3f:"<F6>",0x40:"<F7>",0x41:"<F8>",0x42:"<F9>",0x43:"<F10>",0x44:"<F11>",0x45:"<F12>"}
result = ''
with open('usbdata.txt', 'r') as f:
for line in f.readlines():
line = line.strip()
if len(line) == 16:
s = int(line[4:6], 16)
elif len(line) == 24:
s = int(line[6:8], 16)
else:
continue
if s != 0 and s in mappings:
result += mappings[s]
print(result)分析转换结果:
运行脚本,得到转换后的字符串。获取 Flag:
观察输出的字符序列,它们在标准键盘布局上构成一个闭合形状,包围的字母即为 Flag。Flag:
welcome_to_fjnu