WeChall - CGX#16 - Big Endian

Challenge

CGX#16: Big Endian 给出一个随机生成并绑定当前 session 的 bit stream,例如:

1
001100101100101001110010001000101110001000110010010000100110001010100010101100100010001010000010

Solution

Recon: bit stream 长 96 bit,96 % 8 == 0,显然是 8-bit bytes。但直接按普通二进制(MSB-first)解码得到乱码。题名 "Big Endian" 暗示不是普通的字节序问题——这里不是多字节整数的 byte order,而是每个字节内部的 bit 权重反着读:最左 bit 是 LSB,最右 bit 是 MSB。

以第一个字节 00110010 为例,按本题权重计算:

1
0×1 + 0×2 + 1×4 + 1×8 + 0×16 + 0×32 + 1×64 + 0×128 = 76 = 'L'

等价做法是先反转每个字节内部的 bit,再按普通二进制解释:

1
00110010 -> 01001100 -> 76 -> L

Python:

1
2
3
4
bits = '001100101100101001110010001000101110001000110010010000100110001010100010101100100010001010000010'
assert len(bits) % 8 == 0
answer = ''.join(chr(int(bits[i:i+8][::-1], 2)) for i in range(0, len(bits), 8))
print(answer)

本地验证示例输出为:

1
LSNDGLBFEMDA

只反转每个字节内部的 bit,不要反转字节顺序。实际提交前要解自己页面当前 session 的 bit stream。

session-bound: reverse bits per byte, answer varies