🔖
DiceCTF 2021 - babymix
問題概要
Just the right mix of characters will lead you to the flag :)
典型的なRev-Warmupかなと思います。
解説
取り敢えず適当なツール(今回はghidra)で可視化しましょう。以下のようなプログラムであることが分かります。
- 実行するとflagの入力を要求し、入力が一致しているか判別してくれる
- ただし、その判別が複雑で、複数の関数に少しずつ書かれている式を連立して解く必要がある。
関数の数がまぁまぁ多く、手で式をまとめるには面倒です。このようなプログラムに対してはangrによる解析が有効そうなので脳死angrゲーを始めます。
solve.py
import angr
import claripy
from logging import getLogger, WARN
getLogger("angr").setLevel(WARN + 1)
p = angr.Project("./babymix")
state = p.factory.entry_state()
simgr = p.factory.simulation_manager(state)
simgr.explore(find=lambda s: b"Correct!" in s.posix.dumps(1),
avoid=lambda s: b"\nIncorrect :(" in s.posix.dumps(1))
try:
found = simgr.found[0]
print("flag:", found.posix.dumps(0))
except IndexError:
print("flag not found")
これを動かして放置すると解けます。
$ docker pull angr/angr
$ docker run -v [path-to-babymix-and-solve.py]:/tmp/babymix --name test -it angr/angr /bin/sh
$ cd /tmp/babymix
$ python solve.py
Discussion