예제 #1
0
    def test_extract_contract(self):
        self.astEquals(TAst.extract(7, 0, TAst.bv(0xffff, 16)),
                       self.mba8.from_cst(0xff))

        self.astEquals(TAst.concat([TAst.bv(0xff, 8),
                                    TAst.bv(0x00, 8)]),
                       self.mba16.from_cst(0xff00))
예제 #2
0
    def test_bind_expr_to_register(self):
        """Check symbolic expression binded to register."""
        expr1 = newSymbolicExpression(ast.bv(0x11223344, 64))
        assignSymbolicExpressionToRegister(expr1, REG.RAX)

        self.assertEqual(getSymbolicRegisterValue(REG.RAX), 0x11223344)

        expr1 = newSymbolicExpression(ast.bv(0x11223344, 32))
        with self.assertRaises(Exception):
            # Incorrect size
            assignSymbolicExpressionToRegister(expr1, REG.RAX)
예제 #3
0
 def test_mba(self):
     # x^y = (x+y) - ((x&y)<<1)
     e = TAst.bvsub(
         TAst.bvadd(self.x8_t, self.y8_t),
         TAst.bvshl(TAst.bvand(self.x8_t, self.y8_t), TAst.bv(1, 8)))
     ea = tritonast2arybo(e, use_exprs=False, use_esf=True)
     simplify_inplace(expand_esf_inplace(ea))
     self.assertEqual(ea, self.x8 ^ self.y8)
예제 #4
0
    def test_bind_expr_to_memory(self):
        """Check symbolic expression binded to memory can be retrieve."""
        # Bind expr1 to 0x100
        expr1 = newSymbolicExpression(ast.bv(0x11, 8))
        mem = MemoryAccess(0x100, CPUSIZE.BYTE)
        assignSymbolicExpressionToMemory(expr1, mem)

        # Get expr from memory
        expr2 = getSymbolicExpressionFromId(getSymbolicMemoryId(0x100))

        self.assertEqual(expr1.getAst().evaluate(), expr2.getAst().evaluate())
예제 #5
0
    def test_binaryops(self):
        ops = ((TAst.bvadd, operator.add), (TAst.bvsub, operator.sub),
               (TAst.bvand, operator.and_), (TAst.bvor, operator.or_),
               (TAst.bvxor, operator.xor), (TAst.bvmul, operator.mul),
               (TAst.bvnand, lambda x, y: ~(x & y)),
               (TAst.bvnor, lambda x, y: ~(x | y)), (TAst.bvxnor,
                                                     lambda x, y: ~(x ^ y)))
        for op in ops:
            self.astEquals(op[0](self.x8_t, self.y8_t), op[1](self.x8,
                                                              self.y8))

        # One udiv test because it can take a lot of time...
        e = TAst.bvudiv(self.x8_t, TAst.bv(15, 8))
        self.astEquals(e, self.x8.udiv(15))
예제 #6
0
    def test_shifts(self):
        # Triton interface is not consistant between sh{r,l} and ro{l,r}.
        # For the first kind, it can take any AstNode. For the second one, an
        # integer is forced.
        ops = (
            (TAst.bvlshr, operator.rshift),
            (TAst.bvshl, operator.lshift),
        )
        for op in ops:
            for s in range(9):
                self.astEquals(op[0](self.x8_t, TAst.bv(s, 8)), op[1](self.x8,
                                                                      s))

        ops = ((TAst.bvrol, lambda x, n: x.rol(n)), (TAst.bvror,
                                                     lambda x, n: x.ror(n)))
        for op in ops:
            for s in range(9):
                self.astEquals(op[0](s, self.x8_t), op[1](self.x8, s))
예제 #7
0
    def test_bind_expr_to_multi_memory(self):
        """Check symbolic expression binded to multiple memory location."""
        # Bind expr to multi memory location (0x100, 0x101, 0x102, 0x103)
        expr1 = newSymbolicExpression(ast.bv(0x11223344, 32))
        mem = MemoryAccess(0x100, CPUSIZE.DWORD)
        assignSymbolicExpressionToMemory(expr1, mem)

        # Check we can get back the same values
        expr2 = getSymbolicExpressionFromId(getSymbolicMemoryId(0x100))
        expr3 = getSymbolicExpressionFromId(getSymbolicMemoryId(0x101))
        expr4 = getSymbolicExpressionFromId(getSymbolicMemoryId(0x102))
        expr5 = getSymbolicExpressionFromId(getSymbolicMemoryId(0x103))

        self.assertEqual(expr2.getAst().evaluate(), 0x44)
        self.assertEqual(expr3.getAst().evaluate(), 0x33)
        self.assertEqual(expr4.getAst().evaluate(), 0x22)
        self.assertEqual(expr5.getAst().evaluate(), 0x11)

        self.assertEqual(getSymbolicMemoryValue(mem), 0x11223344)
예제 #8
0
    def emulate(self, pc):
        """
        Emulate every opcodes from pc.

        * Process instruction until the end and search for constraint
        resolution on cmp eax, 1 then set the new correct value and keep going.
        """
        while pc:
            # Fetch opcodes
            opcodes = getConcreteMemoryAreaValue(pc, 16)

            # Create the Triton instruction
            instruction = Instruction()
            instruction.setOpcodes(opcodes)
            instruction.setAddress(pc)

            # Process
            processing(instruction)

            # 40078B: cmp eax, 1
            # eax must be equal to 1 at each round.
            if instruction.getAddress() == 0x40078B:
                # Slice expressions
                rax = getSymbolicExpressionFromId(
                    getSymbolicRegisterId(REG.RAX))
                eax = ast.extract(31, 0, rax.getAst())

                # Define constraint
                cstr = ast.assert_(
                    ast.land(getPathConstraintsAst(),
                             ast.equal(eax, ast.bv(1, 32))))

                model = getModel(cstr)
                solution = str()
                for k, v in model.items():
                    value = v.getValue()
                    solution += chr(value)
                    getSymbolicVariableFromId(k).setConcreteValue(value)

            # Next
            pc = getConcreteRegisterValue(REG.RIP)
        return solution
예제 #9
0
    def emulate(self, pc):
        """
        Emulate every opcodes from pc.

        * Process instruction until the end and search for constraint
        resolution on cmp eax, 1 then set the new correct value and keep going.
        """
        while pc:
            # Fetch opcodes
            opcodes = getConcreteMemoryAreaValue(pc, 16)

            # Create the Triton instruction
            instruction = Instruction()
            instruction.setOpcodes(opcodes)
            instruction.setAddress(pc)

            # Process
            processing(instruction)

            # 40078B: cmp eax, 1
            # eax must be equal to 1 at each round.
            if instruction.getAddress() == 0x40078B:
                # Slice expressions
                rax = getSymbolicExpressionFromId(getSymbolicRegisterId(REG.RAX))
                eax = ast.extract(31, 0, rax.getAst())

                # Define constraint
                cstr = ast.assert_(ast.land(getPathConstraintsAst(), ast.equal(eax, ast.bv(1, 32))))

                model = getModel(cstr)
                solution = str()
                for k, v in model.items():
                    value = v.getValue()
                    solution += chr(value)
                    getSymbolicVariableFromId(k).setConcreteValue(value)

            # Next
            pc = getConcreteRegisterValue(REG.RIP)
        return solution
예제 #10
0
    def test_build_register(self):
        """Check symbolic register has correct size and location."""
        expr1 = newSymbolicExpression(ast.bv(0x1122334455667788, CPUSIZE.QWORD_BIT))
        assignSymbolicExpressionToRegister(expr1, REG.RAX)

        node = buildSymbolicRegister(REG.RAX)
        self.assertEqual(node.evaluate(), 0x1122334455667788)
        self.assertEqual(node.getBitvectorSize(), CPUSIZE.QWORD_BIT)

        node = buildSymbolicRegister(REG.EAX)
        self.assertEqual(node.evaluate(), 0x55667788)
        self.assertEqual(node.getBitvectorSize(), CPUSIZE.DWORD_BIT)

        node = buildSymbolicRegister(REG.AX)
        self.assertEqual(node.evaluate(), 0x7788)
        self.assertEqual(node.getBitvectorSize(), CPUSIZE.WORD_BIT)

        node = buildSymbolicRegister(REG.AH)
        self.assertEqual(node.evaluate(), 0x77)
        self.assertEqual(node.getBitvectorSize(), CPUSIZE.BYTE_BIT)

        node = buildSymbolicRegister(REG.AL)
        self.assertEqual(node.evaluate(), 0x88)
        self.assertEqual(node.getBitvectorSize(), CPUSIZE.BYTE_BIT)
예제 #11
0
 def test_ror(self):
     """Check ror operations."""
     tests = [
         bvror(0x88888888, bv(0x99999999, 32)),
         bvror(0x12345678, bv(0, 32)),
         bvror(0x12345678, bv(1, 32)),
         bvror(0x12345678, bv(2, 32)),
         bvror(0x12345678, bv(3, 32)),
         bvror(0x12345678, bv(32, 32)),
         bvror(0x12345678, bv(64, 32)),
         bvror(0x12345678, bv(0x12345678, 32)),
         bvror(0xf2345678, bv(0, 32)),
         bvror(0xf2345678, bv(1, 32)),
         bvror(0xf2345678, bv(2, 32)),
         bvror(0xf2345678, bv(3, 32)),
         bvror(0xf2345678, bv(32, 32)),
         bvror(0xf2345678, bv(64, 32)),
         bvror(0xf2345678, bv(0x12345678, 32)),
         bvror(0x99999999, bv(0x88888888, 32)),
         bvror(0, bv(0x12345678, 32)),
         bvror(1, bv(0x12345678, 32)),
         bvror(2, bv(0x12345678, 32)),
         bvror(3, bv(0x12345678, 32)),
         bvror(32, bv(0x12345678, 32)),
         bvror(64, bv(0x12345678, 32)),
         bvror(0x12345678, bv(0x12345678, 32)),
         bvror(0, bv(0xf2345678, 32)),
         bvror(1, bv(0xf2345678, 32)),
         bvror(2, bv(0xf2345678, 32)),
         bvror(3, bv(0xf2345678, 32)),
         bvror(32, bv(0xf2345678, 32)),
         bvror(64, bv(0xf2345678, 32)),
         bvror(0x12345678, bv(0xf2345678, 32)),
     ]
     self.check_ast(tests)
예제 #12
0
 def test_lshr(self):
     """Check lshr operations."""
     tests = [
         bvlshr(bv(0x88888888, 32), bv(0x99999999, 32)),
         bvlshr(bv(0x12345678, 32), bv(0, 32)),
         bvlshr(bv(0x12345678, 32), bv(1, 32)),
         bvlshr(bv(0x12345678, 32), bv(2, 32)),
         bvlshr(bv(0x12345678, 32), bv(3, 32)),
         bvlshr(bv(0x12345678, 32), bv(32, 32)),
         bvlshr(bv(0x12345678, 32), bv(64, 32)),
         bvlshr(bv(0x12345678, 32), bv(0x12345678, 32)),
         bvlshr(bv(0xf2345678, 32), bv(0, 32)),
         bvlshr(bv(0xf2345678, 32), bv(1, 32)),
         bvlshr(bv(0xf2345678, 32), bv(2, 32)),
         bvlshr(bv(0xf2345678, 32), bv(3, 32)),
         bvlshr(bv(0xf2345678, 32), bv(4, 32)),
         bvlshr(bv(0xf2345678, 32), bv(5, 32)),
         bvlshr(bv(0xf2345678, 32), bv(6, 32)),
         bvlshr(bv(0xf2345678, 32), bv(32, 32)),
         bvlshr(bv(0xf2345678, 32), bv(64, 32)),
         bvlshr(bv(0xf2345678, 32), bv(0x12345678, 32)),
         bvlshr(bv(0b10000000, 8), bv(0, 8)),
         bvlshr(bv(0b10000000, 8), bv(1, 8)),
         bvlshr(bv(0b10000000, 8), bv(2, 8)),
         bvlshr(bv(0b10000000, 8), bv(3, 8)),
         bvlshr(bv(0b10000000, 8), bv(4, 8)),
         bvlshr(bv(0b10000000, 8), bv(5, 8)),
         bvlshr(bv(0b10000000, 8), bv(6, 8)),
         bvlshr(bv(0b10000000, 8), bv(7, 8)),
         bvlshr(bv(0b10000000, 8), bv(8, 8)),
         bvlshr(bv(0b10000000, 8), bv(9, 8)),
         bvlshr(bv(0b10000000, 8), bv(123, 8)),
         bvlshr(bv(0b10001000, 8), bv(0, 8)),
         bvlshr(bv(0b10001000, 8), bv(1, 8)),
         bvlshr(bv(0b10001000, 8), bv(2, 8)),
         bvlshr(bv(0b10001000, 8), bv(3, 8)),
         bvlshr(bv(0b10001000, 8), bv(4, 8)),
         bvlshr(bv(0b10001000, 8), bv(5, 8)),
         bvlshr(bv(0b10001000, 8), bv(6, 8)),
         bvlshr(bv(0b10001000, 8), bv(7, 8)),
         bvlshr(bv(0b10001000, 8), bv(8, 8)),
         bvlshr(bv(0b10001000, 8), bv(9, 8)),
         bvlshr(bv(0b10001000, 8), bv(123, 8)),
     ]
     self.check_ast(tests)
