CryptoCTF 2025 head scratcher 分类 团队解题 writeup
这次 head scratcher 分类由于人力短缺,以及水平不得行,所以全军覆没了。虽然爆零了,但是至少 1997 的各位都战斗到最后,搏至无憾了。反观某个叛徒,在他人唆使之下叛逃 1997,利令智昏,得不偿失!
从 discord 到 QQ 的 1997 交流群,一副阻挡叛徒的铁幕已经降落下来
Alice Sig Slip (x)题目描述题目基于 EdDSA,使用的曲线为 ED25519,用 RFC8032 的参数(生成元 $G$ 固定)生成一个密钥 $(x, P)$ 满足 $P = x G$,然后有 5 组消息 $m_i, i = 0, 1, 2, 3, 4$,然后对这个消息签名得到 5 组数据 $(P, r_i, s_i, m_i)$ 其中 $P = x G$ 为公钥。这些数据可以排列成一个矩阵:
\begin{bmatrix}P_0 & r_0 & s_0 & m_0 \\
P & r_1 & s_1 & m_1 \\
P & r_2 & s_2 & m_2 \\
P & r_3 & s_3 & m_3 \\
P & r_4 & s_4 & m_4 \\ \end{bma ...
CryptoCTF 2025 brain buster 分类 团队解题 writeup
这次 brain buster 分类由于人力短缺,有一题没有做出来。这里不得不说一句,1997 的各位真是尽力了,本来已经有其他日程安排的石卡库和托林都尽力拿时间出来做题。反观某个叛徒,在 1997 人手短缺的时候临阵叛逃,完全就是负贡献,如此行为,令人汗颜!
Leptocole (x)题目描述令 $q = 127, n = 26, k = 14$,题目中讨论的矩阵元素均在 $\mathbb{F} = GF(q)$ 中。
服务器先生成一个随机的矩阵 $G \in \mathbb{F}^{k \times n}$,以及一个随机的 $n \times n$ 排列矩阵 $Q$,该排列矩阵中的每行和每列恰好有一个随机非零元素。$H$ 是 $GQ$ 的最简行阶梯形式。$G$ 和 $H$ 已知。
我们需要给出矩阵 $U$ 和 $P$,使得:
$P$ 也满足上述对排列矩阵的定义
$U$ 和 $P$ 均可逆
$U G P = H$
若能给出这样的两个矩阵,那么就能拿到 flag。
我的尝试因为时间问题,在比赛的时候,我只是简单地做了一些尝试,并没有深入研究。这题比赛的时候是套娃看的,虽然他没做出来 ...
CryptoCTF 2025 tough cookie 分类 团队解题 writeup 之三
这次 tough cookie 分类没有全部做出来,有一道题卡住了,想到了可能的解法,但是没有去实践
实际上就是事后诸葛亮
Silky题目描述记 $B = 5, n = 19, D = 110, t = 128, l = 4 D B / t$。服务器先生成一个元素都在 $[-B, B]$ 内的整数向量 $k \in \mathbb{Z}^{n}$。
然后有一个 silky 运算:找一个元素都在 $[-B(D+1), B(D+1)]$ 的向量 $R \in \mathbb{Z}^{n}$,计算 $R’ = R - k$,满足 $R’$ 的元素均在 $[-BD, BD]$ 内。
我们有大约 $5 l t = 20 D B$ 次鸡喙 得到 $R$ 的值,然后需要恢复出 $k$ 的值。如果能恢复出 $k$ 的值,那么就能得到 flag
我的解答一般这种看起来没什么特别性质,但是能够请求大量数据的题目都没什么特别的巧,都可以用机器学习的视角来重新审视:能不能找到一些特征,特别是统计意义上的特征,来判别 $k$ 的取值?
进一步注意到 $k$ 的每一个元素的取值都只有 11 种,所以实际上就是个 ...
CryptoCTF 2025 tough cookie 分类 团队解题 writeup 之二
这次 tough cookie 分类没有全部做出来,有一道题卡住了,想到了可能的解法,但是没有去实践
实际上就是事后诸葛亮
Mechanic II题目描述和 Mechanic 一样,基于后量子密码库 quantcrypt,用了 ML-KEM 来生成密钥。不同的是,题目变成了在线题目。
记 $n=1337$,服务器先生成 $n$ 对密钥 $(pk_{0}, sk_{0}), (pk_{1}, sk_{1}), \ldots, (pk_{n-1}, sk_{n-1})$,然后挑选一个下标 $r$,随机生成消息密钥 sec,并且根据公钥 $pk_r$ 生成密文 cipher 和被哈希过的共享密钥 shasec
服务器有如下两个功能
密钥变换 输入下标 _id,根据以下代码产生一组新私钥:
1_skey = SKEYS[_id][:-32] + os.urandom(32)
并加入私钥数组
解密 输入下标 $i$,根据私钥 $sk_i$ 解封装密文 cipher:
1_shasec = kem.decaps(SKEYS[_id], cipher)
并返回 _shasec
至多和服务器交互 $3 ...
CryptoCTF 2025 tough cookie 分类 团队解题 writeup 之一
这次 tough cookie 分类没有全部做出来,有一道题卡住了,想到了可能的解法,但是没有去实践
实际上就是事后诸葛亮
Asemoon题目描述题目基于 $GF(2^{64})$ 中的运算,首先生成了一个模多项式 $g$ 保证 $g$ 不可约,然后代码中的 CP 是 $g$ 的 反向二进制 表示,即,如果 $g(x) = x^{64} + \sum_{i=0}^{63} a_i x^i$,则 $CP = \sum_{i=0}^{63} a_i 2^{63-i}$
然后是 CT 的计算,遍历 $b = 0, 1, \ldots, 255$,代码中的位运算也要 反着看 才会比较符合“多项式取模”的运算:
if cb & 1: 也就是如果 $b$ 对应的多项式高位是 $x^{63}$
cb = (cb >> 1) ^^ CP: $b$ 对应的多项式乘以 $x$,再模 $g(x)$
cb >>= 1: 否则 $b$ 对应的多项式乘以 $x$,因为乘完之后的多项式高位不是 $x^{64}$,所以没必要模 $g(x)$
所以对应的多项式也要反着看,譬如
$b ...
CryptoCTF 2025 getting there 分类 团队解题 writeup 之二
这次 getting there 分类比赛的时候我看了两题,幸亏队友给力,帮我解决了其他的题目。此处要感谢队友,同时也要 继续批判临场背刺的叛徒
Nahan题目描述有一个未知 $l$ 位素数 $m$,满足 $8 \mid l$。题目给了一个互动选项:输入 $s, t$,要满足
$2 l < 6 (\log_{2}{s} + 1) < 3 l$
$2 l < 6 (\log_{2}{t} + 1) < 3 l$
记 $r$ 为不小于 $(st) \oplus (2^l)$ 的最小素数,并且 这个 $r$ 在每次互动的时候不能有重复的
将 $m \oplus r$ 的二进制位进行乱序,得到新的二进制数 $u$
返回结果 $n = r u$
上述互动选项至多可以进行 $l/2$ 次。
我的尝试因为一开始我们连 $l$ 的数值都不知道,所以我们需要通过报错,先把 $l$ 的数值搞出来
123456789101112131415161718192021222324252627from pwn import *class Gao: def __init__(sel ...
CryptoCTF 2025 getting there 分类 团队解题 writeup 之一
这次 getting there 分类比赛的时候我看了两题,幸亏队友给力,帮我解决了其他的题目。此处要感谢队友,同时也要 继续批判临场背刺的叛徒
ASIS Primes题目描述记消息为 $m$。服务器先生成一对 $n=512$ 位的素数 $p, q$,$e=65536$,然后有两个选项:
RSA 加密 服务器根据当前素数 $p, q$,计算 $N=pq$,$c=m^e \bmod N$
参数修改 服务器接收我们的输入 $p’, q’$,并执行检验: a) $p’, q’$ 为素数 b) 满足关于 $p, q$ 转化为字符串之后均为可见字符串,并且满足某个 随机长度 的消息格式检验 123456789101112def is_valid(msg): msg, charset = msg.decode(), string.printable[:63] + '_{-}' return all(_ in charset for _ in msg)pinit = f'CCTF{{7H!S_iZ_th3_f1RSt ...
CryptoCTF 2025 easy-peasy 分类 团队解题 writeup
这次 easy-peasy 分类比赛的时候我一道都没看着,全被队友秒了,这次借写 writeup 的时候我们一起来看一下
要懂得把球传给队友(叛徒除外)
Interpol题目描述记消息为 $m$,其长度为 $n$。先生成一系列的点 $(x_i, y_i)$,分为两部分:
第一部分 点 $(x_i, y_i)$ 满足:
\left\{\begin{aligned}x_i &= -(1 + (19 i - 14) \bmod n) \\
y_i &= m_{(63 i - 40) \bmod n}\end{aligned}\right.其中 $0 \le i < n$
第二部分 点 $(x_i, y_i)$ 满足 $0 \le x_i < 313$,$y_i$ 为一个负的有理数,其中 $i \ge n$
将这两部分点放在一起,构造一个 拉格朗日多项式。已经有这个拉格朗日多项式,求消息 $m$。
我的解答主要难度在于看懂题目代码在赣神魔。
其实把题目代码中 DATA 的值给打印下来,也能猜到八九不离十。
所以如果我们有那个多项式,并且也知道第一部分的点生成规律是怎么样的话,其实就 ...
CryptoCTF 2025 战果速报
一九九七年
我学会了开汽车
上坡 下坡
轧死了一千多
警察来抓我
我跑到女厕所
女厕所的灯
没 有 开
一脚掉到茅屎坑
和粑粑交朋友
点此欣赏芜湖童谣
这周末,一年一度的 Crypto CTF 如期举行。1997 如之前几年一样穿上发病棉袄,和队友们一起参加周六下午 14:00 开始的 Crypto CTF。
有一说一,今年的时间安排对 GMT+8 时区太友好了,之前打这玩意儿还得通宵
在注册队伍的时候,哥们本来想取出队伍全名来,但是又担心像去年那样被制裁:
所以只能先去问好,结果就得到了否定的答复:
太可惜了
然后临近的时候,1997 居然出了个临时跳车的 内鬼!
在这里强烈谴责并(经过 1997 队内民主投票通过后)给予制裁!
最后,1997 差五题 AK,屈居第四。老规矩,先鸣谢下队友:
沛公 @peigong
石卡库 @sh1kaku
To1in @To1in
V @Vanish
等风 @等风
Xenny @Xenny
Tover @Tover.
三顺七 @March7th
未央 @weyung
我们中出了个叛徒!
虽然其中一部分人没有做题(或者做不出题) ...
如何构建高效时序 Keras 数据集:以 tf.data pipeline 分析为例
众所周知,keras 数据集的实现主要依赖于两派:
一派为 keras 提供的数据集相关接口,其中包括已经封装好的几个 toy dataset,还有一些 预处理函数
虽然预处理函数被标成 deprecated,但是貌似函数功能没变,只是被挪了个地方,应该都是进到 keras.utils 里面了
另一派为显式实现 tf.data pipeline
官方推荐用 tf.data 去构建 TensorFlow 输入流水线,更多参考 官方教程
先给一个太长不看的结论:
如果图省事+不需要定制需求的话就用 keras 自带的接口就好
实在想折腾的话建议优先关注 mini-batch 的 batch_size 设置
然后注意向量化运算的利用
问题描述工地上涉及到的数据集是比较客制化的时序数据集,可以描述为下面的场景
输入 X 和 y,以及下标序列 index
X 的 shape 为 (num_samples, num_features), y 的 shape 为 num_samples
设置时间序列长度为 sequence_length
对于每个 index 中的元素 i,抽出 (X[ ...