Example #1
0
    def test_coverage(self):
        '''
        ((mem[piva_global(0xbfbfee08):1] | (mem[(arg0 + 72):4] & 0xffffff00)) + piva_global())
        '''
        ids = []
        piva1 = Var('piva_global', 4)
        ids.append(piva1._sym_id)
        arg = Const(0xbfbfee08, 4)
        ids.append(arg._sym_id)
        call = Call(piva1, 4, argsyms=[arg])
        ids.append(call._sym_id)
        con = Const(1, 4)
        ids.append(con._sym_id)
        mem1 = Mem(call, con)
        ids.append(mem1._sym_id)

        arg = Arg(0, 4)
        ids.append(arg._sym_id)
        addop = Const(72, 4)
        ids.append(addop._sym_id)
        add = o_add(arg, addop, 4)
        ids.append(add._sym_id)
        con = Const(4, 4)
        ids.append(con._sym_id)
        memac = Mem(add, con)
        ids.append(memac._sym_id)
        andop = Const(0xffffff00, 4)
        ids.append(andop._sym_id)
        mem2 = o_and(memac, andop, 4)
        ids.append(mem2._sym_id)
        memor = o_or(mem1, mem2, 4)
        ids.append(memor._sym_id)

        piva2 = Var('piva_global', 4)
        ids.append(piva2._sym_id)
        call2 = Call(piva2, 4, argsyms=[])
        ids.append(call2._sym_id)
        add = o_add(memor, call2, 4)
        ids.append(add._sym_id)

        traveled_ids = []

        def walkerTest(path, symobj, ctx):
            traveled_ids.append(symobj._sym_id)

        add.walkTree(walkerTest)
        self.assertEqual(traveled_ids, ids)
        self.assertEqual(
            '((mem[piva_global(0xbfbfee08):1] | (mem[(arg0 + 72):4] & 0xffffff00)) + piva_global())',
            str(add))
Example #2
0
    def test_callfunc(self):
        # reduction, with and without argsyms
        funcsym = Var('NeatoBurrito', 4)
        argsyms = [
            (Const(1, 4)**Var('edx', 4)) ^ Const(0x10, 4),
            (Var('eax', 4) ^ Var('eax', 4) | Const(0x10, 4)) << Const(0, 4),
            (Var('ebx', 4) & Var('ebx', 4)) | Const(0x40, 4) | Const(0x80, 4),
            Mem(Const(0x41414141, 4), Const(32, 4)),
        ]
        cf = CallFunction(0x44, funcsym, argsyms=argsyms)
        self.assertEqual(
            str(cf),
            'NeatoBurrito(((1 ** edx) ^ 16),(((eax ^ eax) | 16) << 0),(((ebx & ebx) | 64) | 128),mem[0x41414141:32])'
        )
        cf.reduce()
        self.assertEqual(str(cf),
                         'NeatoBurrito(17,16,(ebx | 192),mem[0x41414141:32])')

        # walkTree
        funcsym = Var('NeatoBurrito', 4)
        argsyms = [
            (Var('eax', 4) + Const(47, 4)) + (Var('ebx', 4) + Const(12, 4)),
            Var('foo', 4) & Var('foo', 4),
            Var('eax', 4) / Const(4, 4),
            Var('eax', 4) >> Const(2, 4),
            Const(4, 4) / Var('eax', 4),
        ]
        cf = CallFunction(0x44, funcsym, argsyms=argsyms)
        answer = [
            Var('NeatoBurrito', 4),
            Var('eax', 4),
            Const(47, 4),
            o_add(Var("eax", 4), Const(47, 4), 4),
            Var('ebx', 4),
            Const(12, 4),
            o_add(Var('ebx', 4), Const(12, 4), 4),
            (Var('eax', 4) + Const(47, 4)) + (Var('ebx', 4) + Const(12, 4)),
            Var('foo', 4),
            Var('foo', 4),
            o_and(Var('foo', 4), Var('foo', 4), 4),
            Var('eax', 4),
            Const(4, 4),
            o_div(Var('eax', 4), Const(4, 4), 4),
            Var('eax', 4),
            Const(2, 4),
            o_rshift(Var('eax', 4), Const(2, 4), 4),
            Const(4, 4),
            Var('eax', 4),
            o_div(Const(4, 4), Var('eax', 4), 4),
        ]
        visited = []
        cf.walkTree(walker, ctx=visited)
        self.assertEqual(visited, answer)

        # application, with argsyms
        emu = MockEmulator(MockVw())
        emu.setSymVariable('eax', Const(100, 4))
        newcf = cf.applyEffect(emu=emu)
        newcf.reduce()
        self.assertEqual(str(newcf), 'NeatoBurrito((ebx + 159),foo,25,25,0)')

        # application, without argsyms
        # by itself, emu.applyFunctionCall is just a NOP
        emu = MockEmulator(MockVw())
        funcsym = Var('ebx', 4)
        cf = CallFunction(0x44, funcsym)
        newcf = cf.applyEffect(emu=emu)
        newcf.reduce()
        self.assertEqual(newcf, cf)