예제 #13
0
 def test_shl(self):
     """Check shl operations."""
     tests = [
         bvshl(bv(0x88888888, 32), bv(0x99999999, 32)),
         bvshl(bv(0x12345678, 32), bv(0, 32)),
         bvshl(bv(0x12345678, 32), bv(1, 32)),
         bvshl(bv(0x12345678, 32), bv(2, 32)),
         bvshl(bv(0x12345678, 32), bv(3, 32)),
         bvshl(bv(0x12345678, 32), bv(32, 32)),
         bvshl(bv(0x12345678, 32), bv(64, 32)),
         bvshl(bv(0x12345678, 32), bv(0x12345678, 32)),
         bvshl(bv(0xf2345678, 32), bv(0, 32)),
         bvshl(bv(0xf2345678, 32), bv(1, 32)),
         bvshl(bv(0xf2345678, 32), bv(2, 32)),
         bvshl(bv(0xf2345678, 32), bv(3, 32)),
         bvshl(bv(0xf2345678, 32), bv(32, 32)),
         bvshl(bv(0xf2345678, 32), bv(64, 32)),
         bvshl(bv(0xf2345678, 32), bv(0x12345678, 32)),
         bvshl(bv(0b00000001, 8), bv(0, 8)),
         bvshl(bv(0b00000001, 8), bv(1, 8)),
         bvshl(bv(0b00000001, 8), bv(2, 8)),
         bvshl(bv(0b00000001, 8), bv(3, 8)),
         bvshl(bv(0b00000001, 8), bv(4, 8)),
         bvshl(bv(0b00000001, 8), bv(5, 8)),
         bvshl(bv(0b00000001, 8), bv(6, 8)),
         bvshl(bv(0b00000001, 8), bv(7, 8)),
         bvshl(bv(0b00000001, 8), bv(8, 8)),
         bvshl(bv(0b00000001, 8), bv(9, 8)),
         bvshl(bv(0b00000001, 8), bv(123, 8)),
         bvshl(bv(0b00000001, 8), bv(0, 8)),
         bvshl(bv(0b00000011, 8), bv(1, 8)),
         bvshl(bv(0b00000101, 8), bv(2, 8)),
         bvshl(bv(0b00001001, 8), bv(3, 8)),
         bvshl(bv(0b00010001, 8), bv(4, 8)),
         bvshl(bv(0b00100001, 8), bv(5, 8)),
         bvshl(bv(0b01000001, 8), bv(6, 8)),
         bvshl(bv(0b10000011, 8), bv(7, 8)),
         bvshl(bv(0b01000101, 8), bv(8, 8)),
         bvshl(bv(0b00101001, 8), bv(9, 8)),
         bvshl(bv(0b00010001, 8), bv(123, 8)),
     ]
     self.check_ast(tests)
예제 #14
0
 def test_not(self):
     """Check not operations."""
     tests = [
         bvnot(bv(0x88888888, 32)),
         bvnot(bv(0x12345678, 32)),
         bvnot(bv(0x22345678, 32)),
         bvnot(bv(0x32345678, 32)),
         bvnot(bv(0x42345678, 32)),
         bvnot(bv(0x52345678, 32)),
         bvnot(bv(0x62345678, 32)),
         bvnot(bv(0x72345678, 32)),
         bvnot(bv(0x82345678, 32)),
         bvnot(bv(0x92345678, 32)),
         bvnot(bv(0xa2345678, 32)),
         bvnot(bv(0xb2345678, 32)),
         bvnot(bv(0xc2345678, 32)),
         bvnot(bv(0xd345678, 32)),
         bvnot(bv(0xe2345678, 32)),
         bvnot(bv(0xf2345678, 32)),
         bvnot(bv(0x1, 32)),
         bvnot(bv(0x2, 32)),
         bvnot(bv(0x3, 32)),
         bvnot(bv(0x4, 32)),
         bvnot(bv(0x5, 32)),
         bvnot(bv(0x6, 32)),
         bvnot(bv(0xa, 32)),
         bvnot(bv(0xe, 32)),
         bvnot(bv(0xf, 32)),
         bvnot(bv(0x1f, 32)),
         bvnot(bv(0x2f, 32)),
         bvnot(bv(0x3e, 32)),
         bvnot(bv(0xffff, 32)),
     ]
     self.check_ast(tests)
