CoCo五周年活动(CCDC26)解密攻略

3284 字
16 分钟
CoCo五周年活动(CCDC26)解密攻略
本文章为lizzzhh/CCDC2026仓库README文件的副本,想要了解更多关于本文的内容,请到以下仓库
lizzzhh
/
CCDC2026
Waiting for api.github.com...
00K
0K
0K
Waiting...
了解更多关于CoCo和CCDC的信息,请前往CoCo手册->CCDC文档

CCDC 2026 - WA整理#

做题时间:2026/7/22 13:00 ~ 2026/7/23 07:33

本次CCDC没有严格的关卡设定,本文大致根据【探索者笔记】进行分割

已经将所有材料一起打包在本仓库中。

本目录下是当时解题的工作目录

source目录是存档的请求

0100 ?#

风云突变,风暴袭来。你未曾料到会遭如此变故。远处,模糊的轮廓,似是一个海岛。可它并不愿直接向你开放。

首先,本活动在语雀https://codemao-guide.yuque.com/bfiekm/sbo5kh/qnfoc6w4a0m76ek9报名。文本如下

🎬 CCDC 26(CoCo 五周年)
CCDC 26 活动火热进行中!本次活动中,你将扮演一名远行的航海者,探索未知的奥秘。
你一时兴起想要远航,备好了帆船开始乘风破浪。
【开始航行】
https://lab.cocotais.cn/
【航道开放时间】
2026-07-22 13:00:00 至 2026-07-28 23:59:59
【探险宝藏】
成功解密者,瓜分54.11元奖金
(倒过来是 1145 哈哈)
【注意事项】
一、本次活动参与前需要报名,请填写https://cocotais.feishu.cn/share/base/form/shrcnqdYaMQR2P7JQBXZw1qzDk3。
二、本次活动期间,不同单位间严禁传递答案或解密过程。
三、如多个个人共同参赛,请以团队身份报名参赛。

根据文本,我们来到 https://lab.cocotais.cn/

此时,直接点击【我要登陆】会跳转到一个编程猫社区作品,但会因为编程猫社区的安全更新而跳转走。我们需要直接查询API来获取作品信息。

在网页源代码中找到workId323405197,通过常用的编程猫API拼接得到以下URL

https://api-creation.codemao.cn/coconut/web/work/323405197/load?channel=1

访问后,可以得到作品BCMC文件的URL为

https://creation.bcmcdn.com/716/appcraft/JSON_kusSXzx9bW_1784693503773.json

访问这个URL,我们得到了编译后的作品文件

0101 在作品文件中提取信息#

你登上了海岛。四周荒芜,阴云遮天。一觉醒来,天已转晴,可你迷失了回家的方向。探索中,一个留声机吸引了你的目光。

源文件已存储在source目录下

以下是一些从文件中提取的线索

我们查看Cocotais Lab.svg,并在这个SVG源文件的注释中找到

<!-- bilibili opus -->
<!-- 1080885759100059699 -->

根据提示,拼接url得到:https://www.bilibili.com/opus/1080885759100059699

在其评论区,找到了评论

凝视中,你在杂散的意识里恍惚看到了什么。

3761254A8CD9BFE0 cdn?c??o???s.?n 492a0e8ae8056a16ff425797ba4273b7.png

顺着以上线索的指引,和lab.cocotais.cn的提示,我们将cdn?c??o???s.?n 492a0e8ae8056a16ff425797ba4273b7.png补全成以下url

https://cdn.cocotais.cn/492a0e8ae8056a16ff425797ba4273b7.png

下载得到以下图片

我们可以隐约的看出这是一个DM码,对他重新拼接,可以得到:

拼接结果
拼接结果

(拼接使用了split.py进行拼图,这个脚本本来只是用来裁剪的其实)

(正常的做出此题,应该使用3761254A8CD9BFE0的顺序进行拼图,但是其实手动拼也能拼出来)

扫码得到以下url

https://cocotais.cn/prophecy

0102 找不同#

人影浮现。「抉择就在眼前,结局早已注定。」

【倾听】倾听与众不同的,§ꮏөгұꮏєłłєг的故事。

【讲述】你没有选择。

点击第二行,下载到一个音频文件

https://cdn.cocotais.cn/§ꮏөгұꮏєłłєг [ⱮΘĐƗ₣ƗΣĐ].mp3

使用vbindiff工具,比较§ꮏөгұꮏєłłєг [ⱮΘĐƗ₣ƗΣĐ].mp3Storyteller [ORIGINAL].mp3的不同。最终,从文件的差异部分,可以拼接成以下url

https://lab.cocotais.cn/2026/storytel.ler

下载得到storytel.ler

(其实这个url后面还有用,暂且不表)

在这里,你是否忘记了什么

0201 storytel.ler#

storytel.ler进行binwalk分析,结果如下

❯ binwalk '/mnt/c/Data/CCDC2026/storytel.ler'
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 PNG image, 400 x 400, 8-bit/color RGBA, non-interlaced
5425 0x1531 Zip archive data, at least v2.0 to extract, name: storytel.ler-unzipped/
5477 0x1565 Zip archive data, encrypted at least v2.0 to extract, compressed size: 2486796, uncompressed size: 2486784, name: storytel.ler-unzipped/IDEA FILTER.exe
2492340 0x2607B4 Zip archive data, encrypted at least v2.0 to extract, compressed size: 513283, uncompressed size: 513271, name: storytel.ler-unzipped/RECREATION.png
3006030 0x2DDE4E End of Zip archive, footer length: 22

首先,修改后缀为PNG,得到一个二维码,扫码得到线索 REVERSE

注意,以下做题过程是错误的,正确路径应该会更简单#

binwalk -e提取zip文件

注意到文件使用了不安全的ZipCrypto算法,加上文件中包含一个文件头确定的exe文件。 遂使用bkcrack进行明文攻击

Terminal window
bkcrack -C ..\storytel.e.zip -c "storytel.ler-unzipped/IDEA FILTER.exe" -x 0 4d5a90000300000004000000ffff0000

很快就可以得到内部密钥,并且对zip进行解密

Terminal window
X:\CCDC2026\bkcrack-1.8.1-win64>bkcrack -C ..\storytel.e.zip -c "storytel.ler-unzipped/IDEA FILTER.exe" -x 0 4d5a90000300000004000000ffff0000
bkcrack 1.8.1 - 2025-10-25
[15:04:04] Z reduction using 9 bytes of known plaintext
100.0 % (9 / 9)
[15:04:04] Attack on 749350 Z values at index 6
Keys: da34e2e8 ad3021e2 75147a58
48.2 % (361150 / 749350)
Found a solution. Stopping.
You may resume the attack with the option: --continue-attack 361150
[15:07:48] Keys
da34e2e8 ad3021e2 75147a58
X:\CCDC2026\bkcrack-1.8.1-win64>bkcrack -C ..\storytel.e.zip -D ..\storytel.d.zip --keys da34e2e8 ad3021e2 75147a58

解压storytel.d.zip得到两个文件

  • IDEA FILTER.exe

  • RECREATION.png

正确做法#

还记得https://lab.cocotais.cn/2026/storytel.ler吗?之前访问的时候,他的headers中有一句Prophecy-Set-Header: encounter=anonymous

https://cocotais.cn/prophecy发送请求,并且在headers中,将encounter设置成anonymous

在html中即可获得密码ehsvnty92tqb82435712(空格的数量)

0202 IDEA FILTER.exe#

错误做法(也很正确)#

以下做法依然怀疑存在错误的流程。。没事,反正结果是好的

我们一不小心掏出了一个IDA

使用IDA64反编译此文件,发现这是个go语言编写的native程序,我们找到main_main函数,开始分析。我们重点分析以下语句:

ida
ida

v1 = *(_QWORD *)(os_Args + 24);
if ( v1 != 7
|| (((unsigned __int64)*(unsigned int *)(*(_QWORD *)(os_Args + 16) + 3LL) << 32) | **(unsigned int **)(os_Args + 16)) != 0x3231373535333432LL )
{
if ( v1 == 23 && (unsigned __int8)runtime_memequal() )
{
fmt_Fprintln();
os_Exit();
return;
}
goto LABEL_14;
}

