【题目】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相关信息及内容如下——

image

 

【解题】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{"

……

最终解码代码即运算结果如下:

image

 

OVER

 

posted on 2026-01-08 08:02  swannie  阅读(10)  评论(0)    收藏  举报