예제 #15
0
 def test_ashr(self):
     """Check ashr operations."""
     tests = [
         bvashr(bv(0x88888888, 32), bv(0x99999999, 32)),
         bvashr(bv(0x12345678, 32), bv(0, 32)),
         bvashr(bv(0x12345678, 32), bv(1, 32)),
         bvashr(bv(0x12345678, 32), bv(2, 32)),
         bvashr(bv(0x12345678, 32), bv(3, 32)),
         bvashr(bv(0x12345678, 32), bv(32, 32)),
         bvashr(bv(0x12345678, 32), bv(64, 32)),
         bvashr(bv(0x12345678, 32), bv(0x12345678, 32)),
         bvashr(bv(0xf2345678, 32), bv(0, 32)),
         bvashr(bv(0xf2345678, 32), bv(1, 32)),
         bvashr(bv(0xf2345678, 32), bv(2, 32)),
         bvashr(bv(0xf2345678, 32), bv(3, 32)),
         bvashr(bv(0xf2345678, 32), bv(32, 32)),
         bvashr(bv(0xf2345678, 32), bv(64, 32)),
         bvashr(bv(0xf2345678, 32), bv(0x12345678, 32)),
         bvashr(bv(0b10000000, 8), bv(0, 8)),
         bvashr(bv(0b10000000, 8), bv(1, 8)),
         bvashr(bv(0b10000000, 8), bv(2, 8)),
         bvashr(bv(0b10000000, 8), bv(3, 8)),
         bvashr(bv(0b10000000, 8), bv(4, 8)),
         bvashr(bv(0b10000000, 8), bv(5, 8)),
         bvashr(bv(0b10000000, 8), bv(6, 8)),
         bvashr(bv(0b10000000, 8), bv(7, 8)),
         bvashr(bv(0b10000000, 8), bv(8, 8)),
         bvashr(bv(0b10000000, 8), bv(9, 8)),
         bvashr(bv(0b10000000, 8), bv(123, 8)),
         bvashr(bv(0b10001000, 8), bv(0, 8)),
         bvashr(bv(0b10001000, 8), bv(1, 8)),
         bvashr(bv(0b10001000, 8), bv(2, 8)),
         bvashr(bv(0b10001000, 8), bv(3, 8)),
         bvashr(bv(0b10001000, 8), bv(4, 8)),
         bvashr(bv(0b10001000, 8), bv(5, 8)),
         bvashr(bv(0b10001000, 8), bv(6, 8)),
         bvashr(bv(0b10001000, 8), bv(7, 8)),
         bvashr(bv(0b10001000, 8), bv(8, 8)),
         bvashr(bv(0b10001000, 8), bv(9, 8)),
         bvashr(bv(0b10001000, 8), bv(123, 8)),
         bvashr(bv(0b00010001, 8), bv(0b00000001, 8)),
         bvashr(bv(0b00010010, 8), bv(0b00000010, 8)),
         bvashr(bv(0b00010100, 8), bv(0b00000100, 8)),
         bvashr(bv(0b00001000, 8), bv(0b00001000, 8)),
         bvashr(bv(0b00010000, 8), bv(0b00010000, 8)),
         bvashr(bv(0b00100000, 8), bv(0b00100000, 8)),
         bvashr(bv(0b01000000, 8), bv(0b01000001, 8)),
         bvashr(bv(0b10000000, 8), bv(0b10000010, 8)),
         bvashr(bv(0b01000000, 8), bv(0b00000011, 8)),
         bvashr(bv(0b00100000, 8), bv(0b00000101, 8)),
         bvashr(bv(0b00010000, 8), bv(0b00000110, 8)),
         bvashr(bv(0b0010001, 7), bv(0b0000001, 7)),
         bvashr(bv(0b0010010, 7), bv(0b0000010, 7)),
         bvashr(bv(0b0010100, 7), bv(0b0000100, 7)),
         bvashr(bv(0b0001000, 7), bv(0b0001000, 7)),
         bvashr(bv(0b0010000, 7), bv(0b0010000, 7)),
         bvashr(bv(0b0100000, 7), bv(0b0100000, 7)),
         bvashr(bv(0b0000000, 7), bv(0b0000001, 7)),
         bvashr(bv(0b1000000, 7), bv(0b1000010, 7)),
         bvashr(bv(0b0000000, 7), bv(0b0000100, 7)),
         bvashr(bv(0b0100000, 7), bv(0b0000110, 7)),
         bvashr(bv(0b0010000, 7), bv(0b0000111, 7)),
         bvashr(bv(0xfe00000000000000, 64), bv(8, 64)),
     ]
     self.check_ast(tests)
예제 #16
0
 def test_ashr(self):
     """Check ashr operations."""
     tests = [
         bvashr(bv(0x88888888, 32), bv(0x99999999, 32)),
         bvashr(bv(0x12345678, 32), bv(0, 32)),
         bvashr(bv(0x12345678, 32), bv(1, 32)),
         bvashr(bv(0x12345678, 32), bv(2, 32)),
         bvashr(bv(0x12345678, 32), bv(3, 32)),
         bvashr(bv(0x12345678, 32), bv(32, 32)),
         bvashr(bv(0x12345678, 32), bv(64, 32)),
         bvashr(bv(0x12345678, 32), bv(0x12345678, 32)),
         bvashr(bv(0xf2345678, 32), bv(0, 32)),
         bvashr(bv(0xf2345678, 32), bv(1, 32)),
         bvashr(bv(0xf2345678, 32), bv(2, 32)),
         bvashr(bv(0xf2345678, 32), bv(3, 32)),
         bvashr(bv(0xf2345678, 32), bv(32, 32)),
         bvashr(bv(0xf2345678, 32), bv(64, 32)),
         bvashr(bv(0xf2345678, 32), bv(0x12345678, 32)),
         bvashr(bv(0b10000000, 8), bv(0, 8)),
         bvashr(bv(0b10000000, 8), bv(1, 8)),
         bvashr(bv(0b10000000, 8), bv(2, 8)),
         bvashr(bv(0b10000000, 8), bv(3, 8)),
         bvashr(bv(0b10000000, 8), bv(4, 8)),
         bvashr(bv(0b10000000, 8), bv(5, 8)),
         bvashr(bv(0b10000000, 8), bv(6, 8)),
         bvashr(bv(0b10000000, 8), bv(7, 8)),
         bvashr(bv(0b10000000, 8), bv(8, 8)),
         bvashr(bv(0b10000000, 8), bv(9, 8)),
         bvashr(bv(0b10000000, 8), bv(123, 8)),
         bvashr(bv(0b10001000, 8), bv(0, 8)),
         bvashr(bv(0b10001000, 8), bv(1, 8)),
         bvashr(bv(0b10001000, 8), bv(2, 8)),
         bvashr(bv(0b10001000, 8), bv(3, 8)),
         bvashr(bv(0b10001000, 8), bv(4, 8)),
         bvashr(bv(0b10001000, 8), bv(5, 8)),
         bvashr(bv(0b10001000, 8), bv(6, 8)),
         bvashr(bv(0b10001000, 8), bv(7, 8)),
         bvashr(bv(0b10001000, 8), bv(8, 8)),
         bvashr(bv(0b10001000, 8), bv(9, 8)),
         bvashr(bv(0b10001000, 8), bv(123, 8)),
         bvashr(bv(0b00010001, 8), bv(0b00000001, 8)),
         bvashr(bv(0b00010010, 8), bv(0b00000010, 8)),
         bvashr(bv(0b00010100, 8), bv(0b00000100, 8)),
         bvashr(bv(0b00001000, 8), bv(0b00001000, 8)),
         bvashr(bv(0b00010000, 8), bv(0b00010000, 8)),
         bvashr(bv(0b00100000, 8), bv(0b00100000, 8)),
         bvashr(bv(0b01000000, 8), bv(0b01000001, 8)),
         bvashr(bv(0b10000000, 8), bv(0b10000010, 8)),
         bvashr(bv(0b01000000, 8), bv(0b00000011, 8)),
         bvashr(bv(0b00100000, 8), bv(0b00000101, 8)),
         bvashr(bv(0b00010000, 8), bv(0b00000110, 8)),
         bvashr(bv(0b0010001, 7), bv(0b0000001, 7)),
         bvashr(bv(0b0010010, 7), bv(0b0000010, 7)),
         bvashr(bv(0b0010100, 7), bv(0b0000100, 7)),
         bvashr(bv(0b0001000, 7), bv(0b0001000, 7)),
         bvashr(bv(0b0010000, 7), bv(0b0010000, 7)),
         bvashr(bv(0b0100000, 7), bv(0b0100000, 7)),
         bvashr(bv(0b0000000, 7), bv(0b0000001, 7)),
         bvashr(bv(0b1000000, 7), bv(0b1000010, 7)),
         bvashr(bv(0b0000000, 7), bv(0b0000100, 7)),
         bvashr(bv(0b0100000, 7), bv(0b0000110, 7)),
         bvashr(bv(0b0010000, 7), bv(0b0000111, 7)),
         bvashr(bv(0xfe00000000000000, 64), bv(8, 64)),
     ]
     self.check_ast(tests)
