2025 问号CTF Week3
2026-08-22 20:05:38

ZmxhZ3tZMHVfQHJlX1JlQDExeV9BX0cwMGRfR0FNRVIhISF9

flag{Y0u_@re_Re@11y_A_G00d_GAMER!!!}

[Week3] 俱乐部之旅(3) - 与时间对话

仔细看一遍txt文件的内容

注意要求使用到git方法 还要找到出题人藏的treasure

初看这个txt 几乎没有任何异样 细看看到下面有零星的乱码方格 把这段话复制到cyberchef 看到一些红点 这就是零宽隐写

零宽隐写

零宽隐写是一种利用不可见不可打印但真实存在的Unicode零宽度字符的隐写技术。

零宽度字符是一种在视觉上不占空间 但在计算机中的确存在且占据字符位置的Unicode控制字符。

不会在网页或文本编辑器中显示,但是可以被复制粘贴存储和程序读取。

零宽隐写通过不同的零宽字符代表二进制位0/1或者摩斯密码·/-等编码单元 把隐写内容嵌入到一段看似正常的公开文本中

1.把那段话复制到cyberchef 可以看到一些红点

2.配方使用Escape Unicode Chaecaters

在输出可以看到\u200B``\u200C``\u200D之类的零宽字符 记下出现了哪些零宽字符

3.把那段话复制到在线网址右边的红框里

https://330k.github.io/misc_tools/unicode_steganography.html

4.按照第二步出现的零宽字符在Zero Width Characters for Steganography:

里面勾选出现的零宽字符 就像这样

5.获得隐写内容

P@ssW0rd 1s th3 md5 v4lue 0f th3 w0rd "t1me"

于是我们给”t1me“转md5

eeb7ac660269f45046a0e8abaa51dfec

这个应该是压缩包的密码 用密码解压

软件everything查找文件名 找到.git

**cd C:\Users\13964\Desktop\.git**

**git log**

查看git仓库的提交历史

看一下日志

19:26:41 lost my treasure 创建仓库 可能是应该寻宝游戏的开始

19:28:27 welcome to c5im club 加入了c5im俱乐部

19:28:44 hope you will have fun here开始游戏 玩的开心

**git reflog**

这是一条非常强大的git命令 记录了head指针的所有移动历史 就算是删除 也能找到痕迹

my treasure是关键线索

d0cf66f HEAD@{5}: commit: my treasure是一条被覆盖或者删除的提交

尝试恢复它

**git show d0cf66f**

原来的avatar.jpg被删除了 但不重要

创建了一个新文件dora 重要

git checkout d0cf dora报错

注意切换到正确的工作目录

.git是git的元文件仓库,不包含真实文件

到父目录即可

**cd C:\Users\13964\Desktop**

**git checkout d0cf dora**(提交哈希的四位前缀d0cf即可)

得到一个被损坏的文件名为dora的文件 放进010

这里明显有缺失 补全gif文件头也就是gif89 另存为dora.gif

得到gif动图 感觉后面的画面有帧延迟

考虑帧延迟隐写 运行探测脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from PIL import Image

gif = Image.open("dora.gif")
print("总帧数估计:")
frame_count = 0
try:
while True:
print(f"Frame {frame_count}: duration = {gif.info.get('duration', 'N/A')}")
gif.seek(gif.tell() + 1)
frame_count += 1
except EOFError:
pass

print(f"\n共 {frame_count} 帧")

共59帧 最后几帧的duration是:1030 970 1080 1020

都是10的倍数 于是尝试除以10得到 103 97 108 102

这些字母在ASCII表里对应字符是

chr(102 108 97 103)='flag'

于是了解到该题是通过修改gif动画的帧持续时间来隐藏flag

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from PIL import Image
gif = Image.open("dora.gif")#使用PIL库打开名为dora.gif的GIF动画文件
durations = []#初始化一个空列表用于储存每帧的持续时间
while True:
try:
durations.append(gif.info["duration"])#获取当前帧的显示时长
gif.seek(gif.tell() + 1)
except EOFError:
break

# 每个值除以10
durations = [d // 10 for d in durations]

# 翻转列表
durations.reverse()

# 转为ASCII字符并拼接
result = ''.join(chr(d) for d in durations)
print(result)

flag{R3ad1ng_7he_wh1sper5_0f_7ime}

[Week3] 布豪有黑客(三)

上一页
2026-08-22 20:05:38
下一页