Exemplo n.º 1
0
def test_composite_solver():
    #pylint:disable=no-member
    s = claripy.SolverComposite()
    x = claripy.BVS("x", 32)
    y = claripy.BVS("y", 32)
    z = claripy.BVS("z", 32)
    c = claripy.And(x == 1, y == 2, z == 3)
    s.add(c)
    nose.tools.assert_equal(len(s._solver_list), 3)
    nose.tools.assert_true(s.satisfiable())

    s.add(x < y)
    nose.tools.assert_equal(len(s._solver_list), 2)
    nose.tools.assert_true(s.satisfiable())

    s.simplify()
    nose.tools.assert_equal(len(s._solver_list), 3)
    nose.tools.assert_true(s.satisfiable())

    s1 = s.branch()
    nose.tools.assert_equal(len(s1._solver_list), 3)

    s1.add(x > y)
    nose.tools.assert_equal(len(s1._solver_list), 2)
    nose.tools.assert_false(s1.satisfiable())
    nose.tools.assert_equal(len(s._solver_list), 3)
    nose.tools.assert_true(s.satisfiable())

    s.add(claripy.BVV(1, 32) == claripy.BVV(2, 32))
    nose.tools.assert_equal(len(s._solver_list), 3)
    nose.tools.assert_false(s.satisfiable())

    ss = s.branch()
    nose.tools.assert_equal(len(ss._solver_list), 3)
    nose.tools.assert_false(ss.satisfiable())

    s = claripy.SolverComposite()
    x = claripy.BVS("x", 32)
    y = claripy.BVS("y", 32)
    z = claripy.BVS("z", 32)
    c = claripy.And(x == 1, y == 2, z == 3)
    s.add(c)

    if isinstance(s._template_frontend, claripy.frontend_mixins.ModelCacheMixin):
        assert len(s._solver_list) == 3
        count = claripy._backends_module.backend_z3.solve_count
        assert s.satisfiable()
        assert claripy._backends_module.backend_z3.solve_count == count + 3
        assert list(s.eval(x+y, 1)) == [3]
        assert claripy._backends_module.backend_z3.solve_count == count + 3
Exemplo n.º 2
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
Exemplo n.º 3
0
 def get_solver(self):
     # Skip these test for now because of a problem with pysmt
     raise nose.SkipTest()
     solver = claripy.SolverPortfolio(solvers=[
         claripy.SolverComposite(
             template_solver_string=claripy.SolverCompositeChild(
                 backend=claripy.backend_manager.backends.smtlib_cvc4)),
         claripy.SolverComposite(
             template_solver_string=claripy.SolverCompositeChild(
                 backend=claripy.backend_manager.backends.smtlib_z3)),
         claripy.SolverComposite(
             template_solver_string=claripy.SolverCompositeChild(
                 backend=claripy.backend_manager.backends.smtlib_z3str)),
     ])
     return solver
Exemplo n.º 4
0
def test_composite_discrepancy():
    a = claripy.BVS("a", 8)
    b = claripy.BVS("b", 8)
    x = claripy.BVS("x", 32)
    y = claripy.BVS("y", 32)
    z = claripy.BVS("z", 32)

    xy = x + y
    dst = claripy.BVV(0xbaaaaf50, 32) + xy
    constraints = []
    constraints.append(x <= 0x1)
    constraints.append(x != 0x0)
    constraints.append(claripy.SignExt(24, claripy.If(x > 0x0, a, 0)) != 0xa)
    constraints.append(x < 0x80)
    constraints.append(y <= 0x1)
    constraints.append(x == 0x1)
    constraints.append((0xbaaaaf50 + x) == 0xbaaaaf51)
    constraints.append(y != 0x0)
    constraints.append(claripy.SignExt(24, claripy.If(y > 0x0, b, 0)) != 0xa)
    constraints.append((x + y) < 0x80)
    constraints.append(z <= 0x1)
    constraints.append((x + y) == 0x2)

    sn = claripy.Solver()
    sc = claripy.SolverComposite()

    sn.add(constraints)
    sc.add(constraints)
    print(sn.max(dst), sc.max(dst))
    print(sn.min(dst), sc.min(dst))
    assert sn.max(dst) == sc.max(dst)
    assert sn.min(dst) == sc.min(dst)
Exemplo n.º 5
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

        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
Exemplo n.º 6
0
def test_composite_solver_branching_optimizations():
    s = claripy.SolverComposite()
    w = claripy.BVS("w", 32)
    x = claripy.BVS("x", 32)
    y = claripy.BVS("y", 32)
    z = claripy.BVS("z", 32)

    s.add(w == 10)
    assert len(s._unchecked_solvers) == 1
    assert s.satisfiable()
    s.add(x == 10)
    assert len(s._unchecked_solvers) == 1

    s2 = s.branch()
    assert len(s2._unchecked_solvers) == 1
    assert s.satisfiable()
    assert len(s._unchecked_solvers) == 0
    assert len(s2._unchecked_solvers) == 1
    s.add(y == 10)
    assert len(s._unchecked_solvers) == 1
    assert len(s2._unchecked_solvers) == 1
    s2.add(z == 10)
    assert len(s._unchecked_solvers) == 1
    assert len(s2._unchecked_solvers) == 2
    assert s2.satisfiable()
    assert len(s._unchecked_solvers) == 1
    assert len(s2._unchecked_solvers) == 0

    s2.add(z == 12)
    assert not s2.satisfiable()
    assert not s2.satisfiable()
Exemplo n.º 7
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
Exemplo n.º 8
0
def test_issue16():
    s = claripy.SolverComposite()

    c = claripy.BVS('test', 32)
    s.add(c[7:0] != 0)

    assert s.satisfiable()
    s.add(c == 0)

    #print s.satisfiable()
    assert not s.satisfiable(extra_constraints=[claripy.BVS('lol', 32) == 0])
    assert not s.satisfiable()
Exemplo n.º 9
0
def test_composite_solver_with_strings():
    s = claripy.SolverComposite(
        template_solver_string=claripy.SolverCompositeChild(
            backend=claripy.backend_manager.backends.smtlib_cvc4))
    x = claripy.BVS("x", 32)
    y = claripy.BVS("y", 32)
    z = claripy.BVS("z", 32)
    str_1 = claripy.StringS("sym_str_1", 1024)
    c = claripy.And(x == 1, y == 2, z == 3,
                    str_1 == claripy.StringV("cavallo"))
    s.add(c)
    nose.tools.assert_equal(len(s._solver_list), 4)
    nose.tools.assert_true(s.satisfiable())
    nose.tools.assert_equal(list(s.eval(str_1, 1)), ["cavallo"])
Exemplo n.º 10
0
def test_datalayer():
    l.info("Running test_datalayer")

    pickle_dir = tempfile.mkdtemp()
    ana.set_dl(ana.DirDataLayer(pickle_dir))
    l.debug("Pickling to %s", pickle_dir)

    a = claripy.BVV(1, 32)
    b = claripy.BVS("x", 32)
    c = a + b
    d = a + b + b + b + b + b + b + b + b + b + b + b + b + b + b + b + b + b + b + b + b + b + b + b + b + b + b + b + b + b + b + b + b + b + b + b + b + b + b + b + b + b + b + b + b + b + b + b + b + b + b + b + b

    l.debug("Storing!")
    a.ana_store()
    c_info = c.ana_store()
    d_info = d.ana_store()

    l.debug("Loading!")
    ana.set_dl(ana.DirDataLayer(pickle_dir))
    #nose.tools.assert_equal(len(claripy.dl._cache), 0)

    cc = claripy.ast.BV.ana_load(c_info)
    nose.tools.assert_equal(str(cc), str(c))
    cd = claripy.ast.BV.ana_load(d_info)
    nose.tools.assert_equal(str(cd), str(d))

    l.debug("Time to test some solvers!")
    s = claripy.Solver()
    x = claripy.BVS("x", 32)
    s.add(x == 3)
    s.finalize()
    ss = claripy.Solver.ana_load(s.ana_store())
    nose.tools.assert_equal(str(s.constraints), str(ss.constraints))
    nose.tools.assert_equal(str(s.variables), str(ss.variables))

    s = claripy.SolverComposite()
    x = claripy.BVS("x", 32)
    s.add(x == 3)
    s.finalize()
    ss = claripy.SolverComposite.ana_load(s.ana_store())
    old_constraint_sets = [[hash(j) for j in k.constraints]
                           for k in s._solver_list]
    new_constraint_sets = [[hash(j) for j in k.constraints]
                           for k in ss._solver_list]
    nose.tools.assert_equal(old_constraint_sets, new_constraint_sets)
    nose.tools.assert_equal(str(s.variables), str(ss.variables))
Exemplo n.º 11
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