WeChall - 2021 Christmas Tweet

Challenge

URL: https://www.wechall.net/en/challenge/christmas2021/tweet/index.php

题面说 quangntenemy 和 gizmore 通过 Twitter covert channel 与 Santa 通信。推文链接指向 https://twitter.com/Gizmore/status/1466513376385843210

原始载荷

Twitter 当前页面受限时,可用 Wayback 快照复核原文:

https://web.archive.org/web/20211202210346/https://twitter.com/Gizmore/status/1466513376385843210

推文不是普通日文,而是 42 个 Unicode code point:

1
杖鱕杤𠁬硡橂桢鱕豙𓅸籉鱅豢𖥖𐙣鱫杙𖥨赡敎豢𠁆鹌轂桢𖥖籉𓅚豙鱣赡歍穉鵸豢𠁉ꕢꍖ絚睎籒𐘹

逐字符 code point 为:

1
06756 09C55 06764 2006C 07861 06A42 06862 09C55 08C59 13178 07C49 09C45 08C62 16956 10663 09C6B 06759 16968 08D61 0654E 08C62 20046 09E4C 08F42 06862 16956 07C49 1315A 08C59 09C63 08D61 06B4D 07A49 09D78 08C62 20049 0A562 0A356 07D5A 0774E 07C52 10639

已确认的编码观察

每个 code point 的低 8 bit 组成:

1
VUdlaBbUYxIEbVckYhaNbFLBbVIZYcaMIxbIbVZNR9

这个字符串看起来像 Base64。按标准 Base64 解码得到 31 个二进制字节:

1
5547656816d46312046d572462168d6c52c16d521961c68c2316c86d564d47

结果不是可读文本。直接把低字节字符串或该 hex 字符串作为答案提交,也没有得到正确结果。因此“取低 8 bit 后直接 Base64”只能算中间观察,不是最终解法。

辅助分析应保留原始 code point,而不是只保留 UTF-8 字节:

1
2
3
4
5
6
import unicodedata

s = "杖鱕杤𠁬硡橂桢鱕豙𓅸籉鱅豢𖥖𐙣鱫杙𖥨赡敎豢𠁆鹌轂桢𖥖籉𓅚豙鱣赡歍穉鵸豢𠁉ꕢꍖ絚睎籒𐘹"
print(len(s))
for ch in s:
print(f"U+{ord(ch):05X}", unicodedata.name(ch, "UNKNOWN"))

当前状态

未解决。推文载荷和低字节变换已复现,但还没有确认第二层编码、carrier/channel 规则或最终 answer。

后续路线

  1. 对 42 个 code point 按 BMP、Supplementary Plane、Unicode block 和 code point bit width 分组。
  2. 检查高位与低位的组合、相邻字符差分和 bit packing,而不是只做 modulo 256。
  3. 对比题面历史版本与作者其他 Christmas challenge 的编码习惯。
  4. 服务器验证前不要把 Base64 二进制、UTF-8 hex 或推文原文当作答案。