2453 words
12 minutes
HITCON CTF 2025 Qual/Final Write-up 與心得

visitor badge

前言#

今年剛好同時參加了 Cyber Range 和 CTF,而且拿了第一名,這種經驗應該蠻少見的,所以決定紀錄一下。

星爆牛炒竹狐拆隊了,正常來說遇到這種情況我會跟 Cake 好朋友們一起打,但因為各種 Drama 我們也拆隊了。最後攜家帶眷加入竹狐,感謝 Ching 和竹狐的大家願意收留我們 ><

不過我的拖延症太嚴重,這篇拖很久才寫,題目細節都忘了很多,就紀錄我印象比較深的題目,拍謝

image-1.png

HITCON CTF 初賽#

應該是公認目前台灣難度最高的 CTF 比賽
而今年初賽的前四名台灣隊伍可以進入實體交流賽(類決賽)

vibe2#

是一個會用 matplot 畫圖的程式,流程簡單來說如下

  1. 生成一組隨機的 secret_phrase 字串
  2. 這個字串可以用 ASCII bytes 表示,再用 matplot 把這個 list 印出來
  3. 五分鐘之內把圖還原成 secret_phrase 就能拿到 flag

但因為這個圖的畫法還蠻複雜的,點之間可以互相影響畫法,沒辦法一個點一個點爆破,但去逆向畫法更不現實,所以我往設置 constraint 降低爆破難度的方向去想

  1. 不斷重新抽圖直到 secret_phrace 中同時出現 !z(透過圖高度是否最高判斷)
  2. 爆破三個點直到 match 這一小段的 target

刷首抽成功的機率是 32% (by ChatGPT),聽起來蠻 feasible 的 但這樣會 TLE 😭 image-2.png

轉個念想想覺得五分鐘其實滿多的,感覺可以刷完首抽之後手動拉圖
所以就 vibe coding 了一個 GUI 拉圖工具

image-3.png

在我眼睛瞎掉/拉圖成功之前 unicorn 就把這題解掉了,真的好強…
大概就是假設 secret_phrace 的結尾是 z! 然後爆破其他位子看圖有沒有變更像

huge-hashtable#

這題是筆記管理系統,有一個自己實作的 hash,有以下功能

  • 註冊/登入/登出
  • 創建/讀取筆記

image-4.png

那個時候我的想法是直接爆,大力出奇蹟(好傻好天真)

image-5.png

但這個時間複雜度直接炸裂,失敗之後就都沒往碰撞的方向想,最後沒解出來QQ

