ICOA 2026 — Paper S 完整備賽指南
ICOA 2026 — Paper S 完整備賽指南
雪梨全球總決賽(線下,2 天 × 5 小時)
一、準備事項
賽程與規則
| 項目 | 說明 |
|---|---|
| 日期 | 2026 年 6 月 27 日 ~ 7 月 2 日,雪梨實體舉行 |
| 賽制 | Jeopardy-style CTF,找 Flag 後提交 |
| 時間 | 每天 5 小時,共 10 小時 |
| Day 1 | AI4CTF — 用 AI 輔助解傳統資安題 |
| Day 2 | CTF4AI — 攻擊與防禦 AI 系統 |
| 評分 | 兩天 Flag 分數加總;同分比「最後得分時間總和」(越早越好) |
獎牌機制
| 獎項 | 門檻 |
|---|---|
| 🥇 金牌 | 前 8% |
| 🥈 銀牌 | 次 17% |
| 🥉 銅牌 | 次 25% |
| 榮譽獎 | 前 50% |
允許工具與環境
| 工具 | 說明 |
|---|---|
| 環境 | Linux (Ubuntu) 實體機 |
| AI 助手 | Token 預算限制,全程記錄 |
numpy、pandas、sklearn | ✅ 允許 |
| ❌ 禁用 | PyTorch、TensorFlow(所有 ML 攻防須純 numpy 實作) |
必備深度知識點
Adversarial ML 五大攻擊面(重點):
| 攻擊類型 | 核心概念 |
|---|---|
| 逃逸攻擊 (Evasion) | FGSM、PGD,純 numpy 手刻梯度計算 |
| 資料毒化 (Poisoning) | 竄改訓練資料影響模型決策 |
| 後門攻擊 (Backdoor) | 植入觸發器,正常輸入行為正常、觸發時誤判 |
| 模型提取 (Model Extraction) | 大量 API 查詢 + 最小平方法重建權重 |
| 成員推論 (Membership Inference) | 判斷樣本是否在訓練集中 |
必讀文獻: Biggio & Roli (2018) 對抗性機器學習調查論文
二、比賽重點內容
Day 1:AI4CTF 重點
| 類別 | 深度考點 |
|---|---|
| Crypto | ECDSA Nonce Reuse(重用 k 值解私鑰)、RSA 攻擊 |
| Web | Prototype Pollution → RCE、SSTI 進階利用 |
| Forensics | Volatility 記憶體鑑識(pslist vs psscan 比對)、Rootkit 偵測 |
| Reverse | 控制流平坦化(Control-flow flattening)解混淆、angr 符號執行 |
| Pwn | Heap Exploitation(tcache dup double-free) |
Day 2:CTF4AI 重點
| 類別 | 深度考點 |
|---|---|
| 逃逸攻擊 | FGSM/PGD 純 numpy 實作,np.clip 確保有效像素範圍 |
| 模型提取 | OLS(np.linalg.lstsq)從 API 回傳機率重建權重 |
| 後門攻擊 | 分析觸發器、驗證集準確率不下降的原理 |
| 黑箱攻擊 | 代理模型 + 對抗樣本遷移性(Transferability) |
| 防護欄繞過 | 同義改寫繞過輸入分類器、Guardrail 測試框架 |
三、模擬試題
Day 1:AI4CTF
選擇題(每題 5 分)
第 1 題(Crypto) 兩組 ECDSA 簽章 和 的 值相同,代表重用了 nonce ,可進行?
- A) 聯立方程式解出私鑰 ✅
- B) Padding Oracle 攻擊
- C) 偽造任意長度明文
- D) LLL 晶格歸約
第 2 題(Web)
攻擊者繞過 __proto__ 過濾器進行 Prototype Pollution,應改用?
- A) 結合 SQL Injection
- B)
constructor.prototype✅ - C) Base64 編碼
__proto__ - D) JWT 降級攻擊
第 3 題(Forensics)
偵測竄改 readdir 的 Rootkit,最有效的 Volatility 起手式?
- A)
vol -f memdump.raw windows.cmdline - B)
ps aux與網路連線比對 - C) 比較
windows.pslist與windows.psscan的輸出差異 ✅ - D)
binwalk分析 dump 檔
第 4 題(Reverse) Ghidra 中發現「控制流平坦化」(巨大 switch-case),第一步?
- A) 用語音模型生成注釋
- B)
angr暴力破解所有路徑 - C) 解除混淆後再分析核心邏輯 ✅
- D) 手動將所有 case 轉為 Python
第 5 題(Pwn)
Heap Exploitation 中 tcache dup 的主要攻擊目標?
- A) 覆寫 Stack 上的 Return Address
- B) 讓
malloc回傳攻擊者可控的記憶體位址 ✅ - C) 繞過 Kernel Seccomp 限制
- D) 讀取
.rodata區段的 Flag
CTF 實作題(每題 25 分)
Challenge 1:Web — 污染的樣板(Prototype Pollution → RCE)
情境: Node.js 應用程式使用不安全的 merge 函數合併 JSON 物件,後端使用樣板引擎渲染。
任務: 構造 JSON Payload,透過 constructor.prototype 污染全域物件,觸發 RCE 讀取 /flag.txt。
最佳參考答案:
{"constructor": {"prototype": {"env": "id; cat /flag.txt"}}}
依樣板引擎環境變數調整欄位名稱,觸發 RCE。
Flag 格式: ICOA{pr0t0_p0llut10n_t0_rce}
Challenge 2:Crypto — 脆弱的簽章(ECDSA Nonce Reuse)
情境: 伺服器 API 因亂數產生器失效,重複使用相同 值,導致兩次簽章的 值相同。
任務: 用 sympy 解出私鑰 ,偽造管理者簽章。
最佳參考答案:
from sympy import mod_inverse
# s1*k - s2*k = m1 - m2 (mod n)
# k = (m1 - m2) * mod_inverse(s1 - s2, n) % n
k = (m1 - m2) * mod_inverse(s1 - s2, n) % n
d = (s1 * k - m1) * mod_inverse(r, n) % n
Flag 格式: ICOA{n0nc3_r3us3_d3str0ys_3cds4}
Day 2:CTF4AI(Adversarial ML)
選擇題(每題 5 分)
第 1 題(逃逸攻擊)
FGSM 計算完畢後,為何必須執行 np.clip?
- A) 避免梯度消失
- B) 確保像素值落在有效輸入範圍 ✅
- C) 欺騙損失函數
- D) 防止 Overfitting
第 2 題(模型提取) 模型提取攻擊的主要手段?
- A) 駭入伺服器下載權重檔
- B) 竄改訓練資料標籤
- C) 大量查詢 API,用最小平方法重建模型權重 ✅
- D) 攔截 SSL 憑證
第 3 題(後門攻擊) 為何後門模型在驗證集上準確率不下降?
- A) 只針對線性迴歸模型有效
- B) 正常輸入行為完全正常,只在看到觸發器時才改變決策 ✅
- C) 驗證集自動濾除後門特徵
- D) 後門攻擊提升整體效能
第 4 題(黑箱攻擊) 為何在黑箱環境下先訓練「代理模型(Surrogate Model)」?
- A) 消耗防禦者 Token
- B) 利用對抗樣本的遷移性(Transferability),代理模型上的攻擊也能成功欺騙目標模型 ✅
- C) 代理模型自動修補漏洞
- D) 為了進行 Prompt Injection
第 5 題(AI 防禦) 訓練輸入防護欄分類器,最關鍵的資料準備原則?
- A) 只用已知公開的越獄字串
- B) 使用同義改寫(Paraphrase-augmented)擴增惡意樣本 ✅
- C) 所有資料轉為 Base64
- D) 只用安全對話記錄
CTF 實作題(每題 25 分)
注意:禁用 PyTorch/TensorFlow,僅限 numpy 與 scikit-learn
Challenge 1:逃脫邊界(FGSM in NumPy)
情境: 伺服器執行 sklearn Logistic Regression 分類影像,你已取得 model.coef_。
任務: 純 numpy 實作 FGSM,加 擾動翻轉分類結果。
最佳參考答案:
import numpy as np
# 前向計算
z = x @ model.coef_.T + model.intercept_
p = 1 / (1 + np.exp(-z)) # sigmoid
# 計算梯度(Binary Cross-Entropy 對 x 的梯度)
g = (p - y) * model.coef_
# FGSM 攻擊
x_adv = np.clip(x + 0.05 * np.sign(g), 0, 1)
Flag 格式: ICOA{numpypwn_fgsm_evasion}
Challenge 2:權重竊取(Model Extraction via OLS)
情境: 黑箱 API 回傳精確浮點數機率,背後是無隱藏層線性模型。
任務: 隨機查詢 筆輸入,用 np.linalg.lstsq 倒推模型權重矩陣 。
最佳參考答案:
import numpy as np
import requests
N, D = 200, 4 # 樣本數, 特徵維度
X = np.random.rand(N, D)
# 查詢 API 取得機率
P = np.array([
requests.post(API_URL, json={"features": x.tolist()}).json()["confidence"]
for x in X
])
# Logit 轉換後用 OLS 解出權重
logits = np.log(P / (1 - P))
w_hat, *_ = np.linalg.lstsq(X, logits, rcond=None)
print("竊取的權重:", w_hat)
Flag 格式: ICOA{lstsq_st34ls_th3_w31ghts}