Exemplo n.º 1
0
    def testBasicMigration(self):
        solver = Z3Solver.instance()
        cs1 = ConstraintSet()
        cs2 = ConstraintSet()
        var1 = cs1.new_bitvec(32, "var")
        var2 = cs2.new_bitvec(32, "var")
        cs1.add(Operators.ULT(var1, 3))  # var1 can be 0, 1, 2

        # make a migration map dict
        migration_map1 = {}

        # this expression is composed with variables of both cs
        expression = var1 > var2
        migrated_expression = cs1.migrate(expression, migration_map1)
        cs1.add(migrated_expression)

        expression = var2 > 0
        migrated_expression = cs1.migrate(expression, migration_map1)
        cs1.add(migrated_expression)

        self.assertItemsEqual(solver.get_all_values(cs1, var1),
                              [2])  # should only be [2]
"""
Race condition on Reserve buy and sell allows one to steal ethers
"""
import sys
from collections import namedtuple
from manticore.ethereum import ManticoreEVM
from manticore.utils import config
from manticore.ethereum.abi import ABI
#from manticore.core.smtlib import solver

from manticore.core.smtlib.solver import Z3Solver

solver = Z3Solver.instance()

from initialize_market import initialize
from constants import ONE_ETH

consts = config.get_group("evm")
consts.oog = "ignore"

Account = namedtuple('Account', ['name', 'account', 'initial_supply'])

################ Helpers #######################


def init_user(m, market, name, initial_balance):
    user_account = m.create_account(balance=initial_balance)
    print(f"[+] Creating a {name} account {hex(user_account.address)}")

    market.ether_token_contract.deposit(value=initial_balance,
                                        caller=user_account)
Exemplo n.º 3
0
def constraints_are_sat(cons):
    "Whether constraints are sat"
    return Z3Solver.instance().check(constraints_to_constraintset(cons))
Exemplo n.º 4
0
 def setUp(self):
     self.solver = Z3Solver.instance()
