2024 AIS3 Pre-exam Writeup
Intro
請容我先自我介紹一下!我今年大一,在高中的時候並不是理工背景的學生,相反,我原本是打算去唸法律系的。但是在高三下的時候意外接觸到了 CTF 的資訊,自己稍微摸索了一下,也學了一點程式設計後發現自己對這個領域更為有興趣。可惜當時已經來不及報名學測的自然科目,我就下定決心要到成大不分系,利用他們的選課權利多修習資工系的課程。最終,我如願進到了成大,也在這將近一年的時間裡,修著和資工系一樣的課程,也更加地堅定了自己的選擇是正確的。
而進到成大後我也並沒有忘記自己當時的初衷,是因為對資安特別感興趣,才誘使我轉換到了這條跑道,所以我也報名了 SCIST 的課程,希望可以在資安領域有更多的成長。嚴格說起來,加上 SCIST 的期末考試,這次是我第二次正式的資安比賽。而這次的我又比上次(SCIST 期末考)花了更多的時間在解題。這次三天的賽程,我幾乎是除了吃飯睡覺以外的時間,都在解題(三點睡覺八點起床 💤),可惜最後還是一直卡在一些想不出來的點,所以解出來的題目還是有點少。希望在我今年暑假的修煉過後,下次參賽可以有更好的表現!
Web
Evil Calculator
Command Injection
先觀察題目,打開 F12 的開發者工具,隨便輸入點東西看看它的運作。這邊我們先在計算機上按下 3+3。
在圖中我們可以看見,他其實是傳了一個 request 給後端服務器,後端服務器會去執行這個計算,並且把結果回傳給前端。這邊的 payload 長這樣:
1 | {"expression": "3+3"} |
我們可以發現他就是執行了後面的 3+3。這時候我們再去看題目給的app.py
文件,就可以更加地確定我們的想法是對的。如下:
1 |
|
所以我們只要把{expression: "3+3"}
中的"3+3"
替換成我們要注入的命令就可以被執行了。
我這邊是用 Chrome 的插件 HackBar 去送請求,本來想要直接cat ../flag
,但我發現他的源碼中會把空格給取代掉,像這樣
1 | expression = data["expression"].replace(" ", "").replace("_", "") |
所以換了種寫法,payload 如下:
1 | {"expression": "''.join([open('../flag').read()])"} |
然後我們就得到 flag 了!
(圖片的字可能有點小,flag 我放在下面)
1 | AIS3{7RiANG13_5NAK3_I5_50_3Vi1} |
(我在寫 writeup 的時候才想到,原來題目叫做 evil calculator 是因為作者給了個小提示告訴我們源碼中的 eval 函式有問題 😶)
Ebook Parser
這題我一看到就覺得是文件上傳漏洞(file upload vulnerability)。
但是知道是知道,難就難在我不知道 payload 是甚麼以及該怎麼實作 🥲。所以我嘗試了很多種方法,包括在某個 epub 檔案後面注入一些東西,但都還是失敗了。
It’s MyGO!!!!!
這個題目給了個網站,上面有很多甚麼 MyGO 的東西(我不知道這啥但我室友一直很開心??),然後稍微亂點一下之後會發現沒有甚麼東西,就是三個介面:簡介、成員介紹、原創曲。點到原創曲那邊後會發現網址好像有個 SQLi 的機會,如下:
1 | http://chals1.ais3.org:11454/song?id=2 |
嘗試過後發現如果把網址改為
1 | http://chals1.ais3.org:11454/song?id=5-3 |
一樣可以跳出剛剛 song id=2 的畫面,所以推測應該是數字型 SQLi。至此,我就沒有想法了…。雖然好像應該要寫出來的,但可惜之前一直沒有好好研究 SQL 語法,所以也不太知道漏洞該用怎麼樣的 payload。(然後後來聽大家在群組說好像可以用 SQLmap,好可惜…暑假一定來好好研究 SQLmap 的文檔~)
Crypto
密碼學真的是一直以來都覺得很難的東西,全部都是數學要理解起來還真的是有點小吃力,希望之後可以多多加油 😶🌫️
babyRSA
這題叫做 babyRSA,但我到最後都還是沒能寫出來 🥲🥲🥲。好的先來看看題目,題目如下:
1 | import random |
題目看起來就是個正常的 RSA 加密流程:
- 先取得兩個大質數
和 和 相乘後得到 得到 - 再找一個和
互質的 ,至此,公鑰已經完成 - 再用
算出 d,至此,私鑰也已經找到
然後接下來我來整理一下我這次嘗試過的各種解法。
暴力因式分解
我嘗試使用FactorDB 去分解
費馬分解(Fermat’s factorization)
費馬分解是用在當
1 | def fermat_factorization(n: int) -> tuple[int, int]: |
可是我開始運行之後很久都還是沒分解出
Wiener’s attack
這邊我是使用了這個工具 來嘗試破解,不過也是失敗,估計是
Reverse
The Long Print
題目給了我們一個二進制文件,然後又是出題在 Reverse 類別,所以就理所當然地把檔案用IDA 打開來看看吧!
點開之後我們就會看到一堆很可怕的東西,所以趕快按下我們的 tab/F5 讓 IDA 幫我們 Decompile 一下。
這樣看起來平易近人多了。那我們就一步一步跟隨著這個程式研究一下他到底如何運作的。為了寫的詳細點我把代碼放上來加點註解解釋一下(寫一起感覺比較清楚),如下:
1 | int __fastcall main(int argc, const char **argv, const char **envp) |
理解了這段程式碼後,第一件事當然是去看看這個 secret 跟 key 到底是甚麼東西囉。在 secret 上點兩下,然後點選 hex view 之後,發現了神奇的東西。
1 | 46 41 4B 45 0B 00 00 00 7B 68 6F 6F 0A 00 00 00 FAKE....{hoo.... |
我當時瞬間以為這就是 flag,提交了之後,想當然,沒那麼簡單 🥹。所以繼續往下看看。這樣看起來剛剛那串東西就是我們需要的 secret 了。再來我們在 key 上面點兩下,就可以發現 key 的值是下面這樣:
1 | .rodata:0000000000002080 key dd 3A011001h, 4C4C1B0Dh, 3A0B002Dh, 454F40h, 3104321Ah |
接下來,我們就只要照題目所做的把它 print 出來就行了(除了 sleep 跟 fflush 的部分),exploit 腳本如下:
1 | secret = [ |
執行之後 flag 就被 print 出來啦!
1 | AIS3{You_are_the_master_of_time_management!!!!?} |
Pwn
因為 Pwn 的部分比較都只是看看題目然後沒有頭緒,或是有頭緒但是不知道該如何做起,再加上到了很晚才去碰 Pwn 的題目,所以就都比較沒有進展,就不寫出來了。
Misc
Three Dimensional Secret
封包分析
這題給了一個capture.pcapng
,所以我們先用 Wireshark 把檔案給打開來,看看他葫蘆裡賣的是甚麼藥。
在圖片中我們可以看到超級多的 TCP 封包,我一開始還不太知道接下來該怎麼做,但我在翻了一下這本書 之後就找到解法了!
首先我們先對著這坨 TCP 封包點右鍵,會出現一個選項叫做 Follow,如圖:
然後我們把它點下去,然後再選擇 TCP Stream,就可以看到 Wireshark 所解析出來的內容,如下:
因為之前忘記在哪裡刷提的時候有寫過類似的題目,所以我知道這串看不懂的字其實是一個叫做 Gcode 的東西,它是用來控制工業中的一些自動工具機的代碼。因為太長了,所以我只放一小部分在下面。Gcode 就長下面這樣。
1 | G0 X171.826 Y145.358 |
既然已經知道了他是 Gcode,我們就趕快來找一個線上的 Viewer 來看看他生作圓還是扁吧!我使用的網站是這個 。把那串代碼放上去後,就點一下圖中的 Plot 來看看!
點下去後發現居然沒有東西,我直接愣在原地被硬控三秒鐘。難道是我想錯了嗎!!!在慌亂之中,我趕緊調整視角,終於發現了偷偷躲在旁邊的 Flag,如下:
(然後因為我偷懶+怕打錯字所以用了 OCR 把它的文字題取出來)
1 | AIS3{b4d1y_tun3d PriN73r} |
Emoji Console
這題點進去後發現是長下面這樣,是由很多 Emoji 所組成的一個 Console,也難怪題目就叫這名字 XD。
在這邊,我嘗試點了一些不同的 emoji,發現會對應到右邊不同的字符,組成不同的命令,所以我先用了
1 | 🐱 ⭐ |
把當前目錄下的所有東西都 cat 出來看看,果然看到了題目的腳本內容。如下:
1 | #!/usr/local/bin/python3 |
至此,我們已經知道了每個符號所對應到的字符,我馬上嘗試使用
1 | 🐱 🚩 (cat flag) |
但可惜題目回應cat: flag: Is a directory
,代表這層目錄的 flag 是一個目錄而不是個文件,沒辦法 cat。我推測真正的 flag 是在flag/flag
的位置,於是我又嘗試了
1 | 🐱 🚩/🚩 (cat flag/flag) |
但是題目會擋掉所有非 emoji 所輸入的東西,所以只能透過組合 emoji 去 bypass 這個條件,可是我嘗試了兩天還是不知道要怎麼繞過才能 cat 到 flag 底下的 flag。
Quantum Nim Heist
這題是個尼姆遊戲,我上網查了一下之後發現他是有必勝方法的(有點類似小時候玩那種誰先喊到 21 就贏了的遊戲)。所以我就寫了下面的 exploit script:
1 | from pwn import * |
運行了幾次後發現,怎麼每次都是輸阿?難道我寫錯了嗎?
經過幾次對 ChatGPT 的詠唱發現自己並沒有寫錯,問題是出在我沒有看到題目有給原始碼…。看了一下後發現原來題目在一開始生成遊戲的時候就已經註定了先手(我們)會輸的結局。如下:
1 | def menu(): |
至此,我的思路就有點卡住了。本來還以為題目設計可以讓我們中途暫停退出,然後用輸入 hash 值得方式繼續剛才的遊戲是為了讓我們可以判斷一下現在的局面,暫停退出先計算出下一步然後再回來繼續遊戲。結果當 Hint 出來的時候說明不要照著規則玩,我整個就失去方向了,所以最後還是不知道怎麼解的。(到現在在寫 writeup 都還是真的好好奇)
Forensics
這次好像把 Forensic 的題目都放在 Misc 裡面了所以跳過這 Part
My Thoughts
在這次參賽完之後,我明顯的體認到了自己的不足之處。就是那種,已經很努力了而且賽期也花了絕大部分的時間在比賽上面,成績卻還是不理想。也更加清楚的知道自己還需要修煉,還有很長一段路得走。
每次參加資安的活動、課程等等,看到那些厲害的學長姐們聚在一起聊天的時候常常會幻想自己有天也能躋身在他們的行列,也是因此,我打算在暑假的時候好好修煉!期待下學期的自己可以多多參加 CTF 比賽,並且爭取得到些成績。在這次暑假中我也會把我每次練習題目的 Writeup 放在我的個人網站上,如果有任何理解錯誤的地方也歡迎大家指正!
*“Do not go gentle into that good night; Old age should burn and rave at close of day. Rage, rage against the dying of the light.” – Interstellar*
Reference
有鑑於我認為自己在資訊這個領域中,如果能有任何的成就或是進展,很大部分的原因都是站在了許多巨人的肩膀上,所以我會把比賽過程中用到的資源都放上來。
不僅僅是為了致敬及感謝,更要提醒自己,自己的不足及渺小。
- 駭客廝殺不講武德:CTF 強者攻防大戰直擊
- 2020/10/24 Web Security 基礎 題解
- CTF Crypto RSA 算法 入门总结(全)
- CTF-RSA 加密-1
- CTF-Crypto-RSA 基本原理及常见攻击方法
- CTF 学习笔记——RSA 加密
- 『 Day 29』拜託別 Pwn 我啦! - Buffer Overflow
- PWN 入門 - buffer overflow 是什麼?
- [資訊安全] 從毫無基礎開始 Pwn – Buffer Overflow 實作
- rsa-wiener-attack
- Linux 的 cut 擷取部份字元、欄位指令教學與常用範例整理
- Bash Script 語法解析
- linux 特殊符号大全
- Linux 中特殊符号的作用
- [新手入門] 003 Linux 指令教學
- 【CTF 攻略】FlappyPig HCTF2016 Writeup
- BUUCTF:[CFI-CTF 2018]webLogon capture
雖然已經盡力回想及搜尋過程中有用到的資源,但可能還是會有些漏網之魚,還請見諒。
- Title: 2024 AIS3 Pre-exam Writeup
- Author: CX330
- Created at : 2024-06-02 21:42:41
- Updated at : 2025-01-16 10:46:27
- Link: https://en.cx330.tw/CyberSec/CTF/2024-AIS3-Pre-exam-Writeup/
- License: This work is licensed under CC BY-NC-SA 4.0.