【题目】I wonder what this really is...enc ''.join([chr((ord(flag[i]) << 8) + ord(flag[i + 1])) for i in range(0, len(flag), 2)])
enc相关信息及内容如下——

【解题】enc里面是flag转换成的Unicode码,编码方式为join([chr((ord(flag[i]) << 8) + ord(flag[i + 1])) for i in range(0, len(flag), 2)]),我们来拆分这句代码:
(1)for i in range(0, len(flag), 2)]
结果为i=0,2,4,6,8……即指向flag字符串的偶数位
(2)ord(flag[i]) << 8
先将flag字符串中的第0,2,4……位上的字符进行Unicode编码,
再将编码向左移8位,即Unicode值乘以256
(3)ord(flag[i + 1])
把当前字符的下一个字符也转换成Unicode码
(4)ord(flag[i]) << 8) + ord(flag[i + 1])
第i个字符左移八位,第i+1个字符保持不动,相加组成16个bit位
(5)chr((ord(flag[i]) << 8) + ord(flag[i + 1]))
把这16位Unicode码转换成对应的字符
(6)join([chr((ord(flag[i]) << 8) + ord(flag[i + 1])) for i in range(0, len(flag), 2)])
flag中的第0和1位的字符经过上述变换得到字符”灩“
flag中的第2和3位的字符经过上述变换得到字符”捯“
flag中的第4和5位的字符经过上述变换得到字符”䍔“
……
于是得到enc完整内容。
因此要想逆向得到原flag字符,就要把每个编码后的字符拆分成2个字符,编码字符的前8位是一个字符,后8位是一个字符,即:
(1)enc中的每一个字符c,chr(ord(c) >> 8)
先字符转编码,然后编码右移八位,最后编码转字符,就得到第0位的flag原字符
(2)enc中的每一个字符c,chr(ord(c)& 0xff)
这样就得到第1位的flag原字符
(3)for c in enc:
v = ord(c)
flag += chr(v >> 8)
flag += chr(v & 0xff)
以此类推,
第1个enc的字符”灩“被拆解成2个flag原字符”pi"
第2个enc的字符”捯“被拆解成2个flag原字符”co"
第3个enc的字符”䍔“被拆解成2个flag原字符”CT"
第4个enc的字符”䙻“被拆解成2个flag原字符”F{"
……
最终解码代码即运算结果如下:

OVER
浙公网安备 33010602011771号