ICOA 2026 — Paper S 完整備賽指南

雪梨全球總決賽(線下,2 天 × 5 小時)


一、準備事項

賽程與規則

項目說明
日期2026 年 6 月 27 日 ~ 7 月 2 日,雪梨實體舉行
賽制Jeopardy-style CTF,找 Flag 後提交
時間每天 5 小時,共 10 小時
Day 1AI4CTF — 用 AI 輔助解傳統資安題
Day 2CTF4AI — 攻擊與防禦 AI 系統
評分兩天 Flag 分數加總;同分比「最後得分時間總和」(越早越好)

獎牌機制

獎項門檻
🥇 金牌前 8%
🥈 銀牌次 17%
🥉 銅牌次 25%
榮譽獎前 50%

允許工具與環境

工具說明
環境Linux (Ubuntu) 實體機
AI 助手Token 預算限制,全程記錄
numpypandassklearn✅ 允許
❌ 禁用PyTorch、TensorFlow(所有 ML 攻防須純 numpy 實作)

必備深度知識點

Adversarial ML 五大攻擊面(重點):

攻擊類型核心概念
逃逸攻擊 (Evasion)FGSM、PGD,純 numpy 手刻梯度計算
資料毒化 (Poisoning)竄改訓練資料影響模型決策
後門攻擊 (Backdoor)植入觸發器,正常輸入行為正常、觸發時誤判
模型提取 (Model Extraction)大量 API 查詢 + 最小平方法重建權重
成員推論 (Membership Inference)判斷樣本是否在訓練集中

必讀文獻: Biggio & Roli (2018) 對抗性機器學習調查論文


二、比賽重點內容

Day 1:AI4CTF 重點

類別深度考點
CryptoECDSA Nonce Reuse(重用 k 值解私鑰)、RSA 攻擊
WebPrototype Pollution → RCE、SSTI 進階利用
ForensicsVolatility 記憶體鑑識(pslist vs psscan 比對)、Rootkit 偵測
Reverse控制流平坦化(Control-flow flattening)解混淆、angr 符號執行
PwnHeap 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 簽章 (r,s1)(r, s_1)(r,s2)(r, s_2)rr 值相同,代表重用了 nonce kk,可進行?

  • A) 聯立方程式解出私鑰 dd
  • 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.pslistwindows.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 因亂數產生器失效,重複使用相同 kk 值,導致兩次簽章的 rr 值相同。

任務:sympy 解出私鑰 dd,偽造管理者簽章。

最佳參考答案:

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) 確保像素值落在有效輸入範圍 [0,1][0,1]
  • 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,僅限 numpyscikit-learn

Challenge 1:逃脫邊界(FGSM in NumPy)

情境: 伺服器執行 sklearn Logistic Regression 分類影像,你已取得 model.coef_

任務: 純 numpy 實作 FGSM,加 ϵ=0.05\epsilon = 0.05 擾動翻轉分類結果。

最佳參考答案:

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 回傳精確浮點數機率,背後是無隱藏層線性模型。

任務: 隨機查詢 NN 筆輸入,用 np.linalg.lstsq 倒推模型權重矩陣 w^\hat{w}

最佳參考答案:

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}

Built with LogoFlowershow