🔖

DiceCTF 2021 - babymix

2021/02/08に公開

問題概要

Just the right mix of characters will lead you to the flag :)

babymix

典型的なRev-Warmupかなと思います。

解説

取り敢えず適当なツール(今回はghidra)で可視化しましょう。以下のようなプログラムであることが分かります。

  1. 実行するとflagの入力を要求し、入力が一致しているか判別してくれる
  2. ただし、その判別が複雑で、複数の関数に少しずつ書かれている式を連立して解く必要がある。

関数の数がまぁまぁ多く、手で式をまとめるには面倒です。このようなプログラムに対しては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