Skip to content

Alt

本题考察键盘流量的解析。

根据选手反馈,本题难点有二:

  • 一是找的码位对照表不全,没有 KeyPad 区(右手数字小键盘区)的对照;
  • 二是不知道 Alt 在这道题里有什么作用。

第一步我们需要用 tshark 把 USB 数据提取出来,本题的数据为 usbhid 格式,有些题目的格式也可能是 usb.capdata.

bash
tshark -r keyboard.pcapng -T fields -e usbhid.data > usbdata.txt

然后得到的数据里有一些空行,可以用文本编辑器批量替换掉。我这里截最前面的一段作为示例进行分析:

plaintext
0400000000000000
0400590000000000
0400000000000000
0400620000000000
0400000000000000
04005a0000000000
0400000000000000
0000000000000000
0400000000000000
0400590000000000
0400000000000000
0400620000000000
0400000000000000
0400600000000000
0400000000000000
0000000000000000
0400000000000000
0400610000000000
0400000000000000
04005f0000000000
0400000000000000
0000000000000000

根据中文互联网上能容易找到的、不用充会员的键盘流量分析相关资料可知,第一字节代表控制键,第二字节保留为 0x00,第三到八字节是我们敲击的键。

有些同学反映,网上的脚本里找不到 0x59 0x62 等等键码对应的按键,原因上面讲过了。其实多读几篇国内的相关文章就会发现它们经常引用一篇名为 Universal Serial Bus (USB) 的文章,把这个文件下载下来,第 55 页就有对应的对照表。

很多同学分析到这里,都会忽略第一字节的 0x04,根据题目名和网上的资料可以知道是按着 Alt 键。那么整个击键流程就比较清晰了:保持 Alt 键的按下状态,按下几个数字键,然后松开 Alt。

直接搜索「Alt 加数字键」,就能知道这是在按Unicode码值输入字符,写个脚本稍微自动化一下或者直接一个个手动看过去,很容易分析出来上面截取分析的这段流量就是在输入 fla 这三个字符,以此类推,就能得到整个 flag.


还有一些同学对流量里的 backspace 退格键有所疑惑,认为是删除了前一个数字或者认为是删除了整个字符。很遗憾两者都不是。

注意题目描述中指明了,flag 含有非 ASCII 字符且语义较通顺。如果退格键是删除了 Alt 加数字键打出来的整个字符的话,得到的 flag 就不含有非 ASCII 字符。 如果退格键是删除了上一个输入的数字的话,得到的 flag 的非 ASCII 部分没有任何语义。反而是忽略了退格键,能得到正确的结果,比如说第一段非 ASCII 字符是键盘流量

因为出题人在出题时是用的 Windows 11 自带记的事本,如果要让 Alt 加数字的结果是中文字符的话,经测试需要按下退格键或者是 Enter 键,也说明 Alt 加数字键输入非 ASCII 字符这个特性在不同软件里不一定能完美复现。除了手动复现按下 Alt 键加数字键这个流程以外,也可以直接使用 Python 的 chr 函数进行计算,就能获得十进制码值对应的字符。