예제 #17
0
 def test_not(self):
     """Check not operations."""
     tests = [
         bvnot(bv(0x88888888, 32)),
         bvnot(bv(0x12345678, 32)),
         bvnot(bv(0x22345678, 32)),
         bvnot(bv(0x32345678, 32)),
         bvnot(bv(0x42345678, 32)),
         bvnot(bv(0x52345678, 32)),
         bvnot(bv(0x62345678, 32)),
         bvnot(bv(0x72345678, 32)),
         bvnot(bv(0x82345678, 32)),
         bvnot(bv(0x92345678, 32)),
         bvnot(bv(0xa2345678, 32)),
         bvnot(bv(0xb2345678, 32)),
         bvnot(bv(0xc2345678, 32)),
         bvnot(bv(0xd345678, 32)),
         bvnot(bv(0xe2345678, 32)),
         bvnot(bv(0xf2345678, 32)),
         bvnot(bv(0x1, 32)),
         bvnot(bv(0x2, 32)),
         bvnot(bv(0x3, 32)),
         bvnot(bv(0x4, 32)),
         bvnot(bv(0x5, 32)),
         bvnot(bv(0x6, 32)),
         bvnot(bv(0xa, 32)),
         bvnot(bv(0xe, 32)),
         bvnot(bv(0xf, 32)),
         bvnot(bv(0x1f, 32)),
         bvnot(bv(0x2f, 32)),
         bvnot(bv(0x3e, 32)),
         bvnot(bv(0xffff, 32)),
     ]
     self.check_ast(tests)
예제 #18
0
 def test_shl(self):
     """Check shl operations."""
     tests = [
         bvshl(bv(0x88888888, 32), bv(0x99999999, 32)),
         bvshl(bv(0x12345678, 32), bv(0, 32)),
         bvshl(bv(0x12345678, 32), bv(1, 32)),
         bvshl(bv(0x12345678, 32), bv(2, 32)),
         bvshl(bv(0x12345678, 32), bv(3, 32)),
         bvshl(bv(0x12345678, 32), bv(32, 32)),
         bvshl(bv(0x12345678, 32), bv(64, 32)),
         bvshl(bv(0x12345678, 32), bv(0x12345678, 32)),
         bvshl(bv(0xf2345678, 32), bv(0, 32)),
         bvshl(bv(0xf2345678, 32), bv(1, 32)),
         bvshl(bv(0xf2345678, 32), bv(2, 32)),
         bvshl(bv(0xf2345678, 32), bv(3, 32)),
         bvshl(bv(0xf2345678, 32), bv(32, 32)),
         bvshl(bv(0xf2345678, 32), bv(64, 32)),
         bvshl(bv(0xf2345678, 32), bv(0x12345678, 32)),
         bvshl(bv(0b00000001, 8), bv(0, 8)),
         bvshl(bv(0b00000001, 8), bv(1, 8)),
         bvshl(bv(0b00000001, 8), bv(2, 8)),
         bvshl(bv(0b00000001, 8), bv(3, 8)),
         bvshl(bv(0b00000001, 8), bv(4, 8)),
         bvshl(bv(0b00000001, 8), bv(5, 8)),
         bvshl(bv(0b00000001, 8), bv(6, 8)),
         bvshl(bv(0b00000001, 8), bv(7, 8)),
         bvshl(bv(0b00000001, 8), bv(8, 8)),
         bvshl(bv(0b00000001, 8), bv(9, 8)),
         bvshl(bv(0b00000001, 8), bv(123, 8)),
         bvshl(bv(0b00000001, 8), bv(0, 8)),
         bvshl(bv(0b00000011, 8), bv(1, 8)),
         bvshl(bv(0b00000101, 8), bv(2, 8)),
         bvshl(bv(0b00001001, 8), bv(3, 8)),
         bvshl(bv(0b00010001, 8), bv(4, 8)),
         bvshl(bv(0b00100001, 8), bv(5, 8)),
         bvshl(bv(0b01000001, 8), bv(6, 8)),
         bvshl(bv(0b10000011, 8), bv(7, 8)),
         bvshl(bv(0b01000101, 8), bv(8, 8)),
         bvshl(bv(0b00101001, 8), bv(9, 8)),
         bvshl(bv(0b00010001, 8), bv(123, 8)),
     ]
     self.check_ast(tests)
