def test_branching_replacement_solver(): # # Simple case: replaceable thing first # x = claripy.BVS('x', 32) s0 = claripy.SolverReplacement(claripy.Solver()) s0.add(x == 0) s1a = s0.branch() s1b = s0.branch() s1a.add(x == 0) s1b.add(x != 0) assert s1a.satisfiable() assert not s1b.satisfiable() # # Slightly more complex: different == # x = claripy.BVS('x', 32) s0 = claripy.SolverReplacement(claripy.Solver()) s0.add(x == 0) s1a = s0.branch() s1b = s0.branch() s1a.add(x == 0) s1b.add(x == 1) assert s1a.satisfiable() assert not s1b.satisfiable()
def test_replacement_solver(): sr = claripy.SolverReplacement() x = claripy.BVS('x', 32) nose.tools.assert_equal(len(sr.eval(x, 10)), 10) sr.add_replacement(x, claripy.BVV(0x101, 32)) nose.tools.assert_equal(sr.eval(x, 10), (0x101, )) y = claripy.BVS('y', 32) sr.add([y + 1 == 200]) assert (y + 1).cache_key in sr._replacements assert sr._replacement(y + 1) is claripy.BVV(200, 32) srb = sr.branch() assert len(srb.constraints) == len(sr.constraints) #pylint:disable=no-member assert (y + 1).cache_key in sr._replacements assert sr._replacement(y + 1) is claripy.BVV(200, 32) sr = claripy.SolverReplacement() b = claripy.BoolS('b') assert sr._replacement(b) is b sr.add(claripy.Not(b)) assert sr._replacement(b) is claripy.false sr = claripy.SolverReplacement(claripy.SolverVSA(), complex_auto_replace=True) x = claripy.BVS('x', 64) sr.add([x + 8 <= 0xffffffffffffffff]) sr.add([x + 8 >= 0]) assert sr._replacement(x) is not x
def _solver(self): """ Creates or gets a Claripy solver, based on the state options. """ if self._stored_solver is not None: return self._stored_solver track = o.CONSTRAINT_TRACKING_IN_SOLVER in self.state.options if o.ABSTRACT_SOLVER in self.state.options: self._stored_solver = claripy.SolverVSA() elif o.REPLACEMENT_SOLVER in self.state.options: self._stored_solver = claripy.SolverReplacement(auto_replace=False) elif o.CACHELESS_SOLVER in self.state.options: self._stored_solver = claripy.SolverCacheless(track=track) elif o.COMPOSITE_SOLVER in self.state.options: self._stored_solver = claripy.SolverComposite(track=track) elif o.SYMBOLIC in self.state.options and o.approximation & self.state.options: self._stored_solver = claripy.SolverHybrid(track=track) elif o.SYMBOLIC in self.state.options: self._stored_solver = claripy.Solver(track=track) else: self._stored_solver = claripy.SolverConcrete() return self._stored_solver
def test_contradiction(): sr = claripy.SolverReplacement(claripy.Solver(), replace_constraints=True) x = claripy.BVS('x', 32) sr.add(x == 10) assert sr.satisfiable() assert sr.eval(x, 10) == (10, ) sr.add(x == 100) assert not sr.satisfiable()
def test_replacement_solver(): sr = claripy.SolverReplacement(claripy.SolverVSA(), replace_constraints=True, complex_auto_replace=True) x = claripy.BVS('x', 32) sr.add(x + 8 == 10) assert sr.max(x) == sr.min(x) sr2 = sr.branch() sr2.add(x + 8 < 2000) assert sr2.max(x) == sr2.min(x) == sr.max(x)
def _solver(self): """ Creates or gets a Claripy solver, based on the state options. """ if self._stored_solver is not None: return self._stored_solver track = o.CONSTRAINT_TRACKING_IN_SOLVER in self.state.options approximate_first = o.APPROXIMATE_FIRST in self.state.options if o.STRINGS_ANALYSIS in self.state.options: if 'smtlib_cvc4' in backend_manager.backends._backends_by_name: our_backend = backend_manager.backends.smtlib_cvc4 elif 'smtlib_z3' in backend_manager.backends._backends_by_name: our_backend = backend_manager.backends.smtlib_z3 elif 'smtlib_abc' in backend_manager.backends._backends_by_name: our_backend = backend_manager.backends.smtlib_abc else: l.error( "Cannot find a suitable string solver. Please ensure you have installed a string solver that " "angr supports, and have imported the corresponding solver backend in claripy. You can try " "adding \"from claripy.backends.backend_smtlib_solvers import *\" at the beginning of your " "script.") raise ValueError("Cannot find a suitable string solver") if o.COMPOSITE_SOLVER in self.state.options: self._stored_solver = claripy.SolverComposite( template_solver_string=claripy.SolverCompositeChild( backend=our_backend, track=track)) elif o.ABSTRACT_SOLVER in self.state.options: self._stored_solver = claripy.SolverVSA() elif o.SYMBOLIC in self.state.options and o.REPLACEMENT_SOLVER in self.state.options: self._stored_solver = claripy.SolverReplacement(auto_replace=False) elif o.SYMBOLIC in self.state.options and o.CACHELESS_SOLVER in self.state.options: self._stored_solver = claripy.SolverCacheless(track=track) elif o.SYMBOLIC in self.state.options and o.COMPOSITE_SOLVER in self.state.options: self._stored_solver = claripy.SolverComposite(track=track) elif o.SYMBOLIC in self.state.options and any( opt in self.state.options for opt in o.approximation): self._stored_solver = claripy.SolverHybrid( track=track, approximate_first=approximate_first) elif o.HYBRID_SOLVER in self.state.options: self._stored_solver = claripy.SolverHybrid( track=track, approximate_first=approximate_first) elif o.SYMBOLIC in self.state.options: self._stored_solver = claripy.Solver(track=track) else: self._stored_solver = claripy.SolverConcrete() return self._stored_solver
def _solver(self): """ Creates or gets a Claripy solver, based on the state options. """ if self._stored_solver is not None: return self._stored_solver track = o.CONSTRAINT_TRACKING_IN_SOLVER in self.state.options approximate_first = o.APPROXIMATE_FIRST in self.state.options if o.STRINGS_ANALYSIS in self.state.options: if 'smtlib_cvc4' in backend_manager.backends._backends_by_name: our_backend = backend_manager.backends.smtlib_cvc4 elif 'smtlib_z3' in backend_manager.backends._backends_by_name: our_backend = backend_manager.backends.smtlib_z3 elif 'smtlib_abc' in backend_manager.backends._backends_by_name: our_backend = backend_manager.backends.smtlib_abc else: raise ValueError("Could not find suitable string solver!") if o.COMPOSITE_SOLVER in self.state.options: self._stored_solver = claripy.SolverComposite( template_solver_string=claripy.SolverCompositeChild( backend=our_backend, track=track)) elif o.ABSTRACT_SOLVER in self.state.options: self._stored_solver = claripy.SolverVSA() elif o.SYMBOLIC in self.state.options and o.REPLACEMENT_SOLVER in self.state.options: self._stored_solver = claripy.SolverReplacement(auto_replace=False) elif o.SYMBOLIC in self.state.options and o.CACHELESS_SOLVER in self.state.options: self._stored_solver = claripy.SolverCacheless(track=track) elif o.SYMBOLIC in self.state.options and o.COMPOSITE_SOLVER in self.state.options: self._stored_solver = claripy.SolverComposite(track=track) elif o.SYMBOLIC in self.state.options and any( opt in self.state.options for opt in o.approximation): self._stored_solver = claripy.SolverHybrid( track=track, approximate_first=approximate_first) elif o.HYBRID_SOLVER in self.state.options: self._stored_solver = claripy.SolverHybrid( track=track, approximate_first=approximate_first) elif o.SYMBOLIC in self.state.options: self._stored_solver = claripy.Solver(track=track) else: self._stored_solver = claripy.SolverConcrete() return self._stored_solver
def _solver(self): if self._stored_solver is not None: return self._stored_solver if o.ABSTRACT_SOLVER in self.state.options: self._stored_solver = claripy.SolverVSA() elif o.REPLACEMENT_SOLVER in self.state.options: self._stored_solver = claripy.SolverReplacement(auto_replace=False) elif o.CACHELESS_SOLVER in self.state.options: self._stored_solver = claripy.SolverCacheless() elif o.COMPOSITE_SOLVER in self.state.options: self._stored_solver = claripy.SolverComposite() elif o.SYMBOLIC in self.state.options and o.approximation & self.state.options: self._stored_solver = claripy.SolverHybrid() elif o.SYMBOLIC in self.state.options: self._stored_solver = claripy.Solver() else: self._stored_solver = claripy.SolverConcrete() return self._stored_solver