这是CTF杂项的一道题目,题目简介取,取证与安全杂项,番茄真的很好吃,可是,我的番茄怎么怪怪的,给我...

Создано: 9 августа 2026 г.

Отвечено с использованием GPT-5.6 Thinking от Chat01

Вопрос

mmexport1786262075808.jpg

这是CTF杂项的一道题目,题目简介取,取证与安全杂项,番茄真的很好吃,可是,我的番茄怎么怪怪的,给我flag和wp

Мысль

Implemented Gilbert curve image decryption and created standalone tomato solver

Worked for 5m 47s

Ответ

Flag

moectf{Tom@t0_i5_D3liciou5!}

我已经把图还原出来了,flag 就写在番茄图片中央:

查看还原后的图片

WP

这题的核心不是传统 LSB,而是**“小番茄图片混淆”**。

  1. 基础取证。 原文件是 1170×1553 的 JPEG。检查 strings、RGB 通道、bit plane 后没有直接 flag。JPEG 的 FFD9 后还有 24 字节尾数据,其中最后 16 字节恰好等于 FFD9 为止整个 JPEG 的 MD5:57db824f9a4933d34607af98d66a0ebf,所以这部分不是主要突破口。

  2. 观察图片特征。 图片虽然像一堆红色/绿色的卫星图块,但各块仍保留明显的局部纹理相关性,说明不像普通随机像素打乱。结合题目反复提示“番茄”,很容易联想到网上的 “小番茄图片混淆”。该工具明确使用 Gilbert 广义 Hilbert 空间填充曲线对像素进行重新映射,并使用黄金比例计算偏移。(GitHub)

  3. 还原算法。 官方/衍生实现中的偏移为:

    offset = round((sqrt(5) - 1) / 2 * width * height)

    像素坐标先按 Gilbert 曲线展开,再沿曲线整体循环偏移。源码中的混淆关系是 dst[new_pos] = src[old_pos],其中 new_pos = curve[(i + offset) % total]。(GitHub)

  4. 这题的小坑。 对附件按“解混淆”方向操作一次,图反而更乱;反过来执行一次“小番茄”的混淆方向,立刻恢复成正常的番茄照片。也就是说,这张题图相当于对正常图走了一次反方向操作。恢复后的图中央直接写着:

    moectf{Tom@t0_

    i5_D3liciou5!}

  5. 脚本核心。 对附件尺寸 1170×1553,总像素 1817010,计算出的偏移是 1122974。沿 Gilbert 曲线取出像素后,执行:

python
offset = round((math.sqrt(5) - 1) / 2 * width * height) seq = img[ys, xs] # 本题需要走“小番茄”的混淆方向一次 restored_seq = np.roll(seq, offset, axis=0) out = np.empty_like(img) out[ys, xs] = restored_seq

我也整理了一份可以直接跑的完整 Python 脚本:

下载 solve_tomato.py

运行方式:

bash
python solve_tomato.py mmexport1786262075808.jpg -o restored.png

最终得到的就是 moectf{Tom@t0_i5_D3liciou5!}

Поделиться этим Q&A