K3RN3L CTF 2021 WriteUps
這個 CTF 我是只有在有空的時候才去解點 Crypto 題目的,因為有不少有趣的題目所以還是紀錄一下。這次用的隊伍名是 peko,31 名。
Pryby
1 | from Crypto.Util.number import bytes_to_long |
可以看出它是拿質數作為 binary 表示,所以就分解開然後恢復 bits 得到 flag:
1 | fs = [ |
Pascal RSA
1 | triangle =[[1]] |
這題 RSA 的
所以用它裡面給的通項公式求出
1 | # https://oeis.org/A001317 |
Poly Expo go BRRRRR
1 | #!/usr/bin/env sage |
這題看起來像是 RSA,只是
可以發現
對於
然後還有對於任意多項式都有
有兩個關係之後就足夠計算出
1 | n = 119688104315557021890936576297322528053073582644938225605833562855944546643311189725353580415278613605803528999976536949698525581164157480218289586687945087549976509446759942778609918817975151644563678567137671925049937536315926169828583738712154203276012477308556625213229949900385215601055758028238785190211 |
1-800-758-6237
1 | #!/usr/bin/env python3 |
很明顯的是 AES-CTR nonce reuse,代表所有的 message 都是 xor 某個相同的 key stream 加密的。首先可以先存個大概 100 筆 ciphertext 下來比較好處理。
leak
函數就是在你的 flag 的一些任意 index 插入
*drip*
這個字串,所以明文中肯定也有許多的
*drip*
出現。
所以先假設說其中至少有一筆 ciphertext 的明文是 flag{
開頭,由此可以還原出 key stream 的前面五個 bytes。(會有多個
candidates)
之後對於剩下的部分就利用 *drip
後面一定是 *
和 *dri
後面是 p
這兩個去一個一個把剩下的 key
stream 還原即可。
1 | from itertools import combinations |
Poly-Proof
1 | #!/usr/bin/env python3 |
這題會先把 flag 的每個字元乘上一些 noise 得到多項式係數
第一個目標是要還原出多項式係數,一個最簡單的做法就是取
不過我當時卻沒想到這個,反而用了一個複雜很多的作法:
取一個夠大的常數
取得多項式係數後也沒辦法直接拿到 flag,但是因為
不過實際上只能拿到
1 | from pwn import remote, process |
Non-Square Freedom 1
1 | #!/usr/bin/env python3 |
一個奇怪的 RSA,令 D(C)
為
可以從 padding 函數觀察到
其實我也不太清楚這題究竟是怎麼回事...。詳細的解釋可以看作者的 WriteUp。
Tick Tock
1 | #!/usr/bin/env python3 |
這題有個在一個特殊 group 上的 diffie hellman,需要解開上面的 DLP 才能拿到 key 去解密 flag。
此題因為是在 writeup submission 的範圍中,大概 11/17 的時候我才能公開這題的解法。
*MathyOracle
比賽中沒解,後來看到解法覺得值得解
1 | print('Find my number N, and I will give you the flag.') |
簡單來說有個
如果可以
這題的題目介紹有說 My friend told me I need LSB to solve this, but I don't do drugs! Can you solve it for me instead?,關鍵在於 LSB 的部份。
只是這個方法會遇到的問題是
假設原本第
1 | from pwn import process |
另解
這個是在 Discord 中看到的不同作法,取