2022 | Hacky Easter | crypto
Casino
题目¶
Wanna try your luck in our new casino?
To prove we're not cheating, we are publishing our source code.
Connect to the server and start gamblin'!
1 |
|
Note: The service is restarted every hour at x:00.
server.sage
解题思路¶
- 简单扫一眼代码,可以确定
RNG
里定义的椭圆曲线及点是特殊的。在不考虑初始余额的情况下,需要连续猜对 \(1337\) 次才能拿到 Flag,因此next
的输出一定是可预测的 - 首先想到看看「点的阶」,发现 \(P\) 和 \(Q\) 的阶都是 \(ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551_{16}\),对应了特殊的椭圆曲线
NIST P-256
,但知道了是特殊的椭圆曲线有什么用呢 > < - 使用
NIST P-256
进一步搜索发现它可以用在Dual_EC_DRBG
,而Dual_EC_DRBG
存在后门,知道当前状态的完整输出,就可以推出下一状态 \(ΦωΦ)/ - 结合
Dual_EC_DRBG
分析Casino
使用的RNG
- 定义函数 \(X(x,y)=x\),提取椭圆曲线上点的 \(X\) 轴坐标
- 状态 \(s\) 的转移过程:\(r_i=X(s_i P),s_{i+1}=X(r_i P)\)
- 第 \(i\) 个「随机数」为 \(X(r_i Q) \gg 8\)
- 存在整数 \(e\) 使得 \(eQ=P\),设 \(t=X(r_i Q)\),点 \(A\) 在椭圆曲线上且 \(X(A)=t\),由此就能推出下一状态了 🥳 \(X(eA)=X(e\times r_i Q)=X(r_i P)=s_{i+1}\)
-
接下来思路就很清晰啦 XD 首先,尝试求出 \(e\),再根据初始
id
和后续几次bet
确定 \(X(r_i Q)\) 未知的部分,最后攒钱buy_flag
!- 说不定
self.balance >= 1337
其实是在暗示 \(e\),不过做的时候没注意 (ŏωŏ)
- 说不定
Flag¶
he2022{C4S1N0_B4CKD00R_ST0NK5}
参考资料¶
最后更新:
2022年5月17日 22:58:14
Contributors: