Пример #1
0
    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
Пример #2
0
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)
Пример #3
0
    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
Пример #4
0
    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
Пример #5
0
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)
Пример #6
0
    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