後來看到 HITCON Discord 有人分享解法,是找 hash("note-{owner}-{title}hash("user-{username};") 的碰撞(birthday attack)做出 heap leak 再用任意讀拿 flag

我記得這題當初不是標 pwn,騙我 😭

simple-drive & simple-drive2#

被其他題目痛擊之後四處逛其他隊友解到一半的題目
這題是一個雲端 drive,我看到的時候 NaupDr.Dog 已經把解法想出來了,甚至腳本都寫得差不多了
但語音聽起來他們有點 struggle,找不到腳本錯在哪,所以我就去把腳本寫出來撿頭了 抱歉ㄏㄏ image-6.png

image-7.png

然後這個解法應該是 unintended,就這樣順便解掉 revenge 題了
爽賺

Result#

初賽竹狐是最高分的台灣隊伍,也是世界第十三名
成功進入實體交流賽🥳,另外三隊也都是老熟人了
除了透過初賽晉級以外,AIS3 會另外推薦 2 隊直接進入決賽
結果我在賽後收到推薦了,超虧
後來 AIS3 推薦的兩隊是 Blue Goblin 跟 10F,其實約等於初賽第五名的隊伍拆成兩隊,意外地超級公平

image-8.png

HITCON CTF 決賽#

時至今日,我還是不知道能不能把這個實體交流賽稱為 HITCON 決賽(因為沒有外國隊伍)
但講決賽聽起來比實體交流賽厲害,雖然有些彆扭我還是要叫他決賽

這次決賽是 belluminar + esports 賽制,簡單來說就是隊伍互相出題互相解
然後主辦單位會額外出題讓隊伍跟隊伍之間單挑,很像電競比賽

image-9.png

我們出的題目#

這邊幾乎都是隊友做的,拿其中一個隊友的特選故事改編,弄了一個 galgame 超好笑,但我怕被告就不講細節了

之前做晨晨力量人的時候剛好也是用 krkr-like 的腳本引擎,所以有去幫忙寫了一段遊戲的劇情腳本 image-10.png

想看完整題目的話可以看 ian 的 blog

no-call-revenge-revenge#

yet another vincent55 出的 pyjail 題目

看這題的時候剛好同事(傳說中的 Mow 跟 YK)在旁邊,所以就一起看
這樣我四捨五入也算是跟 Balsn 還有 Double Sigma 打過比賽了吧

#!/usr/local/bin/python3
import unicodedata
print(open(__file__).read())
expr = unicodedata.normalize("NFKC", input("> "))
if "._" in expr:
raise NameError("no __ %r" % expr)
if any([x in "(['\"+-*/ ])" for x in expr]):
raise NameError("no (['\"+-*/ ]) %r" % expr)
# no breakpoint for you :>
if "breakpoint" in expr:
raise NameError("no breakpoint %r" % expr)
eval(expr)

這題把之前在 AIS3 pre-exam 的 nocall-revenge 多 ban 了 breakpoint

可以用 nocall-revenge 提到的做法用 for 把沒被 ban 的運算子蓋掉,而且一次蓋兩個成 eval 跟 input 之後就可以直接 import os RCE

{0 for help. __class__. __xor__ in{eval}} and
{0 for help. __class__. __invert__ in{input}} and
help^~help

Silent-Sync#

Gemini 直接解掉了,超級無敵爽

image-11.png

HITCON University “SIP” System Challenge#

黑箱題,Xtrimialbert5888 發現可以用 sqli 愉快的拿到 fake flag Ching 發現這台主機有跑 SIP

Xtrimi 戳到連上 sip 的方法 image-12.png

Xtrimi 繼續發力,發現連上之後按 * 輸入 1024 可以進入下一階段解 RSA

image-13.png

image-14.png

送出答案的時候,超過十個按鈕會被截斷,可以推測答案是 9 位數字 + # 送出鍵 或 10 位數字

於是 Dr.Dog 開始不停嘗試各種可能性,但都解不出來

最後我在凌晨兩點通靈出來了,送 65# 就能拿到 flag
我記得解完這題之後我跑去寫學校作業寫到早上五點,也是很有生活了 image-15.png

解完直接找出題者呂老闆抱怨,但有一說一 SIP 蠻有趣的

Driver Killer#

給了一台 VM 跟沒權限讀的 flag.txt
提權到 NT SYSTEM 之後(忘記那時候怎麼提的,但蠻簡單)
再去看 flag.txt 會發現是一個爛掉的 flag
印象中大概長這樣 hitcon{http://xxxx.xxx/chat XXXXXXX},總之看起來後半段是加密過的,前面 URL 我想說是 rickroll 之類的東西就沒看,逛了一下沒看到甚麼可疑的 Driver,就放棄了

後來 albert5888 說那個 URL 就是第二關,過去打 prompt injection 就好了 = =

Esports - Android 計步器#

少數可以整組一起參加的 Esports 題,這題是一個計步器的 apk,搖晃手機就可以加分 現場一堆人在那邊搖手機,非常抽象

直覺的思路是去看加分的邏輯然後直接打 request,我拆了 apk 之後發現加分的邏輯有點複雜,但單挑賽分秒必爭沒時間逆向
所以反手打開 android interpreter,結果甚麼封包都攔不到,太久沒用不知道環境什麼時候爛掉的,隊友看起來也沒人會 android

只好改變思路把 anti-debug patch 掉,再用模擬器轉 image-17.png

patch 完之後 Dr.Dog 發現可以 patch 一下頻率限制

image-18.png

但這個時候已經結束了,幸好第三名沒被淘汰
奪冠熱門牛肉湯也因為這題進到敗者組

Esports - 貓咪大戰爭#

一個 Rust 版網頁貓咪大戰爭,總之可以 race condition 做 underflow 拿無限金錢
可惜這題是單挑題,雖然我寫完 exploit 了但 Esports 題只有台上的人可以打
把腳本傳給隊友的話應該就算作弊了 … 只好飲恨看著隊友用手打贏對面的腳本(?

image-16.png

ian 奇蹟般地用手打贏之後我們就進 Esports 決賽了
決賽是點餅乾遊戲的逆向題,Naup 還在逆向的時候
對面 10F 反手就掏出連點器直接奪冠(用魔法打敗魔法.jpg)

HITCON Cyber Range 決賽 (as staff)#

其實這次到現場並不是以 CTF 參賽選手的身分,而是 Cyber Range 的 STAFF 😎(歡迎加入 TRAPA)
我出了兩道題目也做了視覺化,所以需要待在現場以免出問題
但題目內容應該沒辦法說就是了,這邊會紀錄一些其他東西

image-19.png

當 staff 的好處之一就是可以跟老闆 ddaa 一起住飯店,爽度不亞於讓 agent 自動解題目

image-20.png

這次視覺化是從去年的版本改的,改掉了一些令人詬病的問題
加入了廣受好評的遙控功能,現在甚至還能噴火
如果你想花 100 億之類的買下視覺化的話可以聯絡我們老闆 image-21.png

幸好我負責的部分都沒出事,就在旁邊打了兩天的 CTF ㄏㄏ
會場旁邊還有一些社群的攤位,當然也有免費食物,乞丐超人再次要到飯

後記#

拿了第一名
開心開心開心,超扯超扯超扯

image-22.png

感覺還是挺勵志的,我這種沒甚麼料的人還是可以靠大戰隊拿到第一名
實在是德不配位,希望總有一天能變成很強的人🙏

Fun fact 1: 2024 和 2025 年 Cake 的四個成員都有參加 HITCON CTF 但 Cake 的隊名沒有以任何形式出現過 QQ

Fun fact 2: 頒獎時我們是第二名,事後才發現分數算錯了其實是第一名,所以圖片中我們是拿第二名的板子

Fun fact 3: 頒獎時 10F 是第一名,但大家都以為會是牛肉湯,當時氣氛超級微妙

Fun fact 4: 在走道聊天遇到蕭老師跟寬寬,和他們說我在竹狐,他們看起來頗驚訝竹狐不是純交大戰隊,突然有種叛國的背德感

Fun fact 5: 坐電梯其實是站電梯

HITCON CTF 2025 Qual/Final Write-up 與心得
https://flydragonw.github.io/posts/hitconctf_2025/
Author
Flydragon
Published at
2025-12-27
License
CC BY-NC-SA 4.0