我们可以借助LLM等工具帮助我们分析,以下是分析结果

os_Args 是 os.Args 底层字符串数组的指针。在 64 位下,每个 string 占 16 字节(8 字节数据指针 + 8 字节长度)。

os_Args + 0:os.Args[0].ptr

os_Args + 8:os.Args[0].len

os_Args + 16:os.Args[1].ptr

os_Args + 24:os.Args[1].len

因此 v1 = len(os.Args[1]),获取第 1 个命令行参数的长度。

检查 len(os.Args[1]) == 7,且通过拼接字符串前 4 字节与偏移 3 处 4 字节的方式,得到一个 64 位无符号整数,与 0x3231373535333432 比较。

拼接逻辑:

**(unsigned int **)(os_Args + 16) 读取 os.Args[1] 数据的前 4 字节作为低 32 位。

_(unsigned int _)(ptr + 3) 读取偏移 3 处的 4 字节作为高 32 位。

该常数按小端字节序对应字符串 “2435712”。因此条件为:os.Args[1] 恰好等于 “2435712”。

因此,我们向参数1传入2435712

Terminal window
X:\CCDC2026\storytel.ler-unzipped>"IDEA FILTER.exe" 2435712
惊醒。视线清晰,你发现天已转晴。一片纸出现在你身边

程序在目录创建了key.txt,内容如下

秘密与路途被摆上天平,摇晃之间价码已被定下。讲述人已离去,前路未知而富有吸引力。
这是给勇敢者的奖励:
https://c3n98.cocotais.cn/
(纸的背面隐秘处写了一串密文)
5539E6426D369936C55E43D88E8C01BC3E1E1B68EB81B510558EB2FBFDC2A34DC4A5A94EBBCF5BD90EC88073BB7AAB512456DE346FBAAC7B5F0E48B2B5067A1F24F991C77FF0030343C48567A52FD6B9

正确做法#

略。上一步空格的数量。

0203 RECREATION.png 与 ???#

你不觉得这个手应该指着点什么东西吗()
你不觉得这个手应该指着点什么东西吗()

典型的高度隐藏问题,修改png文件头,把高度改的更高,就可以得到

解密的图片
解密的图片

从图片中读出解密的配置

使用Rabbit算法解密,Key为16个1

解密key.txt中的密文,即可得到以下文本

0106040D465755500646445809015453014C583B60617501050309127D6167656265127A716B

0204 c3n98.cocotais.cn#

你已不知身处何地。只见栅栏层层叠叠。你按照纸上的指引探险,误入了不安全的角落。思索着,你耳畔传来一阵声音: 命运所指的开头,需要由你自行谱写。工具放在了你眼前最明显的位置,不知你能否利用好这个突兀的机会,寻找遭遇过的秘密。疑问不解是正常的,但你已具备了一以贯之的解决的条件,剩下的便是试错了。

直接访问c3n98.cocotais.cn,首先我们会注意到证书错误,我们发现证书是自签名的,可以从中提取出如下信息:

生效日期: Jul 21 11:45<14> 2025 GMT 失效日期: Jul 21 19:08<10> 2025 GMT

RSA2048公钥

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAskKu+i8zgNyDOC8OEBlk
zjHkn4k+duibtF11DL+WNEF6WQwcG7c+5J9wINjpbM5dTQjKBP4XTwhQJi9oRs8I
UQCMFKm0hbDxOJrIFepo7zVFmMti94hJHXgfZ6Luj1ZDuuG+b3xriYKwbYkDu0gG
JpzNtVXBRTQZHQ3odYiYJzVKt60jbZKKNeIM/NYt+scI8E3mvvkQXwvVHNMxxCKQ
/99kyC1Hj6LVPRX0ccPl4L4aYZRtVIfMWhRpBrQD9Mjj8S1+hkQOwv5CHNK4FGQU
RLv7j/MzdyZg7PbBlS94icV6lmqWoJ0uVw2kK0Qea2ibR9PAsqlw0hyetYHkTKWD
pwIDAQAB
-----END PUBLIC KEY-----