Example #3
0
    def test_moarmem(self):
        ctx = {'path': []}
        ast = o_sub(
            o_add(
                o_xor(
                    o_and(
                        o_sub(
                            Mem(
                                o_add(Arg(0, width=8), Const(0x00000030, 8),
                                      8), Const(0x00000008, 8)),
                            o_add(
                                Mem(
                                    o_add(
                                        Mem(Const(0x20000000, 8),
                                            Const(0x00000008, 8)),
                                        Const(0x00000048, 8), 8),
                                    Const(0x00000008, 8)),
                                Const(0x00000001, 8), 8), 8),
                        Const(0xffffffff, 4), 4),
                    o_and(
                        o_sub(
                            Mem(
                                o_add(Const(0x20000000, 8),
                                      Const(0x00000030, 8), 8),
                                Const(0x00000008, 8)),
                            o_add(
                                Mem(
                                    o_add(
                                        Mem(Const(0x20000000, 8),
                                            Const(0x00000008, 8)),
                                        Const(0x00000048, 8), 8),
                                    Const(0x00000008, 8)),
                                Const(0x00000001, 8), 8), 8),
                        Const(0xffffffff, 4), 4), 4), Const(0x00000001, 8), 8),
            Const(0x00000001, 8), 8)

        ast.walkTree(walkTree_cb, ctx)
        flattened = [
            Arg(0, width=8),
            Const(0x00000030, 8),
            o_add(Arg(0, width=8), Const(0x00000030, 8), 8),
            Const(0x00000008, 8),
            Mem(o_add(Arg(0, width=8), Const(0x00000030, 8), 8),
                Const(0x00000008, 8)),
            Const(0x20000000, 8),
            Const(0x00000008, 8),
            Mem(Const(0x20000000, 8), Const(0x00000008, 8)),
            Const(0x00000048, 8),
            o_add(Mem(Const(0x20000000, 8), Const(0x00000008, 8)),
                  Const(0x00000048, 8), 8),
            Const(0x00000008, 8),
            Mem(
                o_add(Mem(Const(0x20000000, 8), Const(0x00000008, 8)),
                      Const(0x00000048, 8), 8), Const(0x00000008, 8)),
            Const(0x00000001, 8),
            o_add(
                Mem(
                    o_add(Mem(Const(0x20000000, 8), Const(0x00000008, 8)),
                          Const(0x00000048, 8), 8), Const(0x00000008, 8)),
                Const(0x00000001, 8), 8),
            o_sub(
                Mem(o_add(Arg(0, width=8), Const(0x00000030, 8), 8),
                    Const(0x00000008, 8)),
                o_add(
                    Mem(
                        o_add(Mem(Const(0x20000000, 8), Const(0x00000008, 8)),
                              Const(0x00000048, 8), 8), Const(0x00000008, 8)),
                    Const(0x00000001, 8), 8), 8),
            Const(0xffffffff, 4),
            o_and(
                o_sub(
                    Mem(o_add(Arg(0, width=8), Const(0x00000030, 8), 8),
                        Const(0x00000008, 8)),
                    o_add(
                        Mem(
                            o_add(
                                Mem(Const(0x20000000, 8), Const(0x00000008,
                                                                8)),
                                Const(0x00000048, 8), 8), Const(0x00000008,
                                                                8)),
                        Const(0x00000001, 8), 8), 8), Const(0xffffffff, 4), 4),
            Const(0x20000000, 8),
            Const(0x00000030, 8),
            o_add(Const(0x20000000, 8), Const(0x00000030, 8), 8),
            Const(0x00000008, 8),
            Mem(o_add(Const(0x20000000, 8), Const(0x00000030, 8), 8),
                Const(0x00000008, 8)),
            Const(0x20000000, 8),
            Const(0x00000008, 8),
            Mem(Const(0x20000000, 8), Const(0x00000008, 8)),
            Const(0x00000048, 8),
            o_add(Mem(Const(0x20000000, 8), Const(0x00000008, 8)),
                  Const(0x00000048, 8), 8),
            Const(0x00000008, 8),
            Mem(
                o_add(Mem(Const(0x20000000, 8), Const(0x00000008, 8)),
                      Const(0x00000048, 8), 8), Const(0x00000008, 8)),
            Const(0x00000001, 8),
            o_add(
                Mem(
                    o_add(Mem(Const(0x20000000, 8), Const(0x00000008, 8)),
                          Const(0x00000048, 8), 8), Const(0x00000008, 8)),
                Const(0x00000001, 8), 8),
            o_sub(
                Mem(o_add(Const(0x20000000, 8), Const(0x00000030, 8), 8),
                    Const(0x00000008, 8)),
                o_add(
                    Mem(
                        o_add(Mem(Const(0x20000000, 8), Const(0x00000008, 8)),
                              Const(0x00000048, 8), 8), Const(0x00000008, 8)),
                    Const(0x00000001, 8), 8), 8),
            Const(0xffffffff, 4),
            o_and(
                o_sub(
                    Mem(o_add(Const(0x20000000, 8), Const(0x00000030, 8), 8),
                        Const(0x00000008, 8)),
                    o_add(
                        Mem(
                            o_add(
                                Mem(Const(0x20000000, 8), Const(0x00000008,
                                                                8)),
                                Const(0x00000048, 8), 8), Const(0x00000008,
                                                                8)),
                        Const(0x00000001, 8), 8), 8), Const(0xffffffff, 4), 4),
            o_xor(
                o_and(
                    o_sub(
                        Mem(o_add(Arg(0, width=8), Const(0x00000030, 8), 8),
                            Const(0x00000008, 8)),
                        o_add(
                            Mem(
                                o_add(
                                    Mem(Const(0x20000000, 8),
                                        Const(0x00000008, 8)),
                                    Const(0x00000048, 8), 8),
                                Const(0x00000008, 8)), Const(0x00000001, 8),
                            8), 8), Const(0xffffffff, 4), 4),
                o_and(
                    o_sub(
                        Mem(
                            o_add(Const(0x20000000, 8), Const(0x00000030, 8),
                                  8), Const(0x00000008, 8)),
                        o_add(
                            Mem(
                                o_add(
                                    Mem(Const(0x20000000, 8),
                                        Const(0x00000008, 8)),
                                    Const(0x00000048, 8), 8),
                                Const(0x00000008, 8)), Const(0x00000001, 8),
                            8), 8), Const(0xffffffff, 4), 4), 4),
            Const(0x00000001, 8),
            o_add(
                o_xor(
                    o_and(
                        o_sub(
                            Mem(
                                o_add(Arg(0, width=8), Const(0x00000030, 8),
                                      8), Const(0x00000008, 8)),
                            o_add(
                                Mem(
                                    o_add(
                                        Mem(Const(0x20000000, 8),
                                            Const(0x00000008, 8)),
                                        Const(0x00000048, 8), 8),
                                    Const(0x00000008, 8)),
                                Const(0x00000001, 8), 8), 8),
                        Const(0xffffffff, 4), 4),
                    o_and(
                        o_sub(
                            Mem(
                                o_add(Const(0x20000000, 8),
                                      Const(0x00000030, 8), 8),
                                Const(0x00000008, 8)),
                            o_add(
                                Mem(
                                    o_add(
                                        Mem(Const(0x20000000, 8),
                                            Const(0x00000008, 8)),
                                        Const(0x00000048, 8), 8),
                                    Const(0x00000008, 8)),
                                Const(0x00000001, 8), 8), 8),
                        Const(0xffffffff, 4), 4), 4), Const(0x00000001, 8), 8),
            Const(0x00000001, 8),
            o_sub(
                o_add(
                    o_xor(
                        o_and(
                            o_sub(
                                Mem(
                                    o_add(Arg(0, width=8),
                                          Const(0x00000030, 8), 8),
                                    Const(0x00000008, 8)),
                                o_add(
                                    Mem(
                                        o_add(
                                            Mem(Const(0x20000000, 8),
                                                Const(0x00000008, 8)),
                                            Const(0x00000048, 8), 8),
                                        Const(0x00000008, 8)),
                                    Const(0x00000001, 8), 8), 8),
                            Const(0xffffffff, 4), 4),
                        o_and(
                            o_sub(
                                Mem(
                                    o_add(Const(0x20000000, 8),
                                          Const(0x00000030, 8), 8),
                                    Const(0x00000008, 8)),
                                o_add(
                                    Mem(
                                        o_add(
                                            Mem(Const(0x20000000, 8),
                                                Const(0x00000008, 8)),
                                            Const(0x00000048, 8), 8),
                                        Const(0x00000008, 8)),
                                    Const(0x00000001, 8), 8), 8),
                            Const(0xffffffff, 4), 4), 4), Const(0x00000001, 8),
                    8), Const(0x00000001, 8), 8)
        ]

        self.assertEqual(ast, evalSymbolik(repr(ast)))
        self.assertEqual(ctx['path'], flattened)
        self.assertEqual(ctx['path'][-1], ast)
