2021 AIS3 Pre Exam - COLORS
題目:COLORS
COLORS
209 points / 53 solves
Challenge Info
Determination
Patience
Bravery
Integrity
Perseverance
Kindness
Justice
More...
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!}