From d09b6739a580e56fd20808340362a62de95bfa45 Mon Sep 17 00:00:00 2001 From: jxuanli <65455765+jxuanli@users.noreply.github.com> Date: Fri, 7 Nov 2025 06:26:39 -0800 Subject: [PATCH] handle `kbase == None` (#3393) * handle `kbase == None` * handle more none cases --- pwndbg/aglib/kernel/kallsyms.py | 3 +++ pwndbg/aglib/kernel/paging.py | 19 +++++++++++++++---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/pwndbg/aglib/kernel/kallsyms.py b/pwndbg/aglib/kernel/kallsyms.py index c0fe21fd6..4c3bb8580 100644 --- a/pwndbg/aglib/kernel/kallsyms.py +++ b/pwndbg/aglib/kernel/kallsyms.py @@ -44,6 +44,9 @@ class Kallsyms: def __init__(self): self.kallsyms: List[Tuple[str, str, int]] = [] self.kbase = pwndbg.aglib.kernel.kbase() + if self.kbase is None: + print(M.warn("could not find kbase, kernel has not finished initialization?")) + return mapping = pwndbg.aglib.kernel.first_kernel_ro_page() assert mapping is not None, "kernel memory mappings are missing" diff --git a/pwndbg/aglib/kernel/paging.py b/pwndbg/aglib/kernel/paging.py index c5e6ff91b..f9856df24 100644 --- a/pwndbg/aglib/kernel/paging.py +++ b/pwndbg/aglib/kernel/paging.py @@ -91,6 +91,8 @@ class ArchPagingInfo: raise NotImplementedError() def kbase_helper(self, address): + if address is None: + return None for mapping in kernel_vmmap_pages(): # should be page aligned -- either from pt-dump or info mem @@ -220,7 +222,10 @@ class x86_64PagingInfo(ArchPagingInfo): @property @pwndbg.lib.cache.cache_until("stop") def kbase(self): - return self.kbase_helper(pwndbg.aglib.kernel.get_idt_entries()[0].offset) + idt_entries = pwndbg.aglib.kernel.get_idt_entries() + if len(idt_entries) == 0: + return None + return self.kbase_helper(idt_entries[0].offset) @property def page_shift(self) -> int: @@ -290,10 +295,10 @@ class x86_64PagingInfo(ArchPagingInfo): def handle_kernel_pages(self, pages): kernel_idx = None + kbase = self.kbase for i, page in enumerate(pages): - if kernel_idx is None and self.kbase in page: + if kernel_idx is None and kbase is not None and kbase in page: kernel_idx = i - kbase = self.kbase if kernel_idx is None: return has_loadable_driver = False @@ -384,6 +389,8 @@ class Aarch64PagingInfo(ArchPagingInfo): @property @pwndbg.lib.cache.cache_until("stop") def module_start(self): + if self.kbase is None: + return None res = None for page in kernel_vmmap_pages()[::-1]: if page.start >= self.kbase: @@ -534,7 +541,9 @@ class Aarch64PagingInfo(ArchPagingInfo): if value == 0xFFFFFFFFFFFFFFFF: break return tuple(sections) - vmalloc_end = min(self.vmemmap, self.pci, self.fixmap) + vmalloc_end = None + if self.vmemmap and self.pci and self.fixmap: + vmalloc_end = min(self.vmemmap, self.pci, self.fixmap) return ( (self.USERLAND, 0), (None, self.PAGE_OFFSET), @@ -565,6 +574,8 @@ class Aarch64PagingInfo(ArchPagingInfo): return " ".join(name.strip().split()[:-1]) def handle_kernel_pages(self, pages): + if self.kbase is None: + return for i in range(len(pages)): page = pages[i] if page.start > self.kbase + self.ksize: