2021 AIS3 Pre Exam - COLORS
題目:COLORS
COLORS
209 points / 53 solves
Challenge Info
DeterminationPatienceBraveryIntegrityPerseveranceKindnessJusticeMore...
http://quiz.ais3.org:8888/Author: artis24106
Step1 - Analysis
題目連結點開是一個網頁,說是要輸入 secret code 才能得到 flag

有個被混淆過的 encode.js,可以用 beautifier.io 等工具 format 一下
| |
觀察到 _0x4ebd = _0x1cd51f = _0x9fe181 = _0x12b963 這個 function 被大量使用。_0x4ebd 是全域變數,可以直接在 console 呼叫,比如說 _0x12b963(0x1e5) = "key", _0x4ebd(0x1cf) = "keydown",所以把所有值取出來手動還原程式碼,順便重命名其他變數跟函數名稱。
還原完的程式碼
| |
Step2 - Input Secret Code
先看 event handler
| |
可以知道在正確的 state 按特定鍵會讓 state + 1,也就是要輸入 Konami Code(上上下下左右左右ba)作為 secret code。輸入之後出現一隻彩虹迷因鸚鵡,並且提示網頁上的是 encode 過的 flag。
從 65~66 行可以知道 encoded flag 是 base64EncodedFlag 在 base64 decode 之後,每三個字元切開並呼叫 makeHTML 的結果。

接下來可以任意輸入,會將輸入存在 inputEl["textContent"],並且呼叫 setOutputHTML(inputEl["textContent"]);,然後因為 setOutputHTML 裡面會呼叫 encode,所以接下來看 encode function。
Step3 - How To Encode?
直接把 encode 在做什麼寫在註解裡面
| |
簡單來說 encode 的方法是:
- 將輸入每個字元轉換成 8 bits 二進位字串接在一起
- 補上 “00000000”,直到二進位字串長度為 40 的倍數
- 每 10 bits 一組做成
'<span><div class="c' + para1 + ' r' + para2 + '">' + para3 + '</div></span>'接在一起para1= 第 2-4 bits,也就是 classc0~c7,控制字元顏色para2= 第 1 bit,也就是 classr0~r1,控制字元是否要水平翻轉para3=atob(base64FakeFlag)[idx],從AlS3{BasE64_i5+b0rNIng~\Qwo/-xH8WzCj7vFD2eyVktqOL1GhKYufmZdJpX9}中選第idx個字元idx= 第 5-10 bitsatob(base64FakeFlag)=AlS3{BasE64_i5+b0rNIng~\Qwo/-xH8WzCj7vFD2eyVktqOL1GhKYufmZdJpX9}
- 補上 padding
也就是說它是 base64 的變體
附上 encode "HA" 的圖解

輸出為(使用 Rubik Mono One 字體,所以看不出大小寫)

Step4 - Decode Encoded Flag
最後附上解碼腳本
| |
Flag
AIS3{base1024_15_c0l0RFuL_GAM3_CL3Ar_thIS_IS_y0Ur_FlaG!}