AIS3 2025 pre-exam & myfirst ctf write up
[mfctf(o)/pre-exam(x)] 代表的是在mfctf有解出來但是pre-exam沒解
pre-exam排名73

mfctf排名7

ㄏㄏ只比mfctf多300分, 可以再廢一點
misc [mfctf(o)/pre-exam(x)]
Welcome
已經給了, 不過不能複製貼上我直接手打

flag : AIS3{Welcome_And_Enjoy_The_CTF_!}

用google翻譯用出來的結果w
Ramen CTF
這題有給一個圖片, 可以發現他有一個發票

拿去掃之後可以發現她的發票號碼為MF-16879911, 另外可以發現他的隨機碼是7095, 日期是2025/4/13, 所以把以上線索拿去https://www.einvoice.nat.gov.tw/portal/btc/audit/btc601w/search查就可以查到是哪一間也可以知道吃啥

題目說flag的format是AIS3{google_map上的店家名稱:跟他吃的東西}
所以我把這個地址拿去google查發現他跟發票上面的名字完全不一樣==

最後可以組成一下flag
flag : AIS3{樂山溫泉拉麵:蝦拉麵}
至於為啥沒有蔬食拉麵我也不知道
AIS3 Tiny Server - Web / Misc
這題真的超簡單 不知道為啥沒什麼人解
不過我也是靠這題在保名次的
這題進來就是一個介面, 下面有說明, 似乎跟path traversal有關

然後我就到把index.html拿掉就發現看起來可以lfi

所以我就一直往上一層目錄走(要用%2f代替/才不會被返回到原本的地方)
到根目錄可以發現有一個readable_flag_<random>的檔案

去讀它就有flag了

flag : AIS3{tInY_WeB_S3RV3R_wi7H_FILe_BrOWs1nG_As_@_FeatUR3}
Web [mfctf(o)/pre-exam(x)]
Tomorin db 🐧
這題跟上面的misc一樣的道理

觀察原始碼發現他如果按下flag就會帶我到那個網址的地方, 但是flag也是真的flag, 他只是被重新導向而已

所以我就用了…%2f來做path traversal

flag : AIS3{G01ang_H2v3_a_c0O1_way!!!_Us3ing_C0NN3ct_M3Th07_L0l@T0m0r1n_1s_cute_D0_yo7_L0ve_t0MoRIN?}
Login Screen 1
這題其實是白箱, 但是我是在黑箱的情況下打出來的
先說一下我的解法
首先我是先發現他可以使用admin/admin登入(我也不知道為啥)

登入之後會看到一個要輸入2fa代碼的介面, 但是現在有一個問題就是我不知道admin的2fa是甚麼, 直接進去dashboard.php也會被redirect到2fa.php
, 這時候我就想到一個方法是用先進去guest的dashboard.php然後在使用admin的cookie拿到flag
至於怎麼做的…
我是先用burpsuite先登入guest進去她的dashboard.php

然後再用我原本登入admin的cookie貼到已經以guest身分進入dashboard.php的cookie

然後就拿到flag了

flag : AIS3{1.Es55y_SQL_1nJ3ct10n_w1th_2fa_IuABDADGeP0}
還有另外一個方法更簡單, 但是是在有給原始碼的情況下
可以看到docker-compose.yml除了其他的.php還有一個是users.db

只要在網址後面輸入users.db就會把database給下載下來
然後再用vs code裡面的模組去看database就可以看到admin的2fa code

把他複製貼上就可以拿到flagㄌ

pwn [mfctf(x)/pre-exam(o)]
Welcome to the World of Ave Mujica🌙
這題只能說我眼幹沒有看到read_int8()的部分…看到之後再5分鐘內就解出來了
看到main function的時候可以發現他的輸出都是一堆unicode不過不影響

我們的目標是跳到這裡去拿到shell, 嗯對 就是典型的buf

進去之後要先輸入yes, 第二步是他會叫你輸入你要的名字長度

但是因為他在read_int8()有做長度限制, 所以最高只能輸入127, 導致你不能overflow到win function

不過可以看到他沒有規定最小值, 所以可以輸入-1觸發integer overflow

有了這些線索之後就可以開始寫腳本了ww
最後的exploit:
1 | from pwn import * |

flag : AIS3{Ave Mujica🎭將奇蹟帶入日常中🛐(Fortuna💵💵💵)…Ave Mujica🎭為你獻上慈悲憐憫✝️(Lacrima😭🥲💦)…_d3513aab63a5f2da52390b8fdd9fac04}
reverse [mfctf(x)/pre-exam(o)]
AIS3 Tiny Server - Reverse
在sub_1E20有一個加密flag的地方, 逆向他就好
exploit:
1 | v8 = [ |
flag : AIS3{w0w_a_f1ag_check3r_1n_serv3r_1s_c00l!!!}
web flag checker [mfctf(x)/pre-exam(o)]
這題的話用CTRL+U可以看到他有一個index.js可以看, 仔細看會發現裡面會有一個檔案叫index.wasm輸入在網址後面就可以下載下來
接下來就要下載工具wabt, 它是用來decompiler wasm file的工具

載好build好之後就可以去decompiler他

最後把decompiler的結果丟給ai讓他去逆向出flag就好了
1 | def ror(val, r_bits, max_bits=64): |
flag : AIS3{W4SM_R3v3rsing_w17h_g0_4pp_39229dd}
crypto [mfctf(x)/pre-exam(o)]
我只有cry的部分😢gemini pro才是mvp
Stream
exploit:
1 | import math |
flag : AIS3{no_more_junks…plz}
Random_RSA
1 |
|
flag : AIS3{1_d0n7_r34lly_why_1_d1dn7_u53_637pr1m3}
SlowECDSA
解題流程:


exploit:
1 | import hashlib |
flag : AIS3{Aff1n3_nounc3s_c@N_bE_broke_ezily…}