Before all
Rank 11 / Team: ICEDTEA
這周末有點久違的跟 ICEDTEA 一起打了 Project Sekai 辦的 osu!gamming CTF,整體題目其實不算難,Crypto 差一題 AK,偏可惜,如果我不要忙段考前拖更得那坨作業一定有機會打出來 TwT
還是來 writeup 一下,題目有些偏技巧,有點有趣
但感覺整的隊變強了不錯w
我打完 Crypto 沒空了本來要救 web 發現都打完了,然後可能是隊上 osu 玩家太多導致我們 osu 題打很快?! 但我都看不懂在幹嘛w 暫時不是 osu 廚
其他就是,Crypto 狗在 LLM 的成長下是不是要失業了 T_T
Writeup
這次我只打了 Crypto
pls-nominate
RSA,一個長訊息被 e=5 加密了五次,所以不能直接廣播攻擊。
script.py
1 | from Crypto.Util.number import * |
所以要透過 known high bits of message b"hello there can you pls nominate my map https://osu.ppy.sh/beatmapsets/2436259 :steamhappy: i can bribe you with a flag if you do: ",構造一個多項式然後一樣做 CRT,解 $(HIGH_BITS + x)^5 - CRT([Cs], [Ns]) \space (mod \space \prod N_i)$
然後因為 x 之於 $N^5$ 左右的量級一定相對小,直接 Coppersmith Method 找 small_roots 做完
exp.py對不起我想完後直接把腳本詠唱出來了
1 | from sage.all import * |
linear-feedback
自己實作了一種 LFSR,然後生成一個 29 bits seed stream 和一個 21 bits seed stream 後做 xnor,要反推出 seed 們
1 | from secrets import randbits |
因為 xnor 運算是可反推的,最有效率的做法就是枚舉 21 bits 的所有可能,生成 stream 後反推 xnor 回去,然後計算 stream 前 29 bits 拿來生 LSFR 是不是一樣的結果,是的話它可能就是我們要的 KEY。
sol.py
1 | from hashlib import sha256 |
ssss
在質數 p25519 下做 Secret Sharing,多項式係數是 lcg 生出來的係數未知,oracle 最多可以做 14 次,就是回傳 f(x) 的值其中 x 介於 1 ~ p25519
要 leak 出常數項(lcg 的頭)來拿 flag
server.py
1 | #!/usr/local/bin/python3 |
整個問題其實有一個觀察是未知數從頭到尾只有 a, b, SECRET 三項,能把他們線性化就解完了。
一個代數小觀察:
$$
\begin{align}
\alpha = \frac{f(x)+f(-x)}{2} \newline
\beta = \frac{f(x)-f(-x)}{2}
\end{align}
$$
其中 $\alpha$ 是多項式 $f(x)$ 偶數項運算的加總結果, $\beta$ 是多項式 $f(x)$ 奇數項運算的加總結果,簡單推一下會發現
$\alpha = \beta \cdot x \cdot a + b \cdot (x^2 + x^4 + x^6 + \cdots + x^{14}) + SECRET$
於是做六次(三對) oracles 就可以 leak 出 a, b, SECRET 了,不過我的腳本保險起見領了四個數字確定三元等式有正確被解
exp.py
1 | from sage.all import * |
please-nominate
三條有幾個字元不一樣的訊息被三把不同的 RSA 公鑰加密。
要把 hidden 的 flag 解出來。
flag 很長
1 | from Crypto.Util.number import * |
一開始肯定想構造三條多項式像是(C_i 是密文輸出)
$P_i(X) = (HIGH_BITS\space_i + X)^3 - C_i \space (= 0)$
然後就會發現沒什麼用因為他們實際在不同的 Ring 下
所以先把他們抬到同一個 Ring 下,反正我是挑 $Zmod(N_1 \cdot N_2 \cdot N_3)$
接著因為中國剩餘定理,我知道像是 $N2\cdot N3 \cdot P_1(X)$ 多項式會對 $N_2, N_3$ 同餘 0,然後 對 $mod\space N_1$ 又是 $N2\cdot N3 \cdot P_1(X)$,所以顯然會有 $N2\cdot N3 \cdot P_1(X) \space (mod \space N_1 \cdot N_2 \cdot N_3)$ 的結果是可以直接被等價計算的。
(會這樣是因為我們不能直接知道 $P_1(X) \space (mod \space N_1 \cdot N_2 \cdot N_3)$ 的結果)
最後把三條多項式加在一起我們會知道他等於 0,最後因為 FLAG (X) 遠小於 $N_1 \cdot N_2 \cdot N_3$ 所以 Coppersmith Method 一樣可以把 small_roots 做出來
1 | from sage.all import * |
*ssss+ (賽後 意念 upsolve)
殘念…
簡言之就是剛剛的 ssss lcg 的 mod 換成一個隨機的 prime(不公開)
之後有空補一下腳本,反正就是拿 $\pm 1 \pm 2 \cdots \pm 7$ 去做 oracle,然後我們能解出奇數項的所有係數,最後係數一樣是以 $a, b$ 為基組合出的某種線性關係,最後把相減的結果做 gcd 就可以 leak 出隨機的 prime 值,回推 a, b 然後把所有係數還原 leak 出 SECRET。