金盾獎 20th - record
Author: 堇姬 Naup
這次跟 @freddy645645、@tyc4d 一起拿了第二名
這次題目蠻不錯的XD
簡單記錄一下過程
順便講個趣聞,我們原本叫 想交大的男友了,後來被要求改名變成了 cscxofoobmab
賽前報到
badge,好像還是個悠遊卡
牌子
開賽
首先是有分 CTF 題目跟情境題目,情境題目跟光纖、工控、拆彈有關,不過我對這塊不熟,所以主要打的是 CTF 分類的
首先開賽先看了 score-sys.exe 簡單看一下後可以發現它是一個 pyinstaller,可以用
https://github.com/extremecoders-re/pyinstxtractor/blob/master/pyinstxtractor.py
直接解出 pyc,之後通過 decompile 可以將 source code 還原,他給的其實是一個 GUI,可以去戳遠端 server api,要戳到這個 API 需要 x-activate-code header,快速逆一下就可以找到 code 是 feaa7aa2-2e34-4acf-86a7-f0c0ea012cfe
另外最快速可以發現的問題是GET /api/v1/users?user_type=teachers&fields=student_id,name,password
這個 API 原本只有設定 student_id 跟 name,但可以額外指定 password,user_type 也可以指定成 teacher 將教師帳號跟學生帳號都打出來,不過到這邊其實我就卡住了,因為不知道要做甚麼,所以先放一放
不過在打這題的同時,我的 agent 把 timespy 這題戳出來了
看起來就是很基本的逆向邏輯而已
BestSSH 是 freddy 解的,是一個 ssh 服務,要打一個 .so
我就跑去看 Abyss Phantom Team,他有一支 binary c8763.exe 跟一看起來被 encrypt 過的檔案 ghost,快速逆後將 data 撈出來就可以生出可以解密 ghost 的腳本,將 ghost.exe 還原回來
1 | #!/usr/bin/env python3 |
執行後是一個 password checker,MCP 快速的就可以把所有條件拉下來寫腳本了,就可以找到 password
1 | #!/usr/bin/env python3 |
跑完後你會發現他除了告訴你 success 沒有跑出 flag,稍微看一下邏輯可以知道他會寫檔案到你電腦神秘位置的 flag.txt
所以我用 everything 直接搜就可以找到了
1 | v54[0] = v51; |
在解 APT 的時候兩個隊友去打情境題的工控了,對這塊不熟交給隊友
解完這題我就去看 PlayShaMiGame
首先有一個 IDOR 可以在 web 上撈到這個遊戲的 binary,他是一個 menu,快速逆向後可以定位到在第三個選項的 special kill 中
這題 no pie 但有開 canary
1 | char input_buffer[264]; // [rsp+20h] [rbp-110h] BYREF |
並且可以在這個位置上找到 win function,這東西應該是在 try-catch 中的 win function 可以開 shell,到這邊應該很明顯了
1 | .text:00000000004021A4 lea rsi, aEnteringDebugM ; "[*] Entering debug mode " |
首先是可以通過觸發 exception 來去 bypass canary 來通過跳位於 catch 中的 win function 來 get shell
要觸發 exception 可以通過輸入 133713371337 這個數字
前面可以 padding 一些 0,變成 0000133713371337,後面的東西會被 atoll 截斷
接下來是中間跟 saved rbp 我都 padding 了一個可寫的 address,不然會戳到奇怪的 address 就 crash
最後跳到 win function 特定的地方就可以拿到 shell 了
540 分 get
1 | from pwn import * |
接下來過了一段時間 @tyc4d 成功首殺了光纖攔截的題目,太強了 orz
我在看 llm-this,這題是一個加過 upx 殼 ELF 的逆向題目,不過沒有辦法直接用 upx -d 脫掉,這時候就開脫殼
基本上可以通過將 write syscall 下 catch,可以看到有兩塊有可執行的區段,這兩段 code memory dump 下來就是邏輯了,不過其實第一塊的才是重點,但你不在 /tmp/2404917857 寫東西他不會出現,這是我踩的第一個坑,沒去看 strace 出來的東西
1 | 0x7ffff7ff1000 0x7ffff7ff2000 r-xp 1000 0 /memfd:upX (deleted) |
如果去解第二段記憶體的驗證邏輯可以得到一個假的 flag
第一段驗證邏輯 dump 下來拖到 IDA 就是很簡單的 xor 逆推了,將結果放到 /tmp/2404917857 下後,執行就可以看到 flag 被寫到 /tmp/3404927857 了
1 | naup@naup-virtual-machine:~/Desktop/csc$ cat /tmp/3404927857 |
另外還有一些題目 @freddy 也收掉了,那時候在最後半小時開了 goldocs 的教學文件,結果超複雜,應該早點開的
最後壓線在解拆彈,簡單來說就是逆向要剪的線,按照順序用剪刀將線依序不同的 GPIO 上的剪掉,如果剪錯爆炸要拿去給主辦方刷新,每組有 3 次機會,那時候 @tyc4d 說他逆向完要剪的線,結果錯了
後來我也丟下去逆了一下發現跑出來一樣,那感覺問題就是剪錯線了
1 | #!/usr/bin/env python3 |
後來極限 3 分鐘剪完線,1 分鐘送 flag,在最後兩分鐘成功把這題解出來
這邊說一下,一開始解的那堤貌似就差要看到他有一個 debug server 是 django 然後就可以解出來了
因為最後 30 分鐘會凍記分板,所以不知道結果,不過我們已經超越凍板前第一了,所以就看其他隊伍如何了
頒獎
總之最後拿下了第二
漂亮獎盃
吃飯 & 吃飯
接下來就是主辦方有提供一些活動跟晚宴可以吃,就到處聊天跟吃飯
晚上跟 @chumy @vincent66 @ching @curious @shallowfeather 去吃了一間蠻不錯的冰,吃的很爽XD
afterall
好玩 ~