前言
今年剛好同時參加了 Cyber Range 和 CTF,而且拿了第一名,這種經驗應該蠻少見的,所以決定紀錄一下。
星爆牛炒竹狐拆隊了,正常來說遇到這種情況我會跟 Cake 好朋友們一起打,但因為各種 Drama 我們也拆隊了。最後攜家帶眷加入竹狐,感謝 Ching 和竹狐的大家願意收留我們 ><
不過我的拖延症太嚴重,這篇拖很久才寫,題目細節都忘了很多,就紀錄我印象比較深的題目,拍謝

HITCON CTF 初賽
應該是公認目前台灣難度最高的 CTF 比賽
而今年初賽的前四名台灣隊伍可以進入實體交流賽(類決賽)
vibe2
是一個會用 matplot 畫圖的程式,流程簡單來說如下
- 生成一組隨機的 secret_phrase 字串
- 這個字串可以用 ASCII bytes 表示,再用 matplot 把這個 list 印出來
- 五分鐘之內把圖還原成 secret_phrase 就能拿到 flag
但因為這個圖的畫法還蠻複雜的,點之間可以互相影響畫法,沒辦法一個點一個點爆破,但去逆向畫法更不現實,所以我往設置 constraint 降低爆破難度的方向去想
- 不斷重新抽圖直到 secret_phrace 中同時出現
!和z(透過圖高度是否最高判斷) - 爆破三個點直到 match 這一小段的 target
刷首抽成功的機率是 32% (by ChatGPT),聽起來蠻 feasible 的
但這樣會 TLE 😭

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

在我眼睛瞎掉/拉圖成功之前 unicorn 就把這題解掉了,真的好強…
大概就是假設 secret_phrace 的結尾是 z! 然後爆破其他位子看圖有沒有變更像
huge-hashtable
這題是筆記管理系統,有一個自己實作的 hash,有以下功能
- 註冊/登入/登出
- 創建/讀取筆記

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

但這個時間複雜度直接炸裂,失敗之後就都沒往碰撞的方向想,最後沒解出來QQ
後來看到 HITCON Discord 有人分享解法,是找 hash("note-{owner}-{title} 跟 hash("user-{username};") 的碰撞(birthday attack)做出 heap leak 再用任意讀拿 flag
我記得這題當初不是標 pwn,騙我 😭
simple-drive & simple-drive2
被其他題目痛擊之後四處逛其他隊友解到一半的題目
這題是一個雲端 drive,我看到的時候 Naup 跟 Dr.Dog 已經把解法想出來了,甚至腳本都寫得差不多了
但語音聽起來他們有點 struggle,找不到腳本錯在哪,所以我就去把腳本寫出來撿頭了
抱歉ㄏㄏ


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

HITCON CTF 決賽
時至今日,我還是不知道能不能把這個實體交流賽稱為 HITCON 決賽(因為沒有外國隊伍)
但講決賽聽起來比實體交流賽厲害,雖然有些彆扭我還是要叫他決賽
這次決賽是 belluminar + esports 賽制,簡單來說就是隊伍互相出題互相解
然後主辦單位會額外出題讓隊伍跟隊伍之間單挑,很像電競比賽

我們出的題目
這邊幾乎都是隊友做的,拿其中一個隊友的特選故事改編,弄了一個 galgame 超好笑,但我怕被告就不講細節了
之前做晨晨力量人的時候剛好也是用 krkr-like 的腳本引擎,所以有去幫忙寫了一段遊戲的劇情腳本

想看完整題目的話可以看 ian 的 blog
no-call-revenge-revenge
yet another vincent55 出的 pyjail 題目
看這題的時候剛好同事(傳說中的 Mow 跟 YK)在旁邊,所以就一起看
這樣我四捨五入也算是跟 Balsn 還有 Double Sigma 打過比賽了吧
#!/usr/local/bin/python3
import unicodedataprint(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}} andhelp^~helpSilent-Sync
Gemini 直接解掉了,超級無敵爽

HITCON University “SIP” System Challenge
黑箱題,Xtrimi 跟 albert5888 發現可以用 sqli 愉快的拿到 fake flag Ching 發現這台主機有跑 SIP
Xtrimi 戳到連上 sip 的方法

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


送出答案的時候,超過十個按鈕會被截斷,可以推測答案是 9 位數字 + # 送出鍵 或 10 位數字
於是 Dr.Dog 開始不停嘗試各種可能性,但都解不出來
最後我在凌晨兩點通靈出來了,送 65# 就能拿到 flag
我記得解完這題之後我跑去寫學校作業寫到早上五點,也是很有生活了

解完直接找出題者呂老闆抱怨,但有一說一 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 掉,再用模擬器轉

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

但這個時候已經結束了,幸好第三名沒被淘汰
奪冠熱門牛肉湯也因為這題進到敗者組
Esports - 貓咪大戰爭
一個 Rust 版網頁貓咪大戰爭,總之可以 race condition 做 underflow 拿無限金錢
可惜這題是單挑題,雖然我寫完 exploit 了但 Esports 題只有台上的人可以打
把腳本傳給隊友的話應該就算作弊了
…
只好飲恨看著隊友用手打贏對面的腳本(?

ian 奇蹟般地用手打贏之後我們就進 Esports 決賽了
決賽是點餅乾遊戲的逆向題,Naup 還在逆向的時候
對面 10F 反手就掏出連點器直接奪冠(用魔法打敗魔法.jpg)
HITCON Cyber Range 決賽 (as staff)
其實這次到現場並不是以 CTF 參賽選手的身分,而是 Cyber Range 的 STAFF 😎(歡迎加入 TRAPA)
我出了兩道題目也做了視覺化,所以需要待在現場以免出問題
但題目內容應該沒辦法說就是了,這邊會紀錄一些其他東西

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

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

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

感覺還是挺勵志的,我這種沒甚麼料的人還是可以靠大戰隊拿到第一名
實在是德不配位,希望總有一天能變成很強的人🙏
Fun fact 1: 2024 和 2025 年 Cake 的四個成員都有參加 HITCON CTF 但 Cake 的隊名沒有以任何形式出現過 QQ
Fun fact 2: 頒獎時我們是第二名,事後才發現分數算錯了其實是第一名,所以圖片中我們是拿第二名的板子
Fun fact 3: 頒獎時 10F 是第一名,但大家都以為會是牛肉湯,當時氣氛超級微妙
Fun fact 4: 在走道聊天遇到蕭老師跟寬寬,和他們說我在竹狐,他們看起來頗驚訝竹狐不是純交大戰隊,突然有種叛國的背德感
Fun fact 5: 坐電梯其實是站電梯