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.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 raw_hybrid_solver(reuse_z3_solver): claripy._backend_z3.reuse_z3_solver = reuse_z3_solver s = claripy.SolverHybrid() x = claripy.BVS('x', 32, min=0, max=10, stride=2) y = claripy.BVS('y', 32, min=20, max=30, stride=5) # TODO: for now, the stride isn't respected in symbolic mode, but we'll fix that next. # until we do, let's add constraints s.add(x <= 10) s.add(x % 2 == 0) s.add(y >= 20) s.add(y <= 30) s.add((y - 20) % 5 == 0) s.add(x != 8) nose.tools.assert_equal(sorted(s.eval(x, 20, exact=False)), [0, 2, 4, 6, 8, 10]) nose.tools.assert_equal(sorted(s.eval(x, 20)), [0, 2, 4, 6, 10]) nose.tools.assert_equal(sorted(s.eval(y, 20, exact=False)), [20, 25, 30]) nose.tools.assert_equal(sorted(s.eval(y, 20)), [20, 25, 30]) # test approximate_first option s._approximate_first = True old_solve_count = claripy._backends_module.backend_z3.solve_count nose.tools.assert_equal(sorted(s.eval(x, 20)), [0, 2, 4, 6, 8, 10]) nose.tools.assert_equal(claripy._backends_module.backend_z3.solve_count, old_solve_count) s._approximate_firsrt = False # now constrain things further so that the VSA overapproximates s.add(x <= 4) nose.tools.assert_equal(sorted(s.eval(x, 20, exact=False)), [0, 2, 4]) nose.tools.assert_equal(sorted(s.eval(x, 20)), [0, 2, 4]) s.add(y >= 27) nose.tools.assert_equal(s.eval(y, 20, exact=False), (30, )) nose.tools.assert_equal(s.eval(y, 20), (30, )) t = claripy.SolverHybrid() x = claripy.BVS('x', 32) t.add(x <= 10) print(t.eval(x, 80, exact=False)) nose.tools.assert_equal(len(t.eval(x, 5, exact=False)), 5) nose.tools.assert_equal(len(t.eval(x, 5, exact=False)), 5) nose.tools.assert_equal(len(t.eval(x, 6, exact=False)), 6) nose.tools.assert_equal(len(t.eval(x, 8, exact=False)), 8) nose.tools.assert_equal(len(t.eval(x, 99, exact=False)), 11)
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 test_hybrid_solver(): s = claripy.SolverHybrid() x = claripy.BVS('x', 32, min=0, max=10, stride=2) y = claripy.BVS('y', 32, min=20, max=30, stride=5) # TODO: for now, the stride isn't respected in symbolic mode, but we'll fix that next. # until we do, let's add constraints s.add(x <= 10) s.add(x % 2 == 0) s.add(y >= 20) s.add(y <= 30) s.add((y - 20) % 5 == 0) s.add(x != 8) nose.tools.assert_equal(sorted(s.eval(x, 20, exact=False)), [0, 2, 4, 6, 8, 10]) nose.tools.assert_equal(sorted(s.eval(x, 20)), [0, 2, 4, 6, 10]) nose.tools.assert_equal(sorted(s.eval(y, 20, exact=False)), [20, 25, 30]) nose.tools.assert_equal(sorted(s.eval(y, 20)), [20, 25, 30]) # now constrain things further so that the VSA overapproximates s.add(x <= 4) nose.tools.assert_equal(sorted(s.eval(x, 20, exact=False)), [0, 2, 4]) nose.tools.assert_equal(sorted(s.eval(x, 20)), [0, 2, 4]) s.add(y >= 27) nose.tools.assert_equal(s.eval(y, 20, exact=False), (30, )) nose.tools.assert_equal(s.eval(y, 20), (30, )) t = claripy.SolverHybrid() x = claripy.BVS('x', 32) t.add(x <= 10) print(t.eval(x, 80, exact=False)) nose.tools.assert_equal(len(t.eval(x, 5, exact=False)), 5) nose.tools.assert_equal(len(t.eval(x, 5, exact=False)), 5) nose.tools.assert_equal(len(t.eval(x, 6, exact=False)), 6) nose.tools.assert_equal(len(t.eval(x, 8, exact=False)), 8) nose.tools.assert_equal(len(t.eval(x, 99, exact=False)), 11)
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