flag checker
FLAGをコマンドライン引数に渡すとそれが正しいかどうか判定してくれる
angr にお任せ
BVVは固定値で、BVSはangrが変更することがある値(というか求めたい値)。
ただ長さがよくわからない
適当に\x00で埋めさせたらなんか動かなかったので、長さを10から70ぐらいで総当りさせた
code:exploit.py
import claripy
import angr
import binascii
for length in range(10, 70):
p = angr.Project("./main")
flag = claripy.BVS("flag", length*8)
for i, x in enumerate(flag.chop(8)):
if i == length - 1:
state.add_constraints(x == b'}')
continue
if i < 9:
state.add_constraints(x == b'KOSENCTF{'i) else:
flag_format = claripy.Or( # FLAGの形式
claripy.And(x >= b'A', x <= b'Z'),
claripy.And(x >= b'a', x <= b'z'),
claripy.And(x >= b'0', x <= b'9'),
x == b'_',
x == b'+',
x == b'-',
x == b'&',
x == b'!',
x == b'?'
)
state.add_constraints(flag_format)
simgr = p.factory.simulation_manager(state)
simgr.explore(find=0x401397, avoid=0x4013a5) # simgr.explore(find=lambda s: b"This is a flag.\n" in s.posix.dumps(1))
try:
print(simstate.posix.dumps(1))
print(simstate.solver.eval(flag, cast_to=bytes))
except Exception as e:
print(e)
continue
KOSENCTF{TOO_EASY_TO_DECODE_THIS}
CTF以前にPythonが難しい