BambooFox CTF 2021
BambooFox CTF 2021
這次是第二次參加BambooFox,不過事前都沒有做什麼練習wwww本來想說去OT之前推薦過的網站練習一些基礎,但是忘記是什麼網站了888
依然是跟joy一隊,然後另一個隊友變成casper了
今年似乎是大進步,不過我懷疑只是因為考很多演算法題orz
來講一些有解的題目,很抱歉我不知道怎麼讓我的code折疊起來XD
Gamer’s Cipher
一開場先開了 P versus ♯P,雖然查到解法可是精度跟速度都壓不過去,所以只好放棄改開別題。
然後第一個成功的題目就是Gamer’s Cipher這一題。
casper說看懂code就解完了(?)不過他沒辦法編譯所以也不知道怎麼辦。
總之我也跑去下載code看,然後查了好一下子怎麼編譯Haskell(記得編譯要加-dynamic
的flag),成功編譯之後努力看懂code。
看起來像是用Nimber對字串加密,
明文和密文的長度都是$n=51$,然後他的key必須要是$n$階的原根,所以我寫了一個腳本看哪些是合法的key。
|
|
但是關鍵的加密部份怎麼樣都不確定我看的對不對,所以我先把nimber的乘法表弄成一個文字檔存起來,再另外寫一個python跟Haskell的輸出比對
整理一下之後發現,欸這個式子不就是傅立葉轉換嗎?!(而且還是用Nimber做DFT,酷爆)就想說可能要用多項式插值或是寫inverse FFT
之後用python寫inverse DFT寫掉了,基本上只要把key的乘法反元素找出來帶進去傅立葉轉換的式子就好了
|
|
|
|
Better than ASM
這時候joy似乎在看交替看各題,casper在解verilog
然後我發現calc.exe有給source code很佛 :D 雖然是放在網頁隱藏的元素上面,不過點進去html就看得到了。但是不太知道要幹嘛。
只好交替看各題,看了reverse最後面這題給的檔案,把副檔名拿去google發現似乎是LLVM,而且跟wiki上面LLVM的中間語言,Intermediate Representation格式應該是吻合的。
執行lli task.ll
可以執行這個bitcode,但是他就只是個會問你答不出來的問題的小壞蛋
畢竟我不會看這種很像組語的東西,所以就找一下有沒有轉換的工具,還真的在github上看到有llvm2c這個工具可以轉換成C語言,我還不star爆 XDD
換成C語言之後發現超多goto,不過其實都只是if跟for迴圈產生的goto而已,沒有特別混淆的感覺。
倒是變數用的超級多,大概是因為組語會把強制轉型跟那些暫時變數寫出來吧(例如算(i+1)%n
就會int var3 = i+1; var3 % n
或是複製一遍同樣的數字只是因為要轉unsigned)
總之他做的是只是input -> validate -> win/fail
,他的win會要用到input的字串然後做一些加密還是hash的動作,而validate
只是檢查input的兩兩相鄰字元是否跟某個常數陣列相符,所以我枚舉第一個字元就能得知整個字串,接著call win
看輸出就可以找到flag了。老實說我一開始還以為做錯了,因為要從幾十個亂碼裡面找出合理的輸出比想像中難,何況他的flag還是用Leetspeak寫出來的XD怎麼找到的我都不知道。
下面是我最後化簡的code,全域的陣列大部份刪掉以便閱讀,可以看到main裡面還留了一些goto,基本上就只是在做for迴圈而已
|
|
Calc.exe online
不久之後casper把verilog(flag checker)給做出來了
我也弄出來說sin[0]
會跑出s這個字串(不記得是google還是試出來的了)
然後Google發現大概是webshell這個主題,接著又找到可以用('system')()
之類的方法執行函數,我就照著找到的東西試試看('phpinfo')()
,
然後真的跑出東西了XD
但是我很多字元弄不出來,後來查到可以用chr
這個函數,就能成功湊出所有的字元啦!
不過我不知道flag在哪裡,所以執行了('system')('find / -name "flag*')
找到flag在哪裡,最後執行了('system')('cat /flag*')
得到flag的內容
下面是我最後拿來湊出字元的腳本
|
|
P versus ♯P
接下來我基本上通宵都在弄這題。我覺得這題很有趣,題目是server會丟給你一個有障礙物的棋盤方格,簡單版本是問是否可以用1x2的骨牌蓋滿而困難版本是問有幾種方法。
這個之前蕭梓宏好像講過,所以我知道他是可作的,就是平面圖的完美匹配個數。google之後找到CSDN有現成的code,先感謝owo
不過可惜他是對998244353 mod,而且加邊的方式也有些不同,所以我稍微改了一下code,改成日月卦長的大數,不過速度真的很慢,超級慢QQ
我猜是因為途中數字會變超大所以速度就燒雞。我找各種python的套件要高精度快速做矩陣行列式的都找不到可以用的QQ所以我最後決定用中國剩餘定理,選夠多的質數算XD
這樣行列式還是算的頗慢,大概在12~13筆就會卡住了,於是就卡關跑去解Gamer’s Cipher和別題。
晚上的時候想到這張圖是平面圖,因此矩陣是稀疏的,跑去github上面找了稀疏矩陣行列式,還真的有XD 真香 而且作法還是跟之前看過得中國IOI國家隊論文寫的一樣XDD
所以就套上去,但是但是!這樣還是不夠快,時間已經到了隔天凌晨七點,我嘗試最後一次後就把檔案丟給隊友倒下去了。
起床是十二點多,最後我是又找到另外一個github上面的 code 可以加速同餘下的乘法才終於成功把時間壓到範圍內,做出來真的成就感滿滿。
我最後的code有點長,之後再考慮另外放好了
Ransomware
The vault是web assembly,被casper解決掉。同時joy也催促(?)我解這題,雖然他已經剩下50分了QQ
總之他給了.pyc檔跟一個flag.enc
的檔案,把byte code用工具(decompyle之類的,不知道版本重不重要,不過以magic numbe來看這個.pyc似乎是3.8)轉回來.py之後就可以輕鬆知道他是把flag.png
以官方網頁上面的文字當作金鑰用AES加密成flag.enc
,
用同一個套件解密後得到flag.png
寫著the flag is after this image,我一頭霧水丟給joy他就直接找出真正的flagㄌ,似乎是兩張png黏在一起的梗。
|
|
orz Network
被casper丟了這題,他說這是質數什麼的題目應該交給我
看起來像是隨便找一棵生成樹然後把每條邊都解密就可以了,他使用的加密方法是Diffie-Hellman,去維基百科可以翻到公鑰與私鑰各自的定義。
總之,要求私鑰我們就必須求離散對數,但是他的數字範圍給到10^18而且有419個數字要解,很明顯不能直接大步小步做完,
經過一番google,我發現了Pohlig-Hellman algorithm,是可以在大約sqrt(p)的量級解離散對數,其中p是mod的phi值(=mod-1)的最大質因數。因為完全沒有找到C++的code所以我自己按照維基上面的敘述刻,花了一段時間之後可以在合理的時間內解出某條邊了。
接下來就找生成樹然後對那些邊解密就對了。這題比前面幾題的演算法題簡單多了,雖然還是套了一大堆模板XDD
直接去抄waynedisonitau123的Pollard-Rho還有Millar-Rabin好爽喔XDDD
然後大步小步跟中國剩餘也都不用自己寫,對打高中競程的人來說真的是夢幻待遇(X
solve.cpp
|
|
solve.py
|
|
|
|
After that
接下來我又花了一個半夜去嘗試Web題
time to draw看起來就是要對那個api做怪事情,但我整個方向錯誤了,我誤以為是要XSS所以瘋狂送color={"match": "function() { ... }"}
的請求,但其實根本沒辦法執行這字串裡面的東西QQ
我也有看表情符號那一題,但是實在對PHP太陌生了,我現在連官方解答都不知道為什麼會對,他不是會檢查長度嗎???
總之,我覺得我們web跟pwn太弱了(或者說這次出的都是演算法題XD)
不知道這種injection應該如何練習是好(X
最後名次是12名,跟去年比起來進步不只一半
而且意外的是我們是台灣前三名所以可以拿獎金耶,超爽der
明年不意外應該也是會來玩ㄅ,不過如果問我途中會不會認真學大概就是不會吧owo
打CTF真的很讓人享受解謎(?)的過程,不過也可能只是因為解的出來才享受吧。另外打CTF還有一個優點就是不會被ZCK電爛很開心(X