예제 #19
0
 def test_lshr(self):
     """Check lshr operations."""
     tests = [
         bvlshr(bv(0x88888888, 32), bv(0x99999999, 32)),
         bvlshr(bv(0x12345678, 32), bv(0, 32)),
         bvlshr(bv(0x12345678, 32), bv(1, 32)),
         bvlshr(bv(0x12345678, 32), bv(2, 32)),
         bvlshr(bv(0x12345678, 32), bv(3, 32)),
         bvlshr(bv(0x12345678, 32), bv(32, 32)),
         bvlshr(bv(0x12345678, 32), bv(64, 32)),
         bvlshr(bv(0x12345678, 32), bv(0x12345678, 32)),
         bvlshr(bv(0xf2345678, 32), bv(0, 32)),
         bvlshr(bv(0xf2345678, 32), bv(1, 32)),
         bvlshr(bv(0xf2345678, 32), bv(2, 32)),
         bvlshr(bv(0xf2345678, 32), bv(3, 32)),
         bvlshr(bv(0xf2345678, 32), bv(4, 32)),
         bvlshr(bv(0xf2345678, 32), bv(5, 32)),
         bvlshr(bv(0xf2345678, 32), bv(6, 32)),
         bvlshr(bv(0xf2345678, 32), bv(32, 32)),
         bvlshr(bv(0xf2345678, 32), bv(64, 32)),
         bvlshr(bv(0xf2345678, 32), bv(0x12345678, 32)),
         bvlshr(bv(0b10000000, 8), bv(0, 8)),
         bvlshr(bv(0b10000000, 8), bv(1, 8)),
         bvlshr(bv(0b10000000, 8), bv(2, 8)),
         bvlshr(bv(0b10000000, 8), bv(3, 8)),
         bvlshr(bv(0b10000000, 8), bv(4, 8)),
         bvlshr(bv(0b10000000, 8), bv(5, 8)),
         bvlshr(bv(0b10000000, 8), bv(6, 8)),
         bvlshr(bv(0b10000000, 8), bv(7, 8)),
         bvlshr(bv(0b10000000, 8), bv(8, 8)),
         bvlshr(bv(0b10000000, 8), bv(9, 8)),
         bvlshr(bv(0b10000000, 8), bv(123, 8)),
         bvlshr(bv(0b10001000, 8), bv(0, 8)),
         bvlshr(bv(0b10001000, 8), bv(1, 8)),
         bvlshr(bv(0b10001000, 8), bv(2, 8)),
         bvlshr(bv(0b10001000, 8), bv(3, 8)),
         bvlshr(bv(0b10001000, 8), bv(4, 8)),
         bvlshr(bv(0b10001000, 8), bv(5, 8)),
         bvlshr(bv(0b10001000, 8), bv(6, 8)),
         bvlshr(bv(0b10001000, 8), bv(7, 8)),
         bvlshr(bv(0b10001000, 8), bv(8, 8)),
         bvlshr(bv(0b10001000, 8), bv(9, 8)),
         bvlshr(bv(0b10001000, 8), bv(123, 8)),
     ]
     self.check_ast(tests)
예제 #20
0
    def test_zx_sx(self):
        self.astEquals(TAst.zx(8, TAst.bv(0xff, 8)),
                       self.mba16.from_cst(0x00ff))

        self.astEquals(TAst.sx(8, TAst.bv(0xff, 8)),
                       self.mba16.from_cst(0xffff))
예제 #21
0
 def test_ror(self):
     """Check ror operations."""
     tests = [
         bvror(0x88888888, bv(0x99999999, 32)),
         bvror(0x12345678, bv(0, 32)),
         bvror(0x12345678, bv(1, 32)),
         bvror(0x12345678, bv(2, 32)),
         bvror(0x12345678, bv(3, 32)),
         bvror(0x12345678, bv(32, 32)),
         bvror(0x12345678, bv(64, 32)),
         bvror(0x12345678, bv(0x12345678, 32)),
         bvror(0xf2345678, bv(0, 32)),
         bvror(0xf2345678, bv(1, 32)),
         bvror(0xf2345678, bv(2, 32)),
         bvror(0xf2345678, bv(3, 32)),
         bvror(0xf2345678, bv(32, 32)),
         bvror(0xf2345678, bv(64, 32)),
         bvror(0xf2345678, bv(0x12345678, 32)),
         bvror(0x99999999, bv(0x88888888, 32)),
         bvror(0, bv(0x12345678, 32)),
         bvror(1, bv(0x12345678, 32)),
         bvror(2, bv(0x12345678, 32)),
         bvror(3, bv(0x12345678, 32)),
         bvror(32, bv(0x12345678, 32)),
         bvror(64, bv(0x12345678, 32)),
         bvror(0x12345678, bv(0x12345678, 32)),
         bvror(0, bv(0xf2345678, 32)),
         bvror(1, bv(0xf2345678, 32)),
         bvror(2, bv(0xf2345678, 32)),
         bvror(3, bv(0xf2345678, 32)),
         bvror(32, bv(0xf2345678, 32)),
         bvror(64, bv(0xf2345678, 32)),
         bvror(0x12345678, bv(0xf2345678, 32)),
     ]
     self.check_ast(tests)
