---
# System prepended metadata

title: CTF writeup

---

# CTF writeup


- 姓名: 陳毅

[TOC]

## 忘記這是哪一類

### [祝賀] 新垣結衣新婚快樂 發錢

- [ ] 成功解題
> 其實也可以算是順利解開啦，但我那時候不相信 Flag 是中文就沒做嘗試了，白白丟失分數 QQ

把圖片解壓縮以後可以得到她老公的照片一張 `\|/`
![](https://i.imgur.com/hoJpC8H.png)
然後我嘗試查看並修改 hex (長寬， RGB 等等)都沒得到什麼線索我就放棄ㄌ

## Reverse

### COVID-19

- [ ] 成功解題

task 是一個 elf 檔案，執行會顯示:
```c=
@@                                       @@
                                      @   @@          @@@@@@@@@@@@           @@   @
                                      @     @@@@............,,,,,,,,,,,,,@@@@     @
                                      @@    @...............,,,,,,,,,,,,,,,,@    @@
                                       @@   @..AIS3{                   },,,,@   @@
                                        @@   @..............,,,,,,,,,,,,,,,@   @@
                                          @@  @.............,,,,,,,,,,,,,,@  @@
                                            @@ @............,,,,,,,,,,,,,@ @@
                                              @@@@..........,,,,,,,,,,,@@@@
                                                 @@.........,,,,,,,,,@@
                                                       @@@@@@@@@@
```
用 IDA 做分析的話好像是要猜他ㄉ Flag 吧，但是我猜不到 RRRR
然後我就沒頭緒ㄌ

## Crypto



### ReSident evil villAge

- [x] 成功解題

標準的 [Padding Oracle attack](https://zh.wikipedia.org/wiki/%E5%AF%86%E6%96%87%E5%A1%AB%E5%A1%9E%E6%94%BB%E5%87%BB) 。

## Web

### HaaS

- [x] 成功解題

- 題目網址 `http://quiz.ais3.org:7122/haas` 不能訪問，後來發現 `http://quiz.ais3.org:7122` 有一個 Form 。
- 試過 n 百種排列組合以後，我發現輸入 `127.0.0.1` 時，網站會提示我不要攻擊 Server 。
- 既然 `127.0.0.1` 不行，就試試 `localhost` 吧!
- 後來發現使用 `localhost` 沒反應，我猜測後端有對 `server` 進行保護，所以改用 `localhOst` 就中了= =

![](https://i.imgur.com/Xu2sc0y.png)

```{"msg":"Failed","detail":{"text":"AIS3{V3rY_v3rY_V3ry_345Y_55rF}","expected":"4454","actual":200}}```

### Copy and paste

- [x] 成功解題

一開始我嘗試查看 source code 發現了一段程式碼:
```
const f14g = fetch("f14g.php").then((response) => response.text());
        const FLAG = await f14g;
```
打開瀏覽器訪問 `http://quiz.ais3.org:13377/f14g.php` 會拿到一段奇怪的文字:
```
0hp3{r633Y63Y33636YY636Y3YEVVhVEVkVVs_E9Q4Q99QQ9QQ94JQ4499QQ9Q49Q4Q9Q499Q49Q99Q49Q4444QQQ44Qjy_vVXg}
```
第一時間我是想到或許是對 ASCII 碼做 SHIFT ，結果當然不是 XD
後來跑去解其他題 (也沒解開: ) )才突然想到，我可以把網頁內容縮放阿!
然後就拿到 Flag ㄌ:
```
AIS3{Re33Ee3E33e3eEEe3eE3El11I1l1i11y_lo0O0oo00o00oOC0OOoo00o0Oo0O0o0Ooo0Oo0oo0Oo0OOOO000OO0ng_f1aG}
```
> 眼睛好痛 = =

### ⲩⲉⲧ ⲁⲛⲟⲧⲏⲉꞅ 𝓵ⲟ𝓰ⲓⲛ ⲣⲁ𝓰ⲉ

- [ ] 成功解題

浪費一堆時間，但沒啥頭緒 = =

Source code:
```python=
from flask import Flask, request, make_response, redirect, session, render_template, send_file
import os
import json

app = Flask(__name__)
app.secret_key = os.urandom(32)

FLAG = os.environ.get('FLAG', 'AIS3{TEST_FLAG}')
users_db = {
    'guest': 'guest',
    'admin': os.environ.get('PASSWORD', 'S3CR3T_P455W0RD')
}


@app.route("/")
def index():
    def valid_user(user):
        return users_db.get(user['username']) == user['password']

    if 'user_data' not in session:
        return render_template("login.html", message="Login Please :D")

    user = json.loads(session['user_data'])
    if valid_user(user):
        if user['showflag'] == True and user['username'] != 'guest':
            return FLAG
        else:
            return render_template("welcome.html", username=user['username'])

    return render_template("login.html", message="Verify Failed :(")


@app.route("/login", methods=['POST'])
def login():
    data = '{"showflag": false, "username": "%s", "password": "%s"}' % (
        request.form["username"], request.form['password']
    )
    session['user_data'] = data
    return redirect("/")


@app.route("/logout")
def logout():
    session.clear()
    return redirect("/")


@app.route("/sauce")
def sauce():
    return send_file(__file__, mimetype="text/plain")


if __name__ == '__main__':
    app.run(threaded=True, debug=True)
```
## PWN 

### Writeme

- [ ] 成功解題

這題提供的 .elf 是利用 Dynamic linking 的方式做連結時，其函式位址會在執行週期才確定。
```c=
#include <stdlib.h>
#include <stdio.h>
int main()
{
    setvbuf(stdin, 0, 2, 0);
    setvbuf(stdout, 0, 2, 0);
    void *systemgot = 0x404028;
    void *scanfgot = 0x404040;
    //void *systemgot = (void *)((long long)(*(int *)(systemptr+2))+(long long)(systemptr+6));
    *(long long *)systemgot = (long long)0x0;

    printf("Address: ");
    void *addr;
    long long v;
    scanf("%ld",&addr);
    printf("Value: ");
    scanf("%ld",&v);
    *(long long *)addr = (long long)v;
    *(long long *)scanfgot = (long long)0x0;
    printf("OK! Shell for you :)\n");
    system("/bin/sh");
    return 0;
}
```
主要就是指向 `systemgot` 的 address 被抹掉了，所以要想辦法接回來，我在這邊有嘗試輸入:
```
Address: 404028 -> 4210728
Value: 404088 -> 4210824
```
至於 `404088` 是利用 IDA 看 .got.plt 時發現的，不過好像是錯ㄉ，執行程式以後會成功印出 `OK! Shell for you :)` 但沒有任何反應。
接著，我又不死心的用 GDB 做動態分析才知道原來他要的可能是 `system` 的實際地址 (因為產生 SIGNAL 了)，我真的是 PWN 菜雞，解不開 QwQ
這一題是除了 HaaS 以外花我最多時間的題目ㄌ，中間還看到大大們的閒聊，笑死
![](https://i.imgur.com/dfO0g0U.png)
最後，雖然沒解出來，但還是學到蠻多新知的 (包括 lazy-binding 跟怎麼寫 PWN exploit 腳本之類ㄉ)，賺。

## Welcome

### Cat Slayer ᶠᵃᵏᵉ | Nekogoroshi

- [x] 成功解題

這一題就是一道密碼鎖，直接暴力解開，耶 \歡呼/