Source code for angr.storage.memory_mixins.paged_memory.privileged_mixin

from .paged_memory_mixin import PagedMemoryMixin


[docs]class PrivilegedPagingMixin(PagedMemoryMixin): """ A mixin for paged memory models which will raise SimSegfaultExceptions if STRICT_PAGE_ACCESS is enabled and a segfault condition is detected. Segfault conditions include: - getting a page for reading which is non-readable - getting a page for writing which is non-writable - creating a page The latter condition means that this should be inserted under any mixins which provide other implementations of ``_initialize_page``. """ def _get_page(self, pageno: int, writing: bool, priv: bool = False, **kwargs): page = super()._get_page(pageno, writing, **kwargs) if self.category == "mem" and not priv and o.STRICT_PAGE_ACCESS in self.state.options: if writing and not self.state.solver.is_true(page.perm_write): raise SimSegfaultException(pageno * self.page_size, "non-writable") if not writing and not self.state.solver.is_true(page.perm_read): raise SimSegfaultException(pageno * self.page_size, "non-readable") return page def _initialize_page(self, pageno: int, priv: bool = False, **kwargs): if self.category == "mem" and not priv and o.STRICT_PAGE_ACCESS in self.state.options: raise SimSegfaultException(pageno * self.page_size, "unmapped") return super()._initialize_page(pageno, **kwargs)
from angr.errors import SimSegfaultException from angr import sim_options as o