예제 #22
0
 def test_srem(self):
     """Check srem operations."""
     tests = [
         bvsrem(bv(0x88888888, 32), bv(0x99999999, 32)),
         bvsrem(bv(0x12345678, 32), bv(0, 32)),
         bvsrem(bv(0x12345678, 32), bv(1, 32)),
         bvsrem(bv(0x12345678, 32), bv(2, 32)),
         bvsrem(bv(0x12345678, 32), bv(3, 32)),
         bvsrem(bv(0x12345678, 32), bv(32, 32)),
         bvsrem(bv(0x12345678, 32), bv(64, 32)),
         bvsrem(bv(0x12345678, 32), bv(0x12345678, 32)),
         bvsrem(bv(0xf2345678, 32), bv(0, 32)),
         bvsrem(bv(0xf2345678, 32), bv(1, 32)),
         bvsrem(bv(0xf2345678, 32), bv(2, 32)),
         bvsrem(bv(0xf2345678, 32), bv(3, 32)),
         bvsrem(bv(0xf2345678, 32), bv(32, 32)),
         bvsrem(bv(0xf2345678, 32), bv(64, 32)),
         bvsrem(bv(0xf2345678, 32), bv(0x12345678, 32)),
         bvsrem(bv(0b10000000, 8), bv(0, 8)),
         bvsrem(bv(0b10000000, 8), bv(1, 8)),
         bvsrem(bv(0b10000000, 8), bv(2, 8)),
         bvsrem(bv(0b10000000, 8), bv(3, 8)),
         bvsrem(bv(0b10000000, 8), bv(4, 8)),
         bvsrem(bv(0b10000000, 8), bv(5, 8)),
         bvsrem(bv(0b10000000, 8), bv(6, 8)),
         bvsrem(bv(0b10000000, 8), bv(7, 8)),
         bvsrem(bv(0b10000000, 8), bv(8, 8)),
         bvsrem(bv(0b10000000, 8), bv(9, 8)),
         bvsrem(bv(0b10000000, 8), bv(123, 8)),
         bvsrem(bv(0b10001000, 8), bv(0, 8)),
         bvsrem(bv(0b10001000, 8), bv(1, 8)),
         bvsrem(bv(0b10001000, 8), bv(2, 8)),
         bvsrem(bv(0b10001000, 8), bv(3, 8)),
         bvsrem(bv(0b10001000, 8), bv(4, 8)),
         bvsrem(bv(0b10001000, 8), bv(5, 8)),
         bvsrem(bv(0b10001000, 8), bv(6, 8)),
         bvsrem(bv(0b10001000, 8), bv(7, 8)),
         bvsrem(bv(0b10001000, 8), bv(8, 8)),
         bvsrem(bv(0b10001000, 8), bv(9, 8)),
         bvsrem(bv(0b10001000, 8), bv(123, 8)),
         bvsrem(bv(0b00010001, 8), bv(0b00000001, 8)),
         bvsrem(bv(0b00010010, 8), bv(0b00000010, 8)),
         bvsrem(bv(0b00010100, 8), bv(0b00000100, 8)),
         bvsrem(bv(0b00001000, 8), bv(0b00001000, 8)),
         bvsrem(bv(0b00010000, 8), bv(0b00010000, 8)),
         bvsrem(bv(0b00100000, 8), bv(0b00100000, 8)),
         bvsrem(bv(0b01000000, 8), bv(0b01000001, 8)),
         bvsrem(bv(0b10000000, 8), bv(0b10000010, 8)),
         bvsrem(bv(0b01000000, 8), bv(0b00000011, 8)),
         bvsrem(bv(0b00100000, 8), bv(0b00000101, 8)),
         bvsrem(bv(0b00010000, 8), bv(0b00000110, 8)),
         bvsrem(bv(0b0010001, 7), bv(0b0000001, 7)),
         bvsrem(bv(0b0010010, 7), bv(0b0000010, 7)),
         bvsrem(bv(0b0010100, 7), bv(0b0000100, 7)),
         bvsrem(bv(0b0001000, 7), bv(0b0001000, 7)),
         bvsrem(bv(0b0010000, 7), bv(0b0010000, 7)),
         bvsrem(bv(0b0100000, 7), bv(0b0100000, 7)),
         bvsrem(bv(0b0000000, 7), bv(0b0000001, 7)),
         bvsrem(bv(0b1000000, 7), bv(0b1000010, 7)),
         bvsrem(bv(0b0000000, 7), bv(0b0000100, 7)),
         bvsrem(bv(0b0100000, 7), bv(0b0000110, 7)),
         bvsrem(bv(0b0010000, 7), bv(0b0000111, 7)),
         bvsrem(bv(291, 16), sx(8, bv(251, 8))),
         bvsrem(bv(4, 16), sx(8, bv(255, 8))),
         bvsrem(zx(16, bv(42313, 16)), sx(16, bv(65491, 16))),
         bvsrem(zx(16, bv(32768, 16)), sx(16, bv(65535, 16))),
         bvsrem(zx(32, bv(4294734073, 32)), sx(32, bv(4294967251, 32))),
         bvsrem(zx(32, bv(2147483648, 32)), sx(32, bv(4294967295, 32))),
         bvsrem(zx(64, bv(18446744073709318393, 64)),
                sx(64, bv(18446744073709551571, 64))),
         bvsrem(zx(64, bv(9223372036854775808, 64)),
                sx(64, bv(18446744073709551615, 64))),
     ]
     self.check_ast(tests)
