diff --git a/pwndbg/aglib/kernel/__init__.py b/pwndbg/aglib/kernel/__init__.py index e0009f007..41ba9a9fc 100644 --- a/pwndbg/aglib/kernel/__init__.py +++ b/pwndbg/aglib/kernel/__init__.py @@ -116,14 +116,23 @@ def first_kernel_ro_page() -> pwndbg.lib.memory.Page | None: if base is None: return None + fallback_mappings = [] for mapping in pwndbg.aglib.kernel.vmmap.kernel_vmmap_pages(): if mapping.vaddr < base: continue if not mapping.read or mapping.write or mapping.execute: + fallback_mappings.append(mapping) continue result = next(pwndbg.search.search(b"Linux version", mappings=[mapping]), None) + if result: + return mapping + for mapping in fallback_mappings: + # this loop handles when the kernel has not finished initialization + # and the permission of the first ro page has not been properly set + result = next(pwndbg.search.search(b"Linux version", mappings=[mapping]), None) + if result: return mapping