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
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.