并且,我们从Headers中找到了不寻常的东西 decrypt-method-2:xor 这提示我们,上一步没有完成的解密,可能需要使用异或算法。

我们对上一步没有解密完全的密文使用异或算法解密,密钥为2435712 (就是之前exe中的密码),解得

3278qfgb2uqo83fg2yo
RSA2048 OUTPUT HEX

这提示我们使用RSA2048对3278qfgb2uqo83fg2yo进行加密

我们使用c3n98.cocotais.cn的TLS证书中的RSA公钥,对其进行加密(模式为RSAES-PKCS1-V1_5。。这个是出题的问题) 得到flag1

611bc26eeacc8135311760fa4b9209b41b07e50788684b453e30510e9044176861d2bbb3d7a6d201edbf08966dce74d92c0b517899a46115f80a014df7bb928444eb4d15d8a7e0cf5eabf46cffa6e139f7a768b7974f985d8940881cc4c43b8e9b41a0dce220064dbe2cb247f361405fee03f75a02d235db54ad1fcbb1ba668c1fd7f53270e6d2b99abfdd8c183d6e8d28af2551f2b38be0c002ec8ae3b40306c28fb6089321b9d05ec26883f02bf12eacee1467cebefe980c8e278c2260ad6a6a01e9751ddf2847061e1b4fcc913c58f4df89b446afda32012a1257d42bf78059f505381ec77f0b03037e7896776be3e8eac3a8114727dbeecee596638460a5

前辈们说,无论发生了什么改变,有些东西是不会变的。

有什么出现了呢…又有什么可以不变呢…?

逆向思维是我们常常忽略的。反其道而行之,或许会有好的结果。

问题是,利用之后的结果何处存放呢…

还记得https://lab.cocotais.cn/2026/storytel.ler吗?之前访问的时候,他的headers中有一句Prophecy-Set-Header: encounter=anonymous。我在做题的时候,都没有注意到这一点,因此使用了错误的方法破解Zip加密。

其实,这里让我们设置的Header并没有变。我们需要向https://cocotais.cn/prophecy发送请求,并且在headers中,将encounter设置成flag1

0301 前路何向?所指何方?#

上一步的请求,我们得到了一个页面。从他的源代码中,可以直接得到以下信息

https://github.com/cocotais-lab/studious-doodle” “2b42cb33ebd414de7520b8802f2154feaf7c84b2”

这把我们引向了一个github commit

https://github.com/cocotais-lab/studious-doodle/commit/2b42cb33ebd414de7520b8802f2154feaf7c84b2

迷雾消散。你意识到讲述者从未离开,TA一直相伴在你身边。人影浮现,TA正对着你,你却看不清TA的面庞。 一阵低语传来:你得到的够多了。

填写其中指向的飞书表格https://cocotais.feishu.cn/share/base/form/shrcnGZPVwxYL08RocF1FooLYFc

我们可以收到一封邮件。

0302 豁然开朗。一扇紧闭着的门出现。「抉择就在眼前,结局早已注定。」#

注意,这个地方非常的坑,因为大部分邮件查看工具可能会吞掉你的空格,所以,必须要下载邮件源文件进行查看。以下是得到的消息

INFORMATION BELOW ARE ENCRYPTED
GROUP: 748309147
STORY: A'ilnecis monIneuennocgessImfnlyo h eevn ieo ifrue a e orraosadyu lnydmn. a trigdfst,csy s ri o

查询群号查无此群,根据之前REVERSE的指示,反向成741903847找到群聊。

qun
qun

注意群聊中存在一个新线索。

关注STORY,加上你已不知身处何地。只见栅栏层层叠叠的指示,我们大致能猜测出是栅栏加密。 直接爆破即可,得到解密的明文。(flag2)(脚本zhalan.py)

As I'm finally on the receiving side of misfortune, I can see your reasons and your clingy demons.

根据QQ群信息中的线索,查看github仓库的custom-properties,得到

Encounter y3cbqqoybq2

