REFERENCE GUIDE

Symbolic execution: constraints, paths, and concrete validation

Symbolic execution represents input as variables and builds constraints along program paths.

Also known as: angr · constraint solving

symbolic-executionreversing

Mechanism

Symbolic execution represents input as variables and builds constraints along program paths. It is useful when the relevant logic is bounded and difficult to invert manually. Path explosion, environmental modeling, unsupported instructions, and inaccurate input assumptions can make a mathematically satisfiable state irrelevant to the real program.

Practical method

Locate success and failure addresses using ordinary analysis first. Constrain input length and alphabet only when justified. Model the required file or standard-input interface, avoid known failure states, and inspect the resulting path. Replay the candidate against the original binary in the same environment.

symbolic input -> path predicates -> solver model -> concrete replay
                                      acceptance is verified here

Interpreting evidence

Check whether the solver consumed all input bytes and whether it reached the intended success branch. Keep unconstrained values visible rather than silently accepting arbitrary concretizations.

Pitfalls and limits

Overconstraining the alphabet can remove valid solutions. Hooking a function changes semantics unless the hook accurately models its relevant behavior. A solver result does not prove coverage of every possible path.

Sources & further reading

  1. Core concepts ↗angr

Content license: CC-BY-4.0. Source-derived sections retain their cited licenses and redistribution notices. How this reference is compiled →