2022 AIS3 Pre-exam Write Up
今年是我第二年參加 AIS3 的 Pre-Exam,有了去年的經驗今年打起來相對順手不少,但還是希望能夠繼續進步~去年很多解不出來或解很久的類別今年也打得相對比較好,希望之後能夠拿到更好的名次!(今年因為高三要考試ㄌ QQ 沒有花太多時間打,明年要繼續精進!)
Welcome
Welcome [100]
Discord ++
嗯對,真的就 Welcome,比賽時間還沒開始就在 AIS3 Discord#general
上的釘選了:P
P.S.之前被騙太多次一開始以為這是假 flag:P
FLAG:AIS3{WTF did I just see the FLAG before CTF starts?}
Crypto
SC [100] [baby]
SC? SuperChat?
Author: maple3142
file: https://drive.google.com/file/d/1EGbG7XymDej546FAN_gJbUoNkSjnYbd3/view?usp=sharing
1 | import string |
題目給了一個cipher.py
、加密過的cipher.py.enc
與加密過的flag.txt.enc
,經過觀察兩個 python 檔的內容後,可以發現本題是 Substitution cipher(人家都直接寫給你看ㄌ w),因此可以手動將cipher.py
與cipher.py.enc
對應一一對應字母後推出flag.txt.enc
的 flag 內容。
當然我們也可以寫 code 來解決它><開一個 python 的 dictionary 來進行一一對應:
1 | waku = open("cipher.py",'r').read() |
FLAG:AIS3{s0lving_sub5t1tuti0n_ciph3r_wi7h_kn0wn_p14int3xt_4ttack}
Fast Cipher [100] [baby]
Author: maple3142
file: https://drive.google.com/file/d/1bkwIfXNl9e3AaoltnvFGb0VEvOTMtd2D/view?usp=sharing
這題內容是一個加密用cipher.py
與其output.txt
,來看看 source code:
1 | from secrets import randbelow |
可以發現他不斷將key
迭代到f(x)
裡面後再與原始 flag 進行 xor,得到加密後的 output。
此時觀察 encrypt function,它在取key
時用了&0xff
,表示只取key
的最後兩位進行 xor 運算,透過 flag formatAIS3{…}
可以推出第一個key
為0x6c^65=0x2d
,接著觀察 f(x)
,它代入一個多項式後再%
$2^{1024}$=0x100…00
,迭代效率很低,但因為只取最後兩位,且%
之尾數為0
表示不影響最後兩位結果,所以可以直接代入多項式後取最後兩位 xor。
寫 code 即可解出 flag:
1 | key=[0x2d] |
FLAG:AIS3{not_every_bits_are_used_lol}
Misc
Excel [100] [baby]
Don’t worry, this is not a real virus…
Author: lys0829
file: https://drive.google.com/file/d/12dOYZhOIgCRudHczsikOUBUPZFyP8nrJ/view?usp=sharing
這題單純給了一個.xlsm 檔,使用 Microsoft Office 文件檢查功能之後可以發現有隱藏工作表,因此全部展開,發現isFki
裡面有一串公式,將 excel 轉換字體顏色後發現執行為TRUE
,將外圍 FORMULA 去掉後關掉顯示公式查看公式內容即可得到 flag。
FLAG:AIS3{XLM_iS_to0_o1d_but_co0o0o00olll!!}
Gift in the dream [100] [medium]
Someone send you his dream. Maybe he is trying to tell you a message.
update 1: flag 在l33t前是通順的句子。
update 2: Fixed typo in flag, please download the updated version
Author: bronson113
file: https://drive.google.com/file/d/1OOF36yj53MSXs2-Z-5x1dJivlz25UoLY/view?usp=sharing
這題是一個 gif 檔,一開始用了不少工具分析,其中使用 strings 指令的結果發現裡面提示到why is the animation lagging? why is the duration so weird? is this just a dream?
的部分,因此開始往這個方向走,上網查到了gif duration tool,切開後發現其毫秒時間間隔不一且形同ASCII code
(去掉尾 0),將其解密後即可得到正確的 flag。
P.S.一開始用了一個爛掉的工具得到錯誤的 flag…
FLAG:AIS3{5T3gn0gR4pHy_c4N_b3_fUn_s0m37iMe}
Reverse
Time Management [100] [baby]
Solution 1
Free flag for you : )
Author: artis24106
file: https://drive.google.com/file/d/11_Q8SqsPWEm67iAc2Xbpjvi4tK-Q0Fcn/view?usp=sharing
這題給了一個 binary,用 IDA Pro 開啟分析main function
可以發現它將指定位置4*(i+1)
(此位置為 flag 每四位 hex number 的後一位數字)的key
與secret
每位 xor 後用 for 迴圈輸出,所以這部分可以手動處理 xor 後即可得到 flag。
我們也可以寫 code 來解決他,首先在 IDA Pro 裡shift+E
提出key
跟secret
陣列,接著一一 xor 即可(但要記得把陣列位置算好.w.)。
1 |
|
FLAG:AIS3{You_are_the_master_of_time_manangement!!!!!}
Solution 2
這題也可以用 patch program 的方法解決,它印不出 flag 的主要原因是main function
中的sleep(0x8763)
間隔過久,所以我們只要把sleep
的時間 patch 成0
即可,這裡注意一下最後的輸出部分,\r
會把游標移到最前方並將所有先前輸出洗掉,因此這裡也要 patch,完成後覆寫掉原檔案執行即可得到 flag。
Calculator [301] [easy][.NET]
I built a simple calculator, although it has a lot of bugs :P
Author: LJP-TW
file: https://drive.google.com/file/d/1lKgN9AtkAT55lgY8qeJJP9L9awhOKAD4/view?usp=sharing
這題應該可以算是去年的考古題,也是 .NET 的題目,我一樣使用 dnSpy 來分析它,calculator.exe
的部分沒有發現甚麼除了計算機之外的其他功能,在extentions
的部分發現了四個可疑的.dll
檔(AIS3.dll
、AIS33.dll
、AIS333.dll
、AIS3333.dll
),打開看發現裡面應該是輸出 flag 的條件,只有一些 xor 跟特殊位置的個別限制,也是使用手動的方法把 flag 打出來即可。
1 | INDEX 0123456789012345678901234567890123456789012345 |
FLAG:AIS3{D0T_N3T_FRAm3W0rk_15_S0_C0mPlicaT3d__G_G}
殼 [463] [easy]
Author: artis24106
file: https://drive.google.com/file/d/1C_Q7RbdQufeyZyOMNG2eQ9w4vd4o--1l/view?usp=sharing
這題給了一個不知名的.wy
檔,上網查了一下是文言文編程語言,利用github 上的工具wenyan --compile 殼.wy
可將其轉換為較易讀(?)的 javascript。剩下的部分就是讀懂 code 內容了 😵。
1 | /*___wenyan_module_恆常_start___*/ |
觀察 compile 後的 code 內容,稍微解析各個 function 的內容:恆常
為定義 const variable,可以看到秘旗
就是加密過後的 flag,其餘先保留。鑿字秘術
與交互秘術
都是一些內建函式的改寫,可以直接略過。
剩下是自定義函式,一樣可以略過。
這時候從尾部找尋秘旗,往前對照發現其是對應禱(祈)
這個函式,這時候對這個單一函數進行解析整理:
1 | var 禱=_=>{};禱=食=>{ |
在編輯器Ctrl+F
搜尋發現食
沒有被定義僅被呼叫,推測食
就是 flag,而日
、鑫
、谷
則為三個一組的 flag 呼叫。
先來分析營
和削
函式:營
相對簡單,營(a)(b)=(a//b)
削
的部分,
1 | var 削=_=>{}; |
可得削(a)(b)=(a>0&&b>0)?(a&b):0
再來看型
1 | var 型=_=>{}; |
上面可知和
及宇
為禱
內部呼叫之參數,皆為數字,啟
、魠
為外部傳入,不影響禱
所求日
、鑫
、谷
內容
而桐=子字(師)(463)(527)
(從前面的交互秘術
可知是 substring 的意思),可得桐='明故五月渡瀘深入不毛今南方巳定兵甲已足當獎率三軍北碇中原庶竭駑鈍攘除奸兇興複漢室還于舊都此臣所以報先帝而忠陛下之職分也至於斟酌損'
故秘旗
重複單位\x1b[38:5:181m獎
即為單一型
所生,(165+和)
為數字,獲取(桐)(宇)
為字串中字元
所以啟=\x1b[38:5:
,魠=m
,無須逆向。
寫 code 爆搜出日
、鑫
、谷
對應秘旗
內容即可。
1 | ff=["181m獎","202m當","177m之","210m兇","191m深","170m定","189m忠","197m忠","192m複","226m除","177m率","226m月","191m月","170m都","177m三","178m還","177m三","209m先","188m而","197m忠","192m兇","198m故","192m複","226m巳","177m三","222m定","189m率","225m陛","194m軍","166m除","178m軍","186m忠","181m率","226m所","177m瀘","226m獎","181m獎","218m除","179m當","166m鈍","178m三","170m斟"] |
FLAG:AIS3{chaNcH4n_a1_Ch1k1ch1k1_84n8An_M1nNa_5upa5utA_n0_TAMa90_5a}
Web
Simple File Uploader [100] [easy]
一個簡單檔案上傳者。
Author: wii
route: http://chals1.ais3.org:8988(vpn required)
這題是一個上傳檔案的網站,打開 source code 可以發現它鎖了很多 php 的格式,明顯是要讓我們上傳可上傳可執行的 php 檔,其中因為它使用黑名單的方式,稍微查一下可以發現副檔名大小寫差異便可繞過,建立aa.Php
即可上傳 php(用echo 1;
測試可否執行)
1 | echo 1; |
接著需要繞過 system function,source code 中可以發現他把幾乎所有的 system 執行指令都鎖起來了,但 php 有一個特殊的方式可以繞過執行,以``包起的字串會被當成指令嘗試執行,因此可以構造出指令嘗試執行。
1 |
|
可以看到一個rUn_M3_t0_9et_fL4g
檔案,執行它即可得到 flag。
1 |
|
FLAG:AIS3{H3yyyyyyyy_U_g0t_mi٩(ˊᗜˋ*)و}
Poking Bear [100] [baby]
Poke the SECRET BEAR!
Author: wii
route: http://chals1.ais3.org:8987(vpn required)
打開網頁可以發現一個可以戳熊熊(?)的介面,點進去可以發現除了SECRET BEAR
之外其他的熊都有一個特殊的號碼掛在http://chals1.ais3.org:8987/bear/{id}
之中,所以我們的目標十分明確:找到 SECRET BEAR 的 id!
其他 bear 的 id 都在首頁的 html 裡,所以只要寫段 python 來爆搜沒有在裡面的 id 即可。
1 | import requests |
可以發現 499 沒有在裡面,訪問 http://chals1.ais3.org:8987/bear/499 可以有一個戳SECRET BEAR
的頁面,但戳下去它會說你不是bear poker
,這時候直覺看看 cookie 有一個human
類別,把後面的值改成bear poker
再戳它就可以拿到 flag。
FLAG:AIS3{y0u_P0l<3_7h3_Bear_H@rdLy><}
Pwn
SAAS - Crash [40] [C++][heap][easy]
This challenge is not about Software as a Service, but String as a Service.
You only need to crash the program at remote to get this flag, no need to actually write exploit for it
Author: maple3142
file: https://drive.google.com/file/d/18YJGrtqcZIr5cNufSWAQnWnegHM5ww87/view?usp=sharing
這題給了 source code package 跟 netcat 網址,先看看 source code:
1 |
|
可以發現它的輸入限制 4095 位,那輸入 4096 位是否能讓程式 crash 呢?
構造一個長於 4096 位的字串輸入Create String
,接著將它輸出,第一次輸出沒有噴 Error,再次輸出後便 Crash 了,得到 flag。
FLAG:AIS3{congrats_on_crashing_my_editor!_but_can_you_get_shell_from_it?}
很抱歉,窩迷有拿到 shell TAT
BOF2WIN [100] [baby]
Exploit the bof !!nc chals1.ais3.org 12347
Author: 🎃
file: https://drive.google.com/file/d/1MajFqDwi4SDtCCb-bthHUG9Y5voMv4tN/view?usp=sharing
這題是非常經典的 buffer overflow 題,先來看看 source code:
1 |
|
可以發現gets(buf)
的使用部分有漏洞,無法限制是使用者的輸入,所以我們只要蓋掉 buffer 並把 return address 改成get_the_flag
的 function address 即可。
先用checksec
確定一下開啟的保護機制:
1 | > checksec bof2win |
PIE 沒開,表示 function address 不會被 randomize,可以直接使用 function fixed address
用 gdb 觀察get_the_flag
的 function address
1 | > gdb bof2win |
可以得到 function address 0x401216
再用 gdb 觀察 buf 跟 ret 的 address
buf address:0x7fffffffdee0
ret address:0x7fffffffdef8
所以要蓋掉0x7fffffffdef8-0x7fffffffdee0=24
個字元
寫個 exploit 即可拿到 flag。
1 | from pwn import * |
FLAG:AIS3{Re@1_B0F_m4st3r!!}