AIS3 EOF 2026 Qual writeup

前言 先排個雷,這次比賽的 writeup 很大比例是 LLM 協助完成的,包含題目分析、解題思路、程式碼撰寫等,多數題目都是,所以如果想看到 LLM 的極限可以參考這篇 writeup,但如果想看到純人力的解題過程可能不太適合 (X。 Score/Rankings welcome Welcome flag: EOF{2026-quals-in-2025} 加入 discord 然後在 announcement 頻道旁邊 misc MRTGuessor flag: EOF{catch_up_MRT_by_checking_the_timetable_in_advance} 只有三次機會,要猜以下圖片是台北捷運板南線的哪一站 仔細比對各站的天花板跟燈的相對方向最後猜滿三次,答案是忠孝新生 SaaS flag: EOF{TICTACTOE_TICKTOCTOU} 題目給了 example.c 和 seccomp-sandbox.c ,然後如題名所示是提供一個類似 SaaS 的 service,可以允許使用者上傳檔案,接下來會在一個有 seccomp rule 的 docker sandbox 裡面執行,那基本上就是要直接去讀 sandbox 裡面的 /flag 檔案,會被抓下來的部分如下 基本上 sandbox 使用 seccomp user notification 在 user-space 攔截並檢查相關的 syscall。 結論來說 open 系列被欄之後會去檢查 pathname,link 系列會去防止 link-based bypass,mount 會防 FS rebind,name_handle_at 防 inode handle bypass,那整體流程經過分析 seccomp-sandbox.c 會得知流程為 ...

2025-12-24 · 48 min · 10176 words · YJK

AIS3 Pre-exam 2025 writeup

author:YJK ID:YJK Misc Welcome flag: AIS3{Welcome_And_Enjoy_The_CTF_!} 免費 flag,但要自己輸入,不要 ctrl c+ctrl v,會拿到 fake flag Ramen CTF flag: AIS3{樂山溫泉拉麵:蝦拉麵} 圖片右邊有一張發票條碼沒有被擋 掃描之後發現應該是蝦拉麵,發票上店家是平和溫泉拉麵店 google 之後發現地址是 宜蘭縣礁溪鄉德陽村礁溪路五段108巷1號 此地址在 google map 上是 樂山溫泉拉麵 AIS3 Tiny Server - Web / Misc flag: AIS3{tInY_we8_53RV3R_WItH_FIle_8R0Ws1n9_@s_@_Fe@TuRe} 雖然題目敘述說建議 local 先解解看,但我直接開 instance, 點進去會發現是題目簡介網頁,並發現網址給了 index.html 另外題目有給小提示,專注在第一個提示就好 因為前面 index.html 的因素,直接訪問 http://chals1.ais3.org:20148/ ,會發現是個 file server 的感覺 不過這可能只是當初開 file server 指定的目錄,而不是機器的 root 目錄,嘗試透過 http://chals1.ais3.org:20148// ,跳脫上去試試看,發現應該是 root 目錄,直接訪問檔案 ...

2025-07-01 · 11 min · 2304 words · YJK

AIS3 mfctf & pre-exam 2024 writeup

Web Evil Calculator 網頁是一個簡單的計算機程式 透過攔截封包與 app.py 程式碼會發現他是將結果傳 POST 請求到 /calculate,並傳入 eval 做計算,所以可以傳入程式碼做解析,接下來看到 app.py 會發現傳送過去的 expression 空格跟底線都會被過濾,所以應該是不可以 import 其他東西,接下來看到 docker-compose.yml 可知 flag 在 /flag,因此直接透過開檔讀檔拿到 flag app.py 1from flask import Flask, request, jsonify, render_template 2 3app = Flask(__name__) 4 [email protected]('/calculate', methods=['POST']) 6def calculate(): 7 data = request.json 8 expression = data['expression'].replace(" ","").replace("_","") 9 try: 10 result = eval(expression) 11 except Exception as e: 12 result = str(e) 13 return jsonify(result=str(result)) 14 [email protected]('/') 16def index(): 17 return render_template('index.html') 18 19if __name__ == '__main__': 20 app.run("0.0.0.0",5001) docker-compose.yml ...

2024-07-01 · 5 min · 910 words · YJK