注意到题给文本存在 Unicode「康熙部首」区的字符,进一步分析后假设该隐写与此相关。那么提出设想:在 Unicode 中,康熙部首涉及的文字既在 4E00~9FFF(中日韩统一表意文字)具有码位,又在 2F00~2FDF(康熙部首)存在码位,那么对于未隐写的文字,可以将其中涉及康熙部首的一部分文字从 4E00~9FFF 替换到 2F00~2FDF 的对应字符,在替换与否中做到数据的隐写。所以写出代码:
1 | # U+2F00 ~ U+2FDF 的康熙部首 |
可以得到,原文中共有 332 个涉及康熙部首的字符,这与后来 Hint 中提到的「信息容量 332bits」吻合。先假设进行了字符替换为 1 以及未替换为 0,注意到结尾有连续的 7 个 1 以及连续至结尾的 0,认为其是结束标志。结合 Hint 得知下一步仍与汉字有关,分析后猜测该二进制串每 7bit 为一组,两组表示一个汉字,那么该文本共隐藏了 22 个汉字。
对于汉字的编码,在考虑并排除了中文电码后仍然从 GBK 和 Unicode 方向进行分析。考虑到最终 Flag 与汉字有关,而「从二进制推算出汉字,又尝试从汉字解码出 ASCII 的 Flag」并没有实际意义,猜测汉字内容即表达了 Flag 的内容。进行了各种猜测、尝试后发现,隐写内容前三字符的低 5 位和「阿里云」GBK 编码的低 5 位相同:
1 | 阿 10110000 101[00010] <-> 0010000 00[00010] |
所以认为隐写内容是经过额外处理的 GBK 编码的汉字,在进行一番尝试后找到了正确的解码方法:
1 | source = "00100000000010010000010011110110100010011000101101000001010011010011000101000101110001101111010011001101100010000100000000100000101101011110010000110110010010110101111001000011011001010111101000100011011000111001011101000101010111010001010101110100010101010110100100011001101100100011011000100001000000001000111111100000000000000000" |
This article is authored by Luoingly and is licensed under CC BY-NC 4.0
Permalink: https://luoingly.top/post/aliyunctf-2024-writeup/