前言
這是我的第一次CTF
打得很爛writeup也寫得很爛為了各位的眼睛著想請不要繼續往下看
web
tomorin db
題目觀察
首先點進題目提供的網址 http://chals1.ais3.org:30000/ :
可以看到其中有四個檔案
- cute.jpg
- flag
- is.jpg
- tomorin.jpg
其中三個是圖片,但flag點進去會跳轉到MyGO!!!!!的聿日箋秋 又在GO
漏洞分析
既然flag文件確實存在,但是/flag路徑做了特殊處理,那我們可以嘗試繞過/flag這個路徑
繞過思路
經過嘗試,我發現如果我們用URL編碼 (%2f) 再加上flag就不會被轉址
所以我在根網址後加上 /%2fflag
我們就可以得到flag
1 | AIS3{G01ang_H2v3_a_c0O1_way!!!_Us3ing_C0NN3ct_M3Th07_L0l@T0m0r1n_1s_cute_D0_yo7_L0ve_t0MoRIN?} |
Login Screen 1
頁面分析
點進網頁後我們看到了一個登入介面
包含:
- Username 輸入框
- Password 輸入框
- Login 按鈕
注入攻擊
我們就得到FLAG:
1 | AIS3{1.Es55y_SQL_1nJ3ct10n_w1th_2fa_IuABDADGeP0} |
misc
Ramen CTF
這題是我覺得最有趣的
題目觀察
他給我們了一張圖片
裡面有價值的只有那張發票,我就想到用發票的資訊是不是能查到一些資料
可以得到以下資訊:
- 平和….
- MF開頭
- 2025/04/13的發票
- 隨機碼 7095
- 賣方編號 3478592…
接下來用QRcode掃描程式得知:
- 發票完整號碼 MF16879911
- 餐點是蝦拉麵
地址尋找
將上面的資料輸入財政部電子發票整合平台
我們就得到了地址,再把地址輸入Google Map
我們可以找到一家 樂山溫泉拉麵
我們就可以得到Flag
1 | AIS3{樂山溫泉拉麵:蝦拉麵} |
AIS3 Tiny Server - Web / Misc
首先點進題目提供的網址用好token之後
我們會來到 http://chals1.ais3.org:20096/index.html
我就把常見的隱藏路徑都加上去,多次嘗試後發現加//可以叫出文件目錄
裡面有很多檔案,我就點了檔名有flag的readable_flag_jkO47trw1ctKlOIFC7smx7hivqoCPL8Y
我們就得到了flag:
1 | AIS3{tInY_we8_53Rv3R_wi7H_fILe_8R0Ws1nG_AS_@_FeAtURe} |
Welcome
我就直接打上去owo
crypto
SlowECDSA
看到題目後,我發現這就是一個經典的LCG攻擊題。ECDSA 的安全性完全依賴於隨機數 k 的不可預測性,如果服務器用 LCG 來生成這些隨機數,那就不難了
收集範本
既然服務器提供 get_example
功能,我就先調用兩次,獲取兩個不同簽名。這樣我就能得到使用連續 LCG 隨機數的簽名對
數學關係
根據Perplexity的資料:
ECDSA 簽名公式是:
$$ s = k^{-1} \times (h + r \times d) \bmod n $$
如果 k₁ 和 k₂ 有線性關係:k₂ = (a × k₁ + c) mod n,那我們就能建一個關於 d 的方程式
求解
從兩個簽名的關係中,可以推導出:
$$ s₂^{-1} \times (h + r₂ \times d) \equiv a \times s₁^{-1} \times (h + r₁ \times d) + c \pmod{n} $$
解這個線性方程就能得到 d。
預測
有了私鑰,我們就能反推出真正的 k₁,然後利用 LCG 的線性性質預測 k₃。
偽造簽名
用預測的 k₃ 和已知的私鑰,為目標消息 “give_me_flag” 生成完全有效的簽名。
攻擊
我叫AI寫了一個 Python 腳本來實現這個攻擊:
1 | from pwn import * |
執行後,我們得到了Flag:
1 | AIS3{Aff1n3_nounc3s_c@N_bE_broke_ezily...} |
Stream
根據題目提供的python程式,我們看到了這個加密方案的缺陷:
當明文相對於密鑰較小時,XOR 運算的結果主要由密鑰決定
所以我們可以利用數學關係逆向攻擊
思路
現在我們知道加密公式為:
1 | encrypted_int = flag_int ⊕ (rand_num²) |
當 flag_int 遠小於 rand_num² 時,我們有:
1 | encrypted_int ≈ rand_num² |
那我們就可以逆推flag了
攻擊
我們先計算近似隨機數:
1 | approx_rand_num = math.isqrt(encrypted_int) |
再搜索偏移亮:
1 | for offset in range(-search_width, search_width + 1): |
接下來對每個候選隨機數,計算其平方並嘗試解密:
1 | key_squared = rand_num_candidate ** 2 |
基本過濾:
1 | # 排除無效結果 |
轉換為字串
1 | def int_to_bytes(n: int) -> bytes: |
最後一部,解碼
1 | try: |
運行後我們就拿到了flag:
1 | AIS3{no_more_junks...plz} |
Hill
系統使用兩個矩陣 A 和 B:
第一個分組:c₀ = A × m₀
後續分組:cᵢ = A × mᵢ + B × mᵢ₋₁
思路
(伺服器只允許一次 input()
)
我需要一個特殊的輸入序列來同時恢復 A 和 B 矩陣。我想到用標準基向量:載荷 = [e₀, 0, e₁, 0, e₂, 0, ..., e₇, 0]
當服務器處理這個載荷時:
- c₀ = A × e₀ 得到 A 的 0
- c₁ = A × 0 + B × e₀ 得到 B 的 0
- c₂ = A × e₁ 得到 A 的 1
- 以此類推…
恢復 A 和 B 後,計算 A 的逆矩陣,然後逆向解密目標 FLAG
攻擊
1 | import numpy as np |
執行後,我們得到:
FLAG:AIS3{b451c_h1ll_c1ph3r_15_2_3z_f0r_u5}
Happy Happy Factoring
這是一個經典的多算法組合攻擊:
- wi:Williams’ p+1 算法
- po:Pollard’s p-1 算法
- fp, fq:Fermat 因式分解法
先用 Pollard’s p-1 找到 po,移除 po² 後用 Williams’ p+1 找到 wi,最後用 Fermat 方法分解剩餘部分
獲得所有因數後計算歐拉函數並解密。
1 | import gmpy2 |
我們就得到了FLAG:AIS3{H@ppY_#ap9y_CRypT0_F4(7or1n&~~~}
結尾
很高興,你看到這裡眼睛還沒瞎掉
但下面沒東西了,所以我們下次見(?)
說些什麼吧!