예제 #23
0
 def test_srem(self):
     """Check srem operations."""
     tests = [
         bvsrem(bv(0x88888888, 32), bv(0x99999999, 32)),
         bvsrem(bv(0x12345678, 32), bv(0, 32)),
         bvsrem(bv(0x12345678, 32), bv(1, 32)),
         bvsrem(bv(0x12345678, 32), bv(2, 32)),
         bvsrem(bv(0x12345678, 32), bv(3, 32)),
         bvsrem(bv(0x12345678, 32), bv(32, 32)),
         bvsrem(bv(0x12345678, 32), bv(64, 32)),
         bvsrem(bv(0x12345678, 32), bv(0x12345678, 32)),
         bvsrem(bv(0xf2345678, 32), bv(0, 32)),
         bvsrem(bv(0xf2345678, 32), bv(1, 32)),
         bvsrem(bv(0xf2345678, 32), bv(2, 32)),
         bvsrem(bv(0xf2345678, 32), bv(3, 32)),
         bvsrem(bv(0xf2345678, 32), bv(32, 32)),
         bvsrem(bv(0xf2345678, 32), bv(64, 32)),
         bvsrem(bv(0xf2345678, 32), bv(0x12345678, 32)),
         bvsrem(bv(0b10000000, 8), bv(0, 8)),
         bvsrem(bv(0b10000000, 8), bv(1, 8)),
         bvsrem(bv(0b10000000, 8), bv(2, 8)),
         bvsrem(bv(0b10000000, 8), bv(3, 8)),
         bvsrem(bv(0b10000000, 8), bv(4, 8)),
         bvsrem(bv(0b10000000, 8), bv(5, 8)),
         bvsrem(bv(0b10000000, 8), bv(6, 8)),
         bvsrem(bv(0b10000000, 8), bv(7, 8)),
         bvsrem(bv(0b10000000, 8), bv(8, 8)),
         bvsrem(bv(0b10000000, 8), bv(9, 8)),
         bvsrem(bv(0b10000000, 8), bv(123, 8)),
         bvsrem(bv(0b10001000, 8), bv(0, 8)),
         bvsrem(bv(0b10001000, 8), bv(1, 8)),
         bvsrem(bv(0b10001000, 8), bv(2, 8)),
         bvsrem(bv(0b10001000, 8), bv(3, 8)),
         bvsrem(bv(0b10001000, 8), bv(4, 8)),
         bvsrem(bv(0b10001000, 8), bv(5, 8)),
         bvsrem(bv(0b10001000, 8), bv(6, 8)),
         bvsrem(bv(0b10001000, 8), bv(7, 8)),
         bvsrem(bv(0b10001000, 8), bv(8, 8)),
         bvsrem(bv(0b10001000, 8), bv(9, 8)),
         bvsrem(bv(0b10001000, 8), bv(123, 8)),
         bvsrem(bv(0b00010001, 8), bv(0b00000001, 8)),
         bvsrem(bv(0b00010010, 8), bv(0b00000010, 8)),
         bvsrem(bv(0b00010100, 8), bv(0b00000100, 8)),
         bvsrem(bv(0b00001000, 8), bv(0b00001000, 8)),
         bvsrem(bv(0b00010000, 8), bv(0b00010000, 8)),
         bvsrem(bv(0b00100000, 8), bv(0b00100000, 8)),
         bvsrem(bv(0b01000000, 8), bv(0b01000001, 8)),
         bvsrem(bv(0b10000000, 8), bv(0b10000010, 8)),
         bvsrem(bv(0b01000000, 8), bv(0b00000011, 8)),
         bvsrem(bv(0b00100000, 8), bv(0b00000101, 8)),
         bvsrem(bv(0b00010000, 8), bv(0b00000110, 8)),
         bvsrem(bv(0b0010001, 7), bv(0b0000001, 7)),
         bvsrem(bv(0b0010010, 7), bv(0b0000010, 7)),
         bvsrem(bv(0b0010100, 7), bv(0b0000100, 7)),
         bvsrem(bv(0b0001000, 7), bv(0b0001000, 7)),
         bvsrem(bv(0b0010000, 7), bv(0b0010000, 7)),
         bvsrem(bv(0b0100000, 7), bv(0b0100000, 7)),
         bvsrem(bv(0b0000000, 7), bv(0b0000001, 7)),
         bvsrem(bv(0b1000000, 7), bv(0b1000010, 7)),
         bvsrem(bv(0b0000000, 7), bv(0b0000100, 7)),
         bvsrem(bv(0b0100000, 7), bv(0b0000110, 7)),
         bvsrem(bv(0b0010000, 7), bv(0b0000111, 7)),
         bvsrem(bv(291, 16), sx(8, bv(251, 8))),
         bvsrem(bv(4, 16), sx(8, bv(255, 8))),
         bvsrem(zx(16, bv(42313, 16)), sx(16, bv(65491, 16))),
         bvsrem(zx(16, bv(32768, 16)), sx(16, bv(65535, 16))),
         bvsrem(zx(32, bv(4294734073, 32)), sx(32, bv(4294967251, 32))),
         bvsrem(zx(32, bv(2147483648, 32)), sx(32, bv(4294967295, 32))),
         bvsrem(zx(64, bv(18446744073709318393, 64)), sx(64, bv(18446744073709551571, 64))),
         bvsrem(zx(64, bv(9223372036854775808, 64)), sx(64, bv(18446744073709551615, 64))),
     ]
     self.check_ast(tests)
예제 #24
0
 def test_or(self):
     """Check or operations."""
     tests = [
         bvor(bv(0x88888888, 32), bv(0x99999999, 32)),
         bvor(bv(0x12345678, 32), bv(0, 32)),
         bvor(bv(0x12345678, 32), bv(1, 32)),
         bvor(bv(0x12345678, 32), bv(2, 32)),
         bvor(bv(0x12345678, 32), bv(3, 32)),
         bvor(bv(0x12345678, 32), bv(32, 32)),
         bvor(bv(0x12345678, 32), bv(64, 32)),
         bvor(bv(0x12345678, 32), bv(0x12345678, 32)),
         bvor(bv(0xf2345678, 32), bv(0, 32)),
         bvor(bv(0xf2345678, 32), bv(1, 32)),
         bvor(bv(0xf2345678, 32), bv(2, 32)),
         bvor(bv(0xf2345678, 32), bv(3, 32)),
         bvor(bv(0xf2345678, 32), bv(32, 32)),
         bvor(bv(0xf2345678, 32), bv(64, 32)),
         bvor(bv(0xf2345678, 32), bv(0x12345678, 32)),
     ]
     self.check_ast(tests)
예제 #25
0
 def test_or(self):
     """Check or operations."""
     tests = [
         bvor(bv(0x88888888, 32), bv(0x99999999, 32)),
         bvor(bv(0x12345678, 32), bv(0, 32)),
         bvor(bv(0x12345678, 32), bv(1, 32)),
         bvor(bv(0x12345678, 32), bv(2, 32)),
         bvor(bv(0x12345678, 32), bv(3, 32)),
         bvor(bv(0x12345678, 32), bv(32, 32)),
         bvor(bv(0x12345678, 32), bv(64, 32)),
         bvor(bv(0x12345678, 32), bv(0x12345678, 32)),
         bvor(bv(0xf2345678, 32), bv(0, 32)),
         bvor(bv(0xf2345678, 32), bv(1, 32)),
         bvor(bv(0xf2345678, 32), bv(2, 32)),
         bvor(bv(0xf2345678, 32), bv(3, 32)),
         bvor(bv(0xf2345678, 32), bv(32, 32)),
         bvor(bv(0xf2345678, 32), bv(64, 32)),
         bvor(bv(0xf2345678, 32), bv(0x12345678, 32)),
     ]
     self.check_ast(tests)
예제 #26
0
    def test_leaves(self):
        c = random.choice(range(0xff))
        self.astEquals(TAst.bv(c, 8), self.mba8.from_cst(c))

        self.astEquals(self.x8_t, self.x8)