ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

pwndbg kconfig 命令全解析:在 GDB 中读取 Linux 内核编译配置(Kconfig)的实战指南

pwndbg kconfig 命令全解析:在 GDB 中读取 Linux 内核编译配置(Kconfig)的实战指南 pwndbg kconfig 命令全解析在 GDB 中读取 Linux 内核编译配置Kconfig的实战指南【免费下载链接】pwndbgExploit Development and Reverse Engineering with GDB LLDB Made Easy项目地址: https://gitcode.com/GitHub_Trending/pw/pwndbg导读kconfig是 pwndbg 在内核调试场景下提供的一条实用命令用于在 GDB 会话中直接输出当前被调试 Linux 内核的 Kconfig 编译配置如CONFIG_SLUB_CPU_PARTIAL、CONFIG_SLAB_FREELIST_HARDENED等。本文以 docs/commands/kernel/kconfig.md 的官方用法说明为骨架结合 pwndbg 的命令实现pwndbg/commands/kconfig.py与底层配置解析模块pwndbg/aglib/kernel/kconfig_mod.py深入讲解命令的参数语义、内核配置的提取原理IKCFG_ST/IKCFG_ED内嵌压缩配置、符号探测回退机制以及在内核堆布局分析与kchecksec等模块中的实际应用。读完本文你将能够熟练使用kconfig查询/过滤内核配置并理解 pwndbg 是如何在没有/boot/config-*文件的情况下还原出内核配置的。命令概览与使用场景kconfig命令的功能一句话概括为输出被调试内核的编译配置kernel config。它属于 pwndbg 的 KERNEL 命令类别面向 QEMU 内核调试如用 pwndbg QEMU 调试 Linux 内核镜像场景。在如下场景中该命令尤为有用内核堆漏洞利用开发pwndbg 的堆分析命令如slab系列需要根据CONFIG_SLAB_FREELIST_RANDOM、CONFIG_SLAB_FREELIST_HARDENED、CONFIG_SLUB_CPU_PARTIAL等配置来推导 slab 分配器的布局kconfig可以快速确认这些安全相关配置的开关状态内核安全检查kchecksec 命令会读取同一份 kconfig 数据来展示内核加固选项当它给出的结果与预期不符时可以用kconfig逐一核对快速验证内核特性无需退出 GDB 去翻构建产物直接在调试会话内检索任意CONFIG_*选项。命令行参数详解官方用法如下usage: kconfig [-h] [-l FILE_PATH] [config_name]位置参数位置参数说明config_name要搜索的配置项名称可省略可选参数短选项长选项说明-h--help显示帮助信息并退出-l--load从文件加载内核配置文件三种典型的调用方式与输出行为对应 pwndbg/commands/kconfig.py 的实现逻辑无参数直接执行遍历并打印当前内核的全部配置项每行格式为CONFIG_XXX 值指定config_name查询单个配置若命中则打印CONFIG_XXX 值若未命中则打印Config CONFIG_XXX not set指定-l FILE_PATH将磁盘上的内核配置文件如 qemu 构建产物中的.config加载进当前会话的 kconfig 数据中加载后命令立即返回不打印配置。名称匹配的容错机制查询单个配置时Kconfig.get_key()见 pwndbg/aglib/kernel/kconfig_mod.py会依次尝试三种写法因此用户不必记全大写下划线格式先把输入转换为标准格式CONFIG_ 大写如输入slub_cpu_partial会先尝试CONFIG_SLUB_CPU_PARTIAL再尝试输入本身的大写形式最后尝试输入原文。也就是说kconfig slub_cpu_partial、kconfig CONFIG_SLUB_CPU_PARTIAL都能得到相同结果这一点与 Linux 内核 Kconfig 文件的书写习惯保持了兼容。运行前提QEMU 内核调试环境从命令实现可以看到kconfig带有两个强约束装饰器pwndbg.commands.Command(parser, categoryCommandCategory.KERNEL) pwndbg.commands.OnlyWhenQemuKernel pwndbg.commands.OnlyWhenPagingEnabled见 pwndbg/commands/kconfig.py因此运行kconfig需要满足OnlyWhenQemuKernel当前调试目标必须是运行于 QEMU 中的 Linux 内核即通过target remote连接 QEMU 的 gdbstub 调试内核或直接加载vmlinux内核镜像进行调试OnlyWhenPagingEnabled内核的分页MMU必须已经启用。通常需要在启动流程中把断点设置在start_kernel之后、内存管理子系统初始化完成的阶段此时才能安全地读取内核内存中的配置数据。若环境不满足这两个条件pwndbg 会拒绝执行该命令并给出提示这是保护调试会话不被误操作的重要设计。底层原理配置数据从哪来方式一直接读取内嵌的压缩配置IKCFGLinux 内核在编译时会把完整的 Kconfig 配置以 zlib 压缩的形式内嵌进内核镜像kernel/configs.c的IKCFG_ST/IKCFG_ED标记之间。pwndbg 的kconfig()获取函数见 pwndbg/aglib/kernel/init.py 的kconfig()函数按如下流程提取优先走调试符号若内核带调试符号直接通过符号kernel_config_data与kernel_config_data_end取得配置数据段的起止地址无调试符号时扫描魔数否则在第一个内核只读页first_kernel_ro_page()中搜索bIKCFG_ST魔数定位起点再从起点向后搜索bIKCFG_ED定位终点地址合法性校验检查config_start/config_end是否位于内核地址空间is_kernel且config_start config_end校验失败则回退到探测模式见下文读取并解压用memory.read(config_start, config_size)读取压缩数据交给Kconfig构造函数其中parse_compresed_config()调用zlib.decompress(compressed_config, 16)解压再由parse_config()按行解析对每个含的行将key value拆分为配置项见 pwndbg/aglib/kernel/kconfig_mod.py。该结果带有cache_until(objfile)缓存即换一个被调试对象objfile时才会重新提取性能开销很小。方式二符号探测回退Kconfig(None)如果内核镜像中无法定位到内嵌配置例如配置数据缺失、被裁剪或校验失败Kconfig(None)会启动一套符号启发式探测通过判断内核中是否存在某个特征符号来推断对应CONFIG_*是否开启并在数据中写入y。这套探测覆盖了大量对安全分析与堆解析关键的选项例如配置项探测依据源码中的特征符号/逻辑CONFIG_SMP存在符号pcpu_get_vm_areasCONFIG_MEMCG存在符号kpagecgroup_proc_opsCONFIG_SLAB_FREELIST_RANDOM存在符号init_cache_random_seqCONFIG_HARDENED_USERCOPY存在符号__check_heap_objectCONFIG_SLAB_FREELIST_HARDENED在kmem_cache_open/do_kmem_cache_create/__kmem_cache_create的反汇编片段中检测到get_random调用CONFIG_NUMA存在符号node_reclaimCONFIG_KASAN_GENERIC内核版本 5.11 或 6.1 时查kasan_cache_create5.11 ~ 6.1 之间查__kasan_cache_createCONFIG_KASAN若 KASAN_GENERIC 成立则为真否则查__kasan_kreallocCONFIG_SYSFS存在符号sysfs_kf_seq_showCONFIG_DEBUG_FS存在符号debugfs_attr_readCONFIG_SECURITY存在符号security_inode_init_securityCONFIG_STACKPROTECTOR存在符号put_task_stackCONFIG_SLUB_TINY内核版本 6.2 且不存在符号deactivate_slabCONFIG_SLUB_CPU_PARTIAL存在符号put_cpu_partialCONFIG_SLAB_VIRTUAL存在符号slub_addr_baseCONFIG_CMA存在符号init_cma_reserved_pageblockCONFIG_MEMORY_ISOLATION存在符号start_isolate_page_rangeCONFIG_RANDSTRUCT内核版本 5.19 且符号tainted_mask非零CONFIG_LOCKDEP存在符号fs_reclaim_acquire这一回退机制确保了即便拿不到IKCFG_*数据kconfig及其下游模块仍能对大多数关键配置给出可靠判断。实战示例以下示例均假设已通过 QEMU 连接到内核调试会话且分页已启用。查看全部配置结果较长可用 GDB 的分页或重定向查看pwndbg kconfig CONFIG_LOCALVERSION -test CONFIG_CC_VERSION_TEXT gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0 CONFIG_SMP y CONFIG_SLAB_FREELIST_RANDOM y ...按名称查询单个配置项大小写与CONFIG_前缀均可省略pwndbg kconfig slub_cpu_partial CONFIG_SLUB_CPU_PARTIAL y pwndbg kconfig CONFIG_NUMA CONFIG_NUMA n pwndbg kconfig not_exist_config Config CONFIG_NOT_EXIST_CONFIG not set从磁盘配置文件加载例如想核对 qemu 构建时的.config与内存中提取结果是否一致pwndbg kconfig -l /path/to/build/.config加载后后续kconfig查询与依赖它的命令都会基于该文件内容工作。update_with_file()的解析规则为跳过空行、以#开头的注释行、不含或含多个的行其余行按key value存入见 pwndbg/aglib/kernel/kconfig_mod.py。在 pwndbg 内核分析中的实际应用kconfig并非孤立存在的工具它是 pwndbg 内核分析与堆调试体系的公共数据源slab 堆解析在 pwndbg/aglib/kernel/slab.py 中多处直接调用kernel.kconfig()来决定解析策略——例如根据CONFIG_SLAB_VIRTUAL决定是否走 SLUB_VIRTUAL 布局、根据CONFIG_SLAB_FREELIST_RANDOM决定 freelist 随机化偏移是否生效、根据CONFIG_SLUB_CPU_PARTIAL决定 per-cpu partial 列表是否存在以及为生成的调试 C 头文件按配置开关注入对应的#define如#define CONFIG_SLUB_CPU_PARTIAL。kchecksec 内核加固检查pwndbg/commands/kchecksec.py 读取同一份kconfig数据对KASLR、SMEP/SMAP、堆加固等选项进行判定并输出检查表二者配合可以交叉验证内核加固状态。自动化验证测试用例 tests/library/qemu_system/tests/test_commands_kernel.py 中的test_command_kconfig会执行gdb.execute(kconfig)并断言输出中包含 y说明在标准测试内核中该命令总能解析出至少一个开启的配置项可作为回归测试的参照。小结kconfig命令用最简洁的接口解决了内核调试中的配置查询问题无需记忆地址与符号直接按名称检索配置缺失时还能通过符号探测兜底。理解其「IKCFG 内嵌压缩数据 → 符号探测回退」的双层数据来源机制有助于你在内核镜像异常时判断命令输出的可信度也能更深入地理解 pwndbg 的 slab/kchecksec 等内核功能为何能基于同一份配置数据做出准确的布局推断。【免费下载链接】pwndbgExploit Development and Reverse Engineering with GDB LLDB Made Easy项目地址: https://gitcode.com/GitHub_Trending/pw/pwndbg创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表