黄鹤杯Misc

潮痕留声

一个PNG,扔进随波逐流可以得到末尾很长一串数据

1. 先按字节整体反转;
2. 再对每个字节做高低 4 bit 交换;
3. 得到 ZIP 文件。
from pathlib import Path

src = Path(r"C:\Users\q1388\Downloads\潮痕留声\data_end.txt")
raw = bytes.fromhex("".join(src.read_text(errors="ignore").split()))

def swap_nibble(x):
    return ((x & 0x0f) << 4) | (x >> 4)

out = bytes(swap_nibble(b) for b in raw[::-1])
Path(r"outputs\tail_recovered.zip").write_bytes(out)

print(out[:8].hex())

恢复出一个加密的zip文件,再观察原图片的exif

找到一个掩码密码,对此进行爆破得到中间部分 D4fX

打开后得到另一个PNG,这个PNG有文本块,经过Base64解码后得到:

render-group-L4xGd -> Base64 is not the road here.
palette-trace-A8sB -> better_to_listen_than_to_stare
map-stamp -> light can lie, order cannot

同时在文件末尾夹杂了一个Wav文件,进行提取,看他的频率图(这里也可以用Audacity直接看)

ffmpeg -y -i tide_trace.wav -lavfi “showspectrumpic=s=8192×2048:legend=0:scale=log” spectrum.png

进行镜像翻转+180°旋转:

但是flag是UUID得格式,两个-之间需要四个字母,所以这里的顺序显然不对。此时剩下的唯一线索就是上一个修改过长宽得图像

对 Green 和 Alpha 的最低位异或:

得到这个顺序图,最终得到flag

flag{60a8d749-3760-4560-8bc7-86f2a7754dfa}

失序货栈

题目给出 127 个 `BOX-*` 文件,每个文件都是带传统 ZIP 加密的压缩包。外层 ZIP 密码是对应编号;解出后取短 Base32 片段,按解码后原始字节的 9 字节重叠恢复顺序,再 zlib inflate 得到 flag。

每个 `BOX-xx` 的密码就是编号:

– `BOX-01` -> `01`
– `BOX-09` -> `09`
– `BOX-100` -> `100`

解密后内容类似:


BOX-04 | data=PDND3EW5N3RDAEEF57ZRI7UAXKIDRP2CXFQNS5C3SUWRK=== | crc32=42fd8f19

其中 data 是 Base32,crc32 是 Base32 解码后原始字节的 CRC32。

接下来是base32的修复,利用CRC32校验进行枚举

取出 dataBase32 解码成原始 bytes对 bytes 算 CRC32和行尾的 crc32= 比较如果不一致,说明 Base32 字符里有错

ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"

for pos, old in enumerate(data):
    if old == "=":
        continue
    for new in ALPHABET:
        if new == old:
            continue
        candidate = data[:pos] + new + data[pos + 1:]
        raw = base64.b32decode(candidate)
        if crc32(raw) == target_crc:
            print("fixed", pos, old, "->", new)

修复得错误:

BOX-10: pos 5 G -> O
BOX-14: pos 11 W -> K
BOX-30: pos 33 7 -> D
BOX-72: pos 39 J -> Z
BOX-77: pos 22 K -> W
BOX-88: pos 44 D -> 7
BOX-93: pos 16 2 -> Z

修复后,对每个短片段做 Base32 解码。按原始字节的 9 字节重叠恢复唯一顺序:

4, 14, 31, 94, 83, 72, 81, 50, 37, 77, 6, 69, 40, 10, 85, 80, 9, 30, 79, 67, 76, 93, 7, 68, 92, 88, 49

拼接后的数据以 zlib 头开始,直接解压:

得到明文:

final=flag{dffc94e8-0571-4e68-bbc3-f1534766f794}
END OF MANIFEST

Frame by Frame

问卷

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