# be angry - Beginners CTF Online 2021 ## 解析 `main`の処理: ```c void metaInit() {} int main(int argc, char **argv, char **envp) { megaInit(); _global_argc = argc; _global_argv = argv; _global_envp = envp; long x = 0x0E; while (x > 0x32); switch (x) { // ... } return 0; } ``` よく分からんが本体部分はcontrol flow flatteningっぽい見た目になっている。 ## 解法 "Correct"って出力する部分があるのでテンプレに入れて実行。 ```python= import angr import claripy from logging import getLogger, WARN getLogger("angr").setLevel(WARN + 1) getLogger("claripy").setLevel(WARN + 1) flag = claripy.BVS("flag", 8 * 64) p = angr.Project("./chall", load_options={"auto_load_libs": False}) state = p.factory.entry_state(stdin=flag) simgr = p.factory.simulation_manager(state) for i, c in enumerate(flag.chop(8)): state.add_constraints( claripy.Or( claripy.And( 0x20 <= c, c <= 0x7f ), c == 0 ) ) simgr.explore(find=0x402532) try: found = simgr.found[0] print(found.solver.eval(flag, cast_to=bytes)) except IndexError: print("Not Found") ``` 終わり。 ## 意見・感想 - angrを使うと楽になる問としてとても良い内容だと思います - Beginner視点で考えると、Correctと出力するブロックがどこにあるか分からず諦める人も多そう(そんな人のことは知らんのでこのままでOK)