Exemplo n.º 5
0
    def test_ConstraintsForking(self):
        solver = Z3Solver.instance()
        import pickle

        cs = ConstraintSet()
        # make free 32bit bitvectors
        x = cs.new_bitvec(8)
        y = cs.new_bitvec(8)

        # linear relation
        # cs.add(x+y*5 == 0)

        # Fork and divide in quadrants

        saved_up = None
        saved_up_right = None
        saved_up_left = None
        saved_down = None
        saved_down_right = None
        saved_down_left = None

        with cs as cs_up:
            cs_up.add(y.uge(0x80))
            self.assertItemsEqual(solver.get_all_values(cs_up, x),
                                  range(0x0, 0x100))
            self.assertItemsEqual(solver.get_all_values(cs_up, y),
                                  range(0x80, 0x100))

            saved_up = pickle_dumps((x, y, cs_up))

            self.assertItemsEqual(solver.get_all_values(cs_up, x),
                                  range(0x0, 0x100))
            self.assertItemsEqual(solver.get_all_values(cs_up, y),
                                  range(0x80, 0x100))

            with cs_up as cs_up_right:
                cs_up_right.add(x.uge(0x80))
                saved_up_right = pickle_dumps((x, y, cs_up_right))
                self.assertItemsEqual(solver.get_all_values(cs_up_right, x),
                                      range(0x80, 0x100))
                self.assertItemsEqual(solver.get_all_values(cs_up_right, y),
                                      range(0x80, 0x100))

            self.assertItemsEqual(solver.get_all_values(cs_up, x),
                                  range(0x0, 0x100))
            self.assertItemsEqual(solver.get_all_values(cs_up, y),
                                  range(0x80, 0x100))

            with cs_up as cs_up_left:
                cs_up_left.add(x.ult(0x80))
                saved_up_left = pickle_dumps((x, y, cs_up_left))
                self.assertItemsEqual(solver.get_all_values(cs_up_left, x),
                                      range(0, 0x80))
                self.assertItemsEqual(solver.get_all_values(cs_up_left, y),
                                      range(0x80, 0x100))

            self.assertItemsEqual(solver.get_all_values(cs_up, x),
                                  range(0x0, 0x100))
            self.assertItemsEqual(solver.get_all_values(cs_up, y),
                                  range(0x80, 0x100))

        with cs as cs_down:
            cs_down.add(y.ult(0x80))

            self.assertItemsEqual(solver.get_all_values(cs_down, x),
                                  range(0x0, 0x100))
            self.assertItemsEqual(solver.get_all_values(cs_down, y),
                                  range(0, 0x80))

            saved_down = pickle_dumps((x, y, cs_down))

            self.assertItemsEqual(solver.get_all_values(cs_down, x),
                                  range(0x0, 0x100))
            self.assertItemsEqual(solver.get_all_values(cs_down, y),
                                  range(0, 0x80))

            with cs_down as cs_down_right:
                cs_down_right.add(x.uge(0x80))
                saved_down_right = pickle_dumps((x, y, cs_down_right))
                self.assertItemsEqual(solver.get_all_values(cs_down_right, x),
                                      range(0x80, 0x100))
                self.assertItemsEqual(solver.get_all_values(cs_down_right, y),
                                      range(0, 0x80))

            self.assertItemsEqual(solver.get_all_values(cs_down, x),
                                  range(0x0, 0x100))
            self.assertItemsEqual(solver.get_all_values(cs_down, y),
                                  range(0, 0x80))

            with cs_down as cs_down_left:
                cs_down_left.add(x.ult(0x80))
                saved_down_left = pickle_dumps((x, y, cs_down_left))
                self.assertItemsEqual(solver.get_all_values(cs_down_left, x),
                                      range(0, 0x80))
                self.assertItemsEqual(solver.get_all_values(cs_down_left, y),
                                      range(0, 0x80))

            self.assertItemsEqual(solver.get_all_values(cs_down, x),
                                  range(0x0, 0x100))
            self.assertItemsEqual(solver.get_all_values(cs_down, y),
                                  range(0, 0x80))

            x, y, cs_up = pickle.loads(saved_up)
            self.assertItemsEqual(solver.get_all_values(cs_up, x),
                                  range(0x0, 0x100))
            self.assertItemsEqual(solver.get_all_values(cs_up, y),
                                  range(0x80, 0x100))

            x, y, cs_up_right = pickle.loads(saved_up_right)
            self.assertItemsEqual(solver.get_all_values(cs_up_right, x),
                                  range(0x80, 0x100))
            self.assertItemsEqual(solver.get_all_values(cs_up_right, y),
                                  range(0x80, 0x100))

            x, y, cs_up_left = pickle.loads(saved_up_left)
            self.assertItemsEqual(solver.get_all_values(cs_up_left, x),
                                  range(0x00, 0x80))
            self.assertItemsEqual(solver.get_all_values(cs_up_left, y),
                                  range(0x80, 0x100))

            x, y, cs_down = pickle.loads(saved_down)
            self.assertItemsEqual(solver.get_all_values(cs_down, x),
                                  range(0x0, 0x100))
            self.assertItemsEqual(solver.get_all_values(cs_down, y),
                                  range(0x0, 0x80))

            x, y, cs_down_right = pickle.loads(saved_down_right)
            self.assertItemsEqual(solver.get_all_values(cs_down_right, x),
                                  range(0x80, 0x100))
            self.assertItemsEqual(solver.get_all_values(cs_down_right, y),
                                  range(0x00, 0x80))

            x, y, cs_down_left = pickle.loads(saved_down_left)
            self.assertItemsEqual(solver.get_all_values(cs_down_left, x),
                                  range(0x00, 0x80))
            self.assertItemsEqual(solver.get_all_values(cs_down_left, y),
                                  range(0x00, 0x80))
Exemplo n.º 6
0
    def test_related_to(self):
        import gzip
        import pickle, sys

        filename = os.path.abspath(
            os.path.join(DIRPATH, "data", "ErrRelated.pkl.gz"))

        # A constraint set and a contraint caught in the act of making related_to fail
        constraints, constraint = pickle.loads(
            gzip.open(filename, "rb").read())

        Z3Solver.instance().can_be_true.cache_clear()
        ground_truth = Z3Solver.instance().can_be_true(constraints, constraint)
        self.assertEqual(ground_truth, False)

        Z3Solver.instance().can_be_true.cache_clear()
        self.assertEqual(
            ground_truth,
            Z3Solver.instance().can_be_true(
                constraints.related_to(constraints), constraint),
        )

        # Replace
        new_constraint = Operators.UGE(
            Operators.SEXTEND(BitVecConstant(256, 0x1A), 256, 512) *
            BitVecConstant(512, 1),
            0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000,
        )
        self.assertEqual(translate_to_smtlib(constraint),
                         translate_to_smtlib(new_constraint))

        Z3Solver.instance().can_be_true.cache_clear()
        self.assertEqual(
            ground_truth,
            Z3Solver.instance().can_be_true(constraints, new_constraint))

        Z3Solver.instance().can_be_true.cache_clear()
        self.assertEqual(
            ground_truth,
            Z3Solver.instance().can_be_true(
                constraints.related_to(new_constraint), new_constraint),
        )