WeChall - Out of the Cloud

Out of the Cloud (Misc) by anto

Challenge

挑战页描述:"Our computer science specialist has sent us a message. However it seems that it's a little cryptic...",链接一个 cloud.zip

解压得到 cloud.txt(689KB):纯 0/1 文本流,8937 行 × 78 位 + 末尾 1 行 66 位,行宽 78 = 13 × 6。

Solution

Step 1 — 位流 → 字节

把 0/1 文本按 8 位切分转字节。文件头尾各有 20 字节 0x04 填充,中间数据有强周期结构:b0 50 de + 变长 payload + be 终止,共 6931 块。

Step 2 — 位反转发现 ASCII

所有 payload 字节低 2 位恒为 00(每字节只含 6 位有效数据)。关键观察:把字节做位反转(bit-reverse,MSB↔︎LSB),b0 50 de\r\n{be},payload 变成可读 ASCII:

1
\r\n{-11,12,4}\r\n{63,51,0}\r\n{-63,33,8}\r\n...

这是 6931 个 {x,y,z} 三维点坐标。

Step 3 — 渲染点云

x∈[-64,63],y∈[-64,63],z∈[0,246]。把 z 映射为灰度(z 值大部分是 4 的倍数),x,y 映射为像素坐标渲染 128×128 图。中间区域有一大块高密度文字。

Step 4 — 镜像翻转读答案

直接渲染的文字是反的(镜像),左右翻转后可读出答案:

完整脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#!/usr/bin/env python3
"""Out of the Cloud — 0/1 文本 → 位反转 → 点云 → 镜像渲染"""
import re
from PIL import Image, ImageOps

# cloud.txt 的 0/1 文本
with open('cloud.txt') as f:
content = f.read().replace('\n', '').strip()

def rev8(b: int) -> int:
"""按位反转一个字节"""
r = 0
for i in range(8):
r = (r << 1) | ((b >> i) & 1)
return r

# Step 1: 0/1 → bytes
data = bytes(int(content[i:i+8], 2) for i in range(0, len(content), 8))

# Step 2: 去掉头尾 20 字节 0x04 填充,按块 (b0 50 de ... be) 切分
core = data[20:-20]
blocks = []
i = 0
while i < len(core):
if core[i:i+3] != b'\xb0\x50\xde':
i += 1
continue
j = core.find(b'\xbe', i + 3)
if j == -1:
blocks.append(core[i:])
break
blocks.append(core[i:j+1])
i = j + 1

# Step 3: 位反转 → ASCII 文本 {x,y,z}
text = ''.join(''.join(chr(rev8(b)) for b in blk) for blk in blocks)
text = text.replace('\r\n', '\n').strip()
pts = [(int(x), int(y), int(z))
for x, y, z in re.findall(r'\{(-?\d+),(-?\d+),(-?\d+)\}', text)]
print(f"points: {len(pts)}")

# Step 4: 渲染 128×128 灰度图(z 为亮度),左右镜像后保存
img = Image.new('L', (128, 128), 0)
px = img.load()
for x, y, z in pts:
px[x + 64, 63 - y] = min(255, z)
img = ImageOps.mirror(img) # 关键:左右翻转
img = img.resize((1024, 1024), Image.NEAREST)
img.save('cloud_mirror.png')
print("saved cloud_mirror.png — 图中文字即答案")
rainbowrainbow