예제 #1
0
 def test_memarg(self):
     ctx = {'path': []}
     ast = o_add(
         o_add(
             o_sub(
                 o_add(
                     o_sub(Const(0xbfb00000, 8),
                           Mem(Arg(0, width=8), Const(0x00000008, 8)), 8),
                     o_add(Const(0x000ff000, 8), Const(0x00000008, 8), 8),
                     8), Const(0x00000008, 8), 8), Const(0x00000008, 8), 8),
         Const(0x00000008, 8), 8)
     flattened = [
         Const(0xbfb00000, 8),
         Arg(0, width=8),
         Const(0x00000008, 8),
         Mem(Arg(0, width=8), Const(0x00000008, 8)),
         o_sub(Const(0xbfb00000, 8),
               Mem(Arg(0, width=8), Const(0x00000008, 8)), 8),
         Const(0x000ff000, 8),
         Const(0x00000008, 8),
         o_add(Const(0x000ff000, 8), Const(0x00000008, 8), 8),
         o_add(
             o_sub(Const(0xbfb00000, 8),
                   Mem(Arg(0, width=8), Const(0x00000008, 8)), 8),
             o_add(Const(0x000ff000, 8), Const(0x00000008, 8), 8), 8),
         Const(0x00000008, 8),
         o_sub(
             o_add(
                 o_sub(Const(0xbfb00000, 8),
                       Mem(Arg(0, width=8), Const(0x00000008, 8)), 8),
                 o_add(Const(0x000ff000, 8), Const(0x00000008, 8), 8), 8),
             Const(0x00000008, 8), 8),
         Const(0x00000008, 8),
         o_add(
             o_sub(
                 o_add(
                     o_sub(Const(0xbfb00000, 8),
                           Mem(Arg(0, width=8), Const(0x00000008, 8)), 8),
                     o_add(Const(0x000ff000, 8), Const(0x00000008, 8), 8),
                     8), Const(0x00000008, 8), 8), Const(0x00000008, 8), 8),
         Const(0x00000008, 8),
         o_add(
             o_add(
                 o_sub(
                     o_add(
                         o_sub(Const(0xbfb00000, 8),
                               Mem(Arg(0, width=8), Const(0x00000008, 8)),
                               8),
                         o_add(Const(0x000ff000, 8), Const(0x00000008, 8),
                               8), 8), Const(0x00000008, 8), 8),
                 Const(0x00000008, 8), 8), Const(0x00000008, 8), 8)
     ]
     ast.walkTree(walkTree_cb, ctx)
     self.assertEqual(ctx['path'][-1], ast)
     self.assertEqual(ctx['path'], flattened)
     answer = o_add(
         o_sub(Const(0x00000000, 8),
               Mem(Arg(0, width=8), Const(0x00000008, 8)), 8),
         Const(0xbfbff010, 8), 8)
     self.assertEqual(answer, ast.reduce())
예제 #2
0
    def test_flatten_constant(self):
        ctx = {'path': []}
        ast = o_add(
            o_add(o_add(Const(0x00000000, 8), Const(0x00000001, 8), 8),
                  o_add(Const(0x00000002, 8), Const(0x00000003, 8), 8), 8),
            Const(0x00000004, 8), 8)
        flattened = [
            Const(0x00000000, 8),
            Const(0x00000001, 8),
            o_add(Const(0x00000000, 8), Const(0x00000001, 8), 8),
            Const(0x00000002, 8),
            Const(0x00000003, 8),
            o_add(Const(0x00000002, 8), Const(0x00000003, 8), 8),
            o_add(o_add(Const(0x00000000, 8), Const(0x00000001, 8), 8),
                  o_add(Const(0x00000002, 8), Const(0x00000003, 8), 8), 8),
            Const(0x00000004, 8),
            o_add(
                o_add(o_add(Const(0x00000000, 8), Const(0x00000001, 8), 8),
                      o_add(Const(0x00000002, 8), Const(0x00000003, 8), 8), 8),
                Const(0x00000004, 8), 8),
        ]

        ast.walkTree(walkTree_cb, ctx)
        self.assertEqual(ctx['path'][-1], ast)
        self.assertEqual(ctx['path'], flattened)
        self.assertEqual(Const(0xa, 8), ast.reduce())

        ctx = {'path': []}
        ast = o_add(
            o_add(
                o_sub(
                    o_add(o_sub(Const(0xbfb00000, 8), Const(0x00000008, 8), 8),
                          o_add(Const(0x000ff000, 8), Const(0x00000008, 8),
                                8), 8), Const(0x00000008, 8), 8),
                Const(0x00000008, 8), 8), Const(0x00000008, 8), 8)
        flattened = [
            Const(0xbfb00000, 8),
            Const(0x00000008, 8),
            o_sub(Const(0xbfb00000, 8), Const(0x00000008, 8), 8),
            Const(0x000ff000, 8),
            Const(0x00000008, 8),
            o_add(Const(0x000ff000, 8), Const(0x00000008, 8), 8),
            o_add(o_sub(Const(0xbfb00000, 8), Const(0x00000008, 8), 8),
                  o_add(Const(0x000ff000, 8), Const(0x00000008, 8), 8), 8),
            Const(0x00000008, 8),
            o_sub(
                o_add(o_sub(Const(0xbfb00000, 8), Const(0x00000008, 8), 8),
                      o_add(Const(0x000ff000, 8), Const(0x00000008, 8), 8), 8),
                Const(0x00000008, 8), 8),
            Const(0x00000008, 8),
            o_add(
                o_sub(
                    o_add(o_sub(Const(0xbfb00000, 8), Const(0x00000008, 8), 8),
                          o_add(Const(0x000ff000, 8), Const(0x00000008, 8),
                                8), 8), Const(0x00000008, 8), 8),
                Const(0x00000008, 8), 8),
            Const(0x00000008, 8),
            o_add(
                o_add(
                    o_sub(
                        o_add(
                            o_sub(Const(0xbfb00000, 8), Const(0x00000008, 8),
                                  8),
                            o_add(Const(0x000ff000, 8), Const(0x00000008, 8),
                                  8), 8), Const(0x00000008, 8), 8),
                    Const(0x00000008, 8), 8), Const(0x00000008, 8), 8)
        ]
        ast.walkTree(walkTree_cb, ctx)
        self.assertEqual(ctx['path'], flattened)
        self.assertEqual(Const(0xbfbff008, 8), ast.reduce())
예제 #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)
예제 #4
0
 def test_nested(self):
     ctx = {'path': []}
     ast = o_add(
         o_add(
             o_add(
                 o_add(
                     o_sub(
                         o_sub(
                             o_add(
                                 o_add(
                                     o_add(
                                         o_add(
                                             o_add(
                                                 o_add(
                                                     o_sub(
                                                         o_sub(
                                                             o_sub(
                                                                 o_sub(
                                                                     o_sub(
                                                                         o_sub(
                                                                             o_sub(
                                                                                 Const(
                                                                                     0xbfb00000,
                                                                                     8
                                                                                 ),
                                                                                 Const(
                                                                                     0x00000008,
                                                                                     8
                                                                                 ),
                                                                                 8
                                                                             ),
                                                                             Const(
                                                                                 0x00000008,
                                                                                 8
                                                                             ),
                                                                             8
                                                                         ),
                                                                         Const(
                                                                             0x00000008,
                                                                             8
                                                                         ),
                                                                         8),
                                                                     Const(
                                                                         0x00000008,
                                                                         8),
                                                                     8),
                                                                 Const(
                                                                     0x00000008,
                                                                     8), 8),
                                                             Const(
                                                                 0x00000008,
                                                                 8), 8),
                                                         Const(
                                                             0x00000068, 8),
                                                         8),
                                                     Const(0x00000068,
                                                           8), 8),
                                                 Const(0x00000008, 8), 8),
                                             Const(0x00000008, 8), 8),
                                         o_add(
                                             o_add(
                                                 o_add(
                                                     o_sub(
                                                         o_sub(
                                                             o_sub(
                                                                 o_sub(
                                                                     o_sub(
                                                                         o_sub(
                                                                             o_sub(
                                                                                 Const(
                                                                                     0xff010,
                                                                                     8
                                                                                 ),
                                                                                 Const(
                                                                                     0x00000008,
                                                                                     8
                                                                                 ),
                                                                                 8
                                                                             ),
                                                                             Const(
                                                                                 0x00000008,
                                                                                 8
                                                                             ),
                                                                             8
                                                                         ),
                                                                         Const(
                                                                             0x00000008,
                                                                             8
                                                                         ),
                                                                         8),
                                                                     Const(
                                                                         0x00000008,
                                                                         8),
                                                                     8),
                                                                 Const(
                                                                     0x00000008,
                                                                     8), 8),
                                                             Const(
                                                                 0x00000008,
                                                                 8), 8),
                                                         Const(
                                                             0x00000068, 8),
                                                         8),
                                                     Const(0x00000068,
                                                           8), 8),
                                                 Const(0x00000008, 8), 8),
                                             Const(0x00000008, 8), 8), 8),
                                     Const(0x00000008, 8), 8),
                                 Const(0x00000008, 8), 8),
                             Const(0x00000008, 8), 8), Const(0x00000008,
                                                             8), 8),
                     Const(0x00000008, 8), 8), Const(0x00000008, 8), 8),
             Const(0x00000008, 8), 8), Const(0x00000008, 8), 8)
     ast.walkTree(walkTree_cb, ctx)
     self.assertEqual(ast.reduce(), Const(0xbfbfeff0, 8))
     self.assertEqual(ctx['path'][-1], ast)
     self.assertEqual(len(ctx['path']), 59)
예제 #5
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)