diff options
Diffstat (limited to 'miasm2')
| -rw-r--r-- | miasm2/analysis/sandbox.py | 42 | ||||
| -rw-r--r-- | miasm2/expression/simplifications_common.py | 65 |
2 files changed, 102 insertions, 5 deletions
diff --git a/miasm2/analysis/sandbox.py b/miasm2/analysis/sandbox.py index c5873a85..9fdae8cf 100644 --- a/miasm2/analysis/sandbox.py +++ b/miasm2/analysis/sandbox.py @@ -261,13 +261,12 @@ class OS_Linux_str(OS): parser.add_argument("load_base_addr", help="load base address") - -class Arch_x86_32(Arch): - _ARCH_ = "x86_32" +class Arch_x86(Arch): + _ARCH_ = None # Arch name STACK_SIZE = 0x100000 def __init__(self): - super(Arch_x86_32, self).__init__() + super(Arch_x86, self).__init__() if self.options.usesegm: self.jitter.ir_arch.do_stk_segm= True @@ -283,7 +282,15 @@ class Arch_x86_32(Arch): @classmethod def update_parser(cls, parser): parser.add_argument('-s', "--usesegm", action="store_true", - help="Use segments fs:") + help="Use segments") + + +class Arch_x86_32(Arch_x86): + _ARCH_ = "x86_32" + + +class Arch_x86_64(Arch): + _ARCH_ = "x86_64" class Arch_arml(Arch): @@ -334,6 +341,31 @@ class Sandbox_Win_x86_32(Sandbox, Arch_x86_32, OS_Win): super(Sandbox_Win_x86_32, self).run(addr) +class Sandbox_Win_x86_64(Sandbox, Arch_x86_64, OS_Win): + + def __init__(self, *args, **kwargs): + Sandbox.__init__(self, *args, **kwargs) + + # reserve stack for local reg + for i in xrange(0x4): + self.jitter.push_uint64_t(0) + + # Pre-stack some arguments + self.jitter.push_uint64_t(0x1337beef) + + # Set the runtime guard + self.jitter.add_breakpoint(0x1337beef, self.__class__.code_sentinelle) + + + def run(self, addr = None): + """ + If addr is not set, use entrypoint + """ + if addr is None and self.options.address is None: + addr = self.entry_point + super(Sandbox_Win_x86_64, self).run(addr) + + class Sandbox_Linux_x86_32(Sandbox, Arch_x86_32, OS_Linux): def __init__(self, *args, **kwargs): diff --git a/miasm2/expression/simplifications_common.py b/miasm2/expression/simplifications_common.py index 489869f3..13588ffd 100644 --- a/miasm2/expression/simplifications_common.py +++ b/miasm2/expression/simplifications_common.py @@ -263,6 +263,71 @@ def simp_cst_propagation(e_s, e): return -ExprOp(op, *new_args) args = new_args + # A << int with A ExprCompose => move index + if op == "<<" and isinstance(args[0], ExprCompose) and isinstance(args[1], ExprInt): + final_size = args[0].size + shift = int(args[1].arg) + new_args = [] + # shift indexes + for expr, start, stop in args[0].args: + new_args.append((expr, start+shift, stop+shift)) + # filter out expression + filter_args = [] + min_index = final_size + for expr, start, stop in new_args: + if start >= final_size: + continue + if stop > final_size: + expr = expr[:expr.size - (stop - final_size)] + stop = final_size + filter_args.append((expr, start, stop)) + min_index = min(start, min_index) + # create entry 0 + expr = ExprInt_fromsize(min_index, 0) + filter_args = [(expr, 0, min_index)] + filter_args + return ExprCompose(filter_args) + + # A >> int with A ExprCompose => move index + if op == ">>" and isinstance(args[0], ExprCompose) and isinstance(args[1], ExprInt): + final_size = args[0].size + shift = int(args[1].arg) + new_args = [] + # shift indexes + for expr, start, stop in args[0].args: + new_args.append((expr, start-shift, stop-shift)) + # filter out expression + filter_args = [] + max_index = 0 + for expr, start, stop in new_args: + if stop <= 0: + continue + if start < 0: + expr = expr[-start:] + start = 0 + filter_args.append((expr, start, stop)) + max_index = max(stop, max_index) + # create entry 0 + expr = ExprInt_fromsize(final_size - max_index, 0) + filter_args += [(expr, max_index, final_size)] + return ExprCompose(filter_args) + + + # Compose(a) OP Compose(b) with a/b same bounds => Compose(a OP b) + if op in ['|', '&', '^'] and all([isinstance(arg, ExprCompose) for arg in args]): + bounds = set() + for arg in args: + bound = tuple([(start, stop) for (expr, start, stop) in arg.args]) + bounds.add(bound) + if len(bounds) == 1: + bound = list(bounds)[0] + new_args = [[expr] for (expr, start, stop) in args[0].args] + for sub_arg in args[1:]: + for i, (expr, start, stop) in enumerate(sub_arg.args): + new_args[i].append(expr) + for i, arg in enumerate(new_args): + new_args[i] = ExprOp(op, *arg), bound[i][0], bound[i][1] + return ExprCompose(new_args) + return ExprOp(op, *args) |