Example #4
0
    def test_mem(self):
        ctx = {'path': []}
        ast = o_sub(
            o_add(
                o_xor(
                    o_and(
                        o_sub(
                            Mem(
                                o_add(
                                    #Arg(0,width=8)
                                    Const(0x20000000, 8),
                                    Const(0x00000030, 8),
                                    8),
                                Const(0x00000008, 8)),
                            o_add(
                                Mem(
                                    o_add(
                                        Mem(
                                            #Arg(0,width=8)
                                            Const(0x20000000, 8),
                                            Const(0x00000008, 8)),
                                        Const(0x00000048, 8),
                                        8),
                                    Const(0x00000008, 8)),
                                Const(0x00000001, 8),
                                8),
                            8),
                        Const(0xffffffff, 4),
                        4),
                    o_and(
                        o_sub(
                            Mem(
                                o_add(
                                    #Arg(0,width=8)
                                    Const(0x20000000, 8),
                                    Const(0x00000030, 8),
                                    8),
                                Const(0x00000008, 8)),
                            o_add(
                                Mem(
                                    o_add(
                                        Mem(
                                            #Arg(0,width=8)
                                            Const(0x20000000, 8),
                                            Const(0x00000008, 8)),
                                        Const(0x00000048, 8),
                                        8),
                                    Const(0x00000008, 8)),
                                Const(0x00000001, 8),
                                8),
                            8),
                        Const(0xffffffff, 4),
                        4),
                    4),
                Const(0x00000001, 8),
                8),
            Const(0x00000001, 8),
            8)
        flattened = [
            Const(0x20000000, 8),
            Const(0x00000030, 8),
            o_add(Const(0x20000000, 8), Const(0x00000030, 8), 8),
            Const(0x00000008, 8),
            Mem(o_add(Const(0x20000000, 8), Const(0x00000030, 8), 8),
                Const(0x00000008, 8)),
            Const(0x20000000, 8),
            Const(0x00000008, 8),
            Mem(Const(0x20000000, 8), Const(0x00000008, 8)),
            Const(0x00000048, 8),
            o_add(Mem(Const(0x20000000, 8), Const(0x00000008, 8)),
                  Const(0x00000048, 8), 8),
            Const(0x00000008, 8),
            Mem(
                o_add(Mem(Const(0x20000000, 8), Const(0x00000008, 8)),
                      Const(0x00000048, 8), 8), Const(0x00000008, 8)),
            Const(0x00000001, 8),
            o_add(
                Mem(
                    o_add(Mem(Const(0x20000000, 8), Const(0x00000008, 8)),
                          Const(0x00000048, 8), 8), Const(0x00000008, 8)),
                Const(0x00000001, 8), 8),
            o_sub(
                Mem(o_add(Const(0x20000000, 8), Const(0x00000030, 8), 8),
                    Const(0x00000008, 8)),
                o_add(
                    Mem(
                        o_add(Mem(Const(0x20000000, 8), Const(0x00000008, 8)),
                              Const(0x00000048, 8), 8), Const(0x00000008, 8)),
                    Const(0x00000001, 8), 8), 8),
            Const(0xffffffff, 4),
            o_and(
                o_sub(
                    Mem(o_add(Const(0x20000000, 8), Const(0x00000030, 8), 8),
                        Const(0x00000008, 8)),
                    o_add(
                        Mem(
                            o_add(
                                Mem(Const(0x20000000, 8), Const(0x00000008,
                                                                8)),
                                Const(0x00000048, 8), 8), Const(0x00000008,
                                                                8)),
                        Const(0x00000001, 8), 8), 8), Const(0xffffffff, 4), 4),
            Const(0x20000000, 8),
            Const(0x00000030, 8),
            o_add(Const(0x20000000, 8), Const(0x00000030, 8), 8),
            Const(0x00000008, 8),
            Mem(o_add(Const(0x20000000, 8), Const(0x00000030, 8), 8),
                Const(0x00000008, 8)),
            Const(0x20000000, 8),
            Const(0x00000008, 8),
            Mem(Const(0x20000000, 8), Const(0x00000008, 8)),
            Const(0x00000048, 8),
            o_add(Mem(Const(0x20000000, 8), Const(0x00000008, 8)),
                  Const(0x00000048, 8), 8),
            Const(0x00000008, 8),
            Mem(
                o_add(Mem(Const(0x20000000, 8), Const(0x00000008, 8)),
                      Const(0x00000048, 8), 8), Const(0x00000008, 8)),
            Const(0x00000001, 8),
            o_add(
                Mem(
                    o_add(Mem(Const(0x20000000, 8), Const(0x00000008, 8)),
                          Const(0x00000048, 8), 8), Const(0x00000008, 8)),
                Const(0x00000001, 8), 8),
            o_sub(
                Mem(o_add(Const(0x20000000, 8), Const(0x00000030, 8), 8),
                    Const(0x00000008, 8)),
                o_add(
                    Mem(
                        o_add(Mem(Const(0x20000000, 8), Const(0x00000008, 8)),
                              Const(0x00000048, 8), 8), Const(0x00000008, 8)),
                    Const(0x00000001, 8), 8), 8),
            Const(0xffffffff, 4),
            o_and(
                o_sub(
                    Mem(o_add(Const(0x20000000, 8), Const(0x00000030, 8), 8),
                        Const(0x00000008, 8)),
                    o_add(
                        Mem(
                            o_add(
                                Mem(Const(0x20000000, 8), Const(0x00000008,
                                                                8)),
                                Const(0x00000048, 8), 8), Const(0x00000008,
                                                                8)),
                        Const(0x00000001, 8), 8), 8), Const(0xffffffff, 4), 4),
            o_xor(
                o_and(
                    o_sub(
                        Mem(
                            o_add(Const(0x20000000, 8), Const(0x00000030, 8),
                                  8), Const(0x00000008, 8)),
                        o_add(
                            Mem(
                                o_add(
                                    Mem(Const(0x20000000, 8),
                                        Const(0x00000008, 8)),
                                    Const(0x00000048, 8), 8),
                                Const(0x00000008, 8)), Const(0x00000001, 8),
                            8), 8), Const(0xffffffff, 4), 4),
                o_and(
                    o_sub(
                        Mem(
                            o_add(Const(0x20000000, 8), Const(0x00000030, 8),
                                  8), Const(0x00000008, 8)),
                        o_add(
                            Mem(
                                o_add(
                                    Mem(Const(0x20000000, 8),
                                        Const(0x00000008, 8)),
                                    Const(0x00000048, 8), 8),
                                Const(0x00000008, 8)), Const(0x00000001, 8),
                            8), 8), Const(0xffffffff, 4), 4), 4),
            Const(0x00000001, 8),
            o_add(
                o_xor(
                    o_and(
                        o_sub(
                            Mem(
                                o_add(Const(0x20000000, 8),
                                      Const(0x00000030, 8), 8),
                                Const(0x00000008, 8)),
                            o_add(
                                Mem(
                                    o_add(
                                        Mem(Const(0x20000000, 8),
                                            Const(0x00000008, 8)),
                                        Const(0x00000048, 8), 8),
                                    Const(0x00000008, 8)),
                                Const(0x00000001, 8), 8), 8),
                        Const(0xffffffff, 4), 4),
                    o_and(
                        o_sub(
                            Mem(
                                o_add(Const(0x20000000, 8),
                                      Const(0x00000030, 8), 8),
                                Const(0x00000008, 8)),
                            o_add(
                                Mem(
                                    o_add(
                                        Mem(Const(0x20000000, 8),
                                            Const(0x00000008, 8)),
                                        Const(0x00000048, 8), 8),
                                    Const(0x00000008, 8)),
                                Const(0x00000001, 8), 8), 8),
                        Const(0xffffffff, 4), 4), 4), Const(0x00000001, 8), 8),
            Const(0x00000001, 8),
            o_sub(
                o_add(
                    o_xor(
                        o_and(
                            o_sub(
                                Mem(
                                    o_add(Const(0x20000000, 8),
                                          Const(0x00000030, 8), 8),
                                    Const(0x00000008, 8)),
                                o_add(
                                    Mem(
                                        o_add(
                                            Mem(Const(0x20000000, 8),
                                                Const(0x00000008, 8)),
                                            Const(0x00000048, 8), 8),
                                        Const(0x00000008, 8)),
                                    Const(0x00000001, 8), 8), 8),
                            Const(0xffffffff, 4), 4),
                        o_and(
                            o_sub(
                                Mem(
                                    o_add(Const(0x20000000, 8),
                                          Const(0x00000030, 8), 8),
                                    Const(0x00000008, 8)),
                                o_add(
                                    Mem(
                                        o_add(
                                            Mem(Const(0x20000000, 8),
                                                Const(0x00000008, 8)),
                                            Const(0x00000048, 8), 8),
                                        Const(0x00000008, 8)),
                                    Const(0x00000001, 8), 8), 8),
                            Const(0xffffffff, 4), 4), 4), Const(0x00000001, 8),
                    8), Const(0x00000001, 8), 8)
        ]

        ast.walkTree(walkTree_cb, ctx)
        self.assertEqual(ctx['path'], flattened)
        self.assertEqual(ctx['path'][-1], ast)