You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
pwndbg/tests/qemu-tests/tests/system/test_commands_kernel.py

101 lines
3.1 KiB
Python

from __future__ import annotations
import gdb
import pwndbg
def test_command_kbase():
pass # TODO
def test_command_kchecksec():
res = gdb.execute("kchecksec", to_string=True)
assert res is not None # for F841 warning
# TODO: do something with res
def test_command_kcmdline():
res = gdb.execute("kcmdline", to_string=True)
assert res is not None # for F841 warning
# TODO: do something with res
def test_command_kconfig():
if not pwndbg.gdblib.kernel.has_debug_syms():
res = gdb.execute("kconfig", to_string=True)
assert "may only be run when debugging a Linux kernel with debug" in res
return
res = gdb.execute("kconfig", to_string=True)
assert "CONFIG_IKCONFIG = y" in res
res = gdb.execute("kconfig IKCONFIG", to_string=True)
assert "CONFIG_IKCONFIG = y" in res
def test_command_kversion():
if not pwndbg.gdblib.kernel.has_debug_syms():
res = gdb.execute("kversion", to_string=True)
assert "may only be run when debugging a Linux kernel with debug" in res
return
res = gdb.execute("kversion", to_string=True)
assert "Linux version" in res
def test_command_slab_list():
if not pwndbg.gdblib.kernel.has_debug_syms():
res = gdb.execute("slab list", to_string=True)
assert "may only be run when debugging a Linux kernel with debug" in res
return
res = gdb.execute("slab list", to_string=True)
assert "kmalloc" in res
def test_command_slab_info():
if not pwndbg.gdblib.kernel.has_debug_syms():
res = gdb.execute("slab info kmalloc-512", to_string=True)
assert "may only be run when debugging a Linux kernel with debug" in res
return
for cache in pwndbg.gdblib.kernel.slab.caches():
cache_name = cache.name
res = gdb.execute(f"slab info -v {cache_name}", to_string=True)
assert cache_name in res
assert "Freelist" in res
for cpu in range(pwndbg.gdblib.kernel.nproc()):
assert f"[CPU {cpu}]" in res
res = gdb.execute("slab info -v does_not_exit", to_string=True)
assert "not found" in res
def test_command_slab_contains():
if not pwndbg.gdblib.kernel.has_debug_syms():
res = gdb.execute("slab contains 0x123", to_string=True)
assert "may only be run when debugging a Linux kernel with debug" in res
return
# retrieve a valid slab object address (first address from freelist)
addr, slab_cache = get_slab_object_address()
res = gdb.execute(f"slab contains {addr}", to_string=True)
assert f"{addr} @ {slab_cache}" in res
def get_slab_object_address():
"""helper function to get the address of some kmalloc slab object
and the associated slab cache name"""
import re
caches = pwndbg.gdblib.kernel.slab.caches()
for cache in caches:
cache_name = cache.name
info = gdb.execute(f"slab info -v {cache_name}", to_string=True)
matches = re.findall(r"- (0x[0-9a-fA-F]+)", info)
if len(matches) > 0:
return (matches[0], cache_name)
raise ValueError("Could not find any slab objects")