handle `kbase == None` (#3393)

* handle `kbase == None`

* handle more none cases
pull/3397/head
jxuanli 1 month ago committed by GitHub
parent e91e883e59
commit d09b6739a5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -44,6 +44,9 @@ class Kallsyms:
def __init__(self): def __init__(self):
self.kallsyms: List[Tuple[str, str, int]] = [] self.kallsyms: List[Tuple[str, str, int]] = []
self.kbase = pwndbg.aglib.kernel.kbase() 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() mapping = pwndbg.aglib.kernel.first_kernel_ro_page()
assert mapping is not None, "kernel memory mappings are missing" assert mapping is not None, "kernel memory mappings are missing"

@ -91,6 +91,8 @@ class ArchPagingInfo:
raise NotImplementedError() raise NotImplementedError()
def kbase_helper(self, address): def kbase_helper(self, address):
if address is None:
return None
for mapping in kernel_vmmap_pages(): for mapping in kernel_vmmap_pages():
# should be page aligned -- either from pt-dump or info mem # should be page aligned -- either from pt-dump or info mem
@ -220,7 +222,10 @@ class x86_64PagingInfo(ArchPagingInfo):
@property @property
@pwndbg.lib.cache.cache_until("stop") @pwndbg.lib.cache.cache_until("stop")
def kbase(self): 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 @property
def page_shift(self) -> int: def page_shift(self) -> int:
@ -290,10 +295,10 @@ class x86_64PagingInfo(ArchPagingInfo):
def handle_kernel_pages(self, pages): def handle_kernel_pages(self, pages):
kernel_idx = None kernel_idx = None
kbase = self.kbase
for i, page in enumerate(pages): 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 kernel_idx = i
kbase = self.kbase
if kernel_idx is None: if kernel_idx is None:
return return
has_loadable_driver = False has_loadable_driver = False
@ -384,6 +389,8 @@ class Aarch64PagingInfo(ArchPagingInfo):
@property @property
@pwndbg.lib.cache.cache_until("stop") @pwndbg.lib.cache.cache_until("stop")
def module_start(self): def module_start(self):
if self.kbase is None:
return None
res = None res = None
for page in kernel_vmmap_pages()[::-1]: for page in kernel_vmmap_pages()[::-1]:
if page.start >= self.kbase: if page.start >= self.kbase:
@ -534,6 +541,8 @@ class Aarch64PagingInfo(ArchPagingInfo):
if value == 0xFFFFFFFFFFFFFFFF: if value == 0xFFFFFFFFFFFFFFFF:
break break
return tuple(sections) return tuple(sections)
vmalloc_end = None
if self.vmemmap and self.pci and self.fixmap:
vmalloc_end = min(self.vmemmap, self.pci, self.fixmap) vmalloc_end = min(self.vmemmap, self.pci, self.fixmap)
return ( return (
(self.USERLAND, 0), (self.USERLAND, 0),
@ -565,6 +574,8 @@ class Aarch64PagingInfo(ArchPagingInfo):
return " ".join(name.strip().split()[:-1]) return " ".join(name.strip().split()[:-1])
def handle_kernel_pages(self, pages): def handle_kernel_pages(self, pages):
if self.kbase is None:
return
for i in range(len(pages)): for i in range(len(pages)):
page = pages[i] page = pages[i]
if page.start > self.kbase + self.ksize: if page.start > self.kbase + self.ksize:

Loading…
Cancel
Save