依旧,向https://cocotais.cn/prophecy发送请求,并且在headers中,将encounter设置成y3cbqqoybq2。 得到的页面中,多了以下代码

window.location.href = "https://c3n98.cocotais.cn/?story=UNKNOWN&timestamp=" + Date.now()

0303 未知的时间,未知的故事。#

直接打开上述url是不行的,因为不知道timestamp。 story参数就是flag2

关于timestamp,解谜中就在c3n98.cocotais.cn的TLS证书中出现过。我们在这个时间段里面随便选择一个时间,就可以得到可用的时间戳了。

https://c3n98.cocotais.cn/?story=As I'm finally on the receiving side of misfortune, I can see your reasons and your clingy demons.&timestamp=1753069524000

最终得到以上url。

访问后,我们发现其Headers中多了一项

x-yuque-note:754819df-b72d-43ce-b8db-25d7bee81def

直接拼接出语雀笔记的url

https://www.yuque.com/r/note/754819df-b72d-43ce-b8db-25d7bee81def

得到以下信息

civilight_eterna.png@cdn
your_name@new_host:tenfold_height
ENCRYPTED new_host BELOW
HAPPYCOCOANNIVERSARYOHH
WSAPQJGQBEQBBHGUMNUMHJU

0304 Civilight Eterna#

“��的�■”…?

用�的维■■亚����

是你!讲述者,你看这张��的■��

(记录似乎被人为损坏了)

上方信息的第一行,我们根据之前的经验,拼出url,https://cdn.cocotais.cn/civilight_eterna.png

tenfold_height指的是10倍的图片高度。也就是32500。

your_name根据【探索者笔记】中的提示已经很明显了,就是storyteller

至于加密的信息,根据Civilight Eterna可以联想到

从名字含义(“永恒之光”)联想:维吉尼亚密码 (Vigenère Cipher) 在16世纪被提出时,曾因其强大的加密能力被认为是“不可破解的密码”(le chiffre indéchiffrable),在当时也被看作一种牢不可破的“永恒”加密法。

后注:Civilight Eterna 应译为 文明的存续(对应探索者笔记中的 “��的�■”),仅是对游戏《明日方舟》角色的捏他(neta)。维吉尼亚密码可直接自探索者笔记中 维■■亚 联想到。

使用维吉尼亚密码对WSAPQJGQBEQBBHGUMNUMHJU解密,密钥为HAPPYCOCOANNIVERSARYOHH,得到PSLASHSONEDOTMCDUNDOTCN

即PSLASHSONE.MCDUN.CN。但此处,lyx失误了,

lyx的失误.png
lyx的失误.png

…很好,我们拼出了完整的ssh参数!

Terminal window
ssh -p 32500 -l storyteller p-s1.mcdun.cn

但是,还需要密码。

再次检查civilight_eterna.png,我们发现图片Exif信息中存在license:password=theresa

这次,我们可以登录了。

0305 门打开了。传出了应答声:静候求索者的到来#

Terminal window
ssh -p 32500 -l storyteller p-s1.mcdun.cn
storyteller@p-s1.mcdun.cn's password:
Received disconnect from 198.18.0.7 port 32500:11: prophecy encounter:kazdel
Disconnected from 198.18.0.7 port 32500

我们终于得到了最终的encounter

和之前一样,传入prophecy。

<meta charset="utf-8">
<p>门打开了。传出了应答声:静候求索者的到来</p>

静候求索者的到来

即为TA的应答,发送QQ入群申请即可。

至此,你已经完成了CCDC 2026。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
CoCo五周年活动(CCDC26)解密攻略
https://blog.00910721.xyz/posts/codemao/ccdc/26/readme/
作者
透明质酸钠
发布于
2026-07-23
许可协议
CC BY 4.0
随机文章随机推荐

评论区

Profile Image of the Author
透明质酸钠
宁宁就要0721!
分类
标签
最新动态
站点统计
文章
3
分类
2
标签
7
总字数
74,392
运行时长
0
最后活动
0 天前
站点信息
构建平台
Cloudflare Workers
博客版本
Firefly v6.15.5
文章许可
CC BY 4.0