Exemplo n.º 1
0
    def _ail_handle_Load(self, expr):
        addr = self._expr(expr.addr)

        if addr != expr.addr:
            return Expr.Load(expr.idx, addr, expr.size, expr.endness,
                             **expr.tags)
        return expr
Exemplo n.º 2
0
    def _ail_handle_Load(self, expr: Expr.Load) -> Optional[PropValue]:

        self.state: 'PropagatorAILState'

        addr = self._expr(expr.addr)

        if self.state.is_top(addr.value):
            return PropValue.from_value_and_details(
                self.state.top(expr.size * self.arch.byte_width), expr.size, expr, self._codeloc()
            )

        sp_offset = self.extract_offset_to_sp(addr.value)
        if sp_offset is not None:
            # Stack variable.
            var = self.state.load_stack_variable(sp_offset, expr.size, endness=expr.endness)
            if var is not None and not self.state.is_top(var.value):
                # We do not add replacements here since in AIL function and block simplifiers we explicitly forbid
                # replacing stack variables.
                #
                #if not self.is_using_outdated_def(var):
                #    l.debug("Add a replacement: %s with %s", expr, var)
                #    self.state.add_replacement(self._codeloc(), expr, var)
                return var

        addr_expr = addr.one_expr
        if addr_expr is not None and addr_expr is not expr.addr:
            new_expr = Expr.Load(expr.idx, addr_expr, expr.size, expr.endness, **expr.tags)
        else:
            new_expr = expr
        prop_value = PropValue.from_value_and_details(
            self.state.top(expr.size * self.arch.byte_width), expr.size, new_expr, self._codeloc()
        )
        return prop_value
Exemplo n.º 3
0
    def _ail_handle_Load(self, expr: Expr.Load):

        self.state: 'PropagatorAILState'

        addr = self._expr(expr.addr)

        if self.state.is_top(addr):
            return self.state.top(expr.size * self.arch.byte_width)

        sp_offset = self.extract_offset_to_sp(addr)
        if sp_offset is not None:
            # Stack variable.
            var = self.state.get_stack_variable(sp_offset,
                                                expr.size,
                                                endness=expr.endness)
            if var is not None and not self.state.is_top(var):
                # We do not add replacements here since in AIL function and block simplifiers we explicitly forbid
                # replacing stack variables.
                #
                #if not self.is_using_outdated_def(var):
                #    l.debug("Add a replacement: %s with %s", expr, var)
                #    self.state.add_replacement(self._codeloc(), expr, var)
                return var

        if addr is not expr.addr:
            return Expr.Load(expr.idx, addr, expr.size, expr.endness,
                             **expr.tags)
        return expr
Exemplo n.º 4
0
    def _ail_handle_Store(self, stmt):
        addr = self._expr(stmt.addr)
        data = self._expr(stmt.data)

        if isinstance(addr, Expr.StackBaseOffset):
            # Storing data to a stack variable
            self.state.store_variable(
                Expr.Load(None, addr, data.bits // 8, stmt.endness), data)
Exemplo n.º 5
0
    def _ail_handle_Load(self, expr):
        addr = self._expr(expr.addr)

        if isinstance(addr, Expr.StackBaseOffset):
            var = self.state.get_stack_variable(addr, expr.size, endness=expr.endness)
            if var is not None:
                return var

        if addr != expr.addr:
            return Expr.Load(expr.idx, addr, expr.size, expr.endness, **expr.tags)
        return expr
Exemplo n.º 6
0
    def _resolve_stack_argument(self, call_stmt, arg_loc):  # pylint:disable=unused-argument

        size = arg_loc.size
        offset = arg_loc.stack_offset
        if self.project.arch.call_pushes_ret:
            # adjust the offset
            offset -= self.project.arch.bytes

        return Expr.Load(None,
                         Expr.Register(None, None, self.project.arch.sp_offset, self.project.arch.bits) +
                            Expr.Const(None, None, offset, self.project.arch.bits),
                         size,
                         self.project.arch.memory_endness,
                         )
Exemplo n.º 7
0
    def _resolve_stack_argument(self, call_stmt, arg_loc) -> Tuple[Any, Any]:  # pylint:disable=unused-argument

        size = arg_loc.size
        offset = arg_loc.stack_offset
        if self.project.arch.call_pushes_ret:
            # adjust the offset
            offset -= self.project.arch.bytes

        # TODO: Support extracting values

        return None, Expr.Load(
            self._atom_idx(),
            Expr.Register(self._atom_idx(), None, self.project.arch.sp_offset,
                          self.project.arch.bits) +
            Expr.Const(self._atom_idx(), None, offset, self.project.arch.bits),
            size,
            self.project.arch.memory_endness,
        )
Exemplo n.º 8
0
    def _ail_handle_Load(self, expr: Expr.Load) -> Optional[PropValue]:

        self.state: 'PropagatorAILState'

        addr = self._expr(expr.addr)

        addr_expr = addr.one_expr

        if addr_expr is not None:
            sp_offset = self.extract_offset_to_sp(addr_expr)
            if sp_offset is not None:
                # Stack variable.
                var = self.state.load_stack_variable(sp_offset, expr.size, endness=expr.endness)
                if var is not None:
                    # We do not add replacements here since in AIL function and block simplifiers we explicitly forbid
                    # replacing stack variables, unless this is in the middle of a call statement.
                    if self.state._inside_call_stmt:
                        if var.one_expr is not None:
                            if not self.is_using_outdated_def(var.one_expr, var.one_defat, avoid=expr.addr):
                                l.debug("Add a replacement: %s with %s", expr, var.one_expr)
                                self.state.add_replacement(self._codeloc(), expr, var.one_expr)
                        else:
                            # there isn't a single expression to replace with. remove the old replacement for this
                            # expression if available.
                            self.state.add_replacement(self._codeloc(), expr, self.state.top(expr.bits))
                    if not self.state.is_top(var.value):
                        return var

        if addr_expr is not None and addr_expr is not expr.addr:
            new_expr = Expr.Load(expr.idx, addr_expr, expr.size, expr.endness, **expr.tags)
        else:
            new_expr = expr
        prop_value = PropValue.from_value_and_details(
            self.state.top(expr.size * self.arch.byte_width), expr.size, new_expr, self._codeloc()
        )
        return prop_value