尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

pwndbg checksec 命令:在 GDB/LLDB 会话中快速检测二进制安全防护属性

pwndbg checksec 命令:在 GDB/LLDB 会话中快速检测二进制安全防护属性 pwndbg checksec 命令在 GDB/LLDB 会话中快速检测二进制安全防护属性【免费下载链接】pwndbgExploit Development and Reverse Engineering with GDB LLDB Made Easy项目地址: https://gitcode.com/GitHub_Trending/pw/pwndbg导读checksec是 pwndbg 提供的一条实用命令用于在调试会话内直接输出当前目标二进制或用户指定文件的安全防护属性包括 RELRO、栈金丝雀Stack Canary、NX、PIE 以及基于 CET 的 SHSTK/IBT 等关键信息。它以 pwntools 的ELF.checksec()为基础实现能够复用 pwndbg 的颜色主题输出结果。读完本文你将掌握checksec的完整用法、输出字段含义以及它在 pwndbg 源码中的实现原理并能将它与内核加固检查命令kchecksec配合使用。命令概览与定位checksec命令属于 pwndbg 命令体系中的MISC杂项类别对应的说明文档位于 docs/commands/misc/checksec.md命令入口实现在 pwndbg/commands/checksec.py。在 pwndbg 的 命令索引 中它的定位是checksec- Prints out the binary security settings usingchecksec一句话概括当你在调试一个二进制程序时输入checksec即可在不退出调试器、不借助外部工具的情况下立刻看到该文件开启了哪些安全机制——这是漏洞利用Exploit Development阶段评估攻击面、判断防护强度的常用前置步骤。语法与参数命令的完整语法如下usage: checksec [-h] [-f FILE]短参数长参数说明-h--help显示帮助信息并退出-f--file指定要运行checksec检查的文件两种典型用法不带参数检查当前正在调试的程序GDB 中已加载的目标文件带-f FILE显式指定任意一个 ELF 文件进行检查即使该文件当前并未被调试。从源码看参数解析由 pwndbg/commands/checksec.py 中的argparse定义parser argparse.ArgumentParser( descriptionPrints out the binary security settings using checksec., ) parser.add_argument(-f, --file, typestr, helpSpecify the file to run checksec on.)典型输出与字段解读在调试会话中执行checksec例如针对/usr/bin/bash输出形如pwndbg checksec File: /usr/bin/bash Arch: amd64 RELRO: Full RELRO Stack: Canary found NX: NX enabled PIE: PIE enabled SHSTK: Enabled IBT: Enabled逐字段解读如下字段含义说明File被检查文件的路径未指定-f时为当前调试目标Arch目标架构如amd64、i386、aarch64等RELRO重定位表只读可能为Full RELRO、Partial RELRO或No RELRO决定 GOT 表能否被改写Stack栈金丝雀Canary found表示存在栈保护No canary found表示可尝试栈溢出NX不可执行栈NX enabled表示栈页不可执行限制 shellcode 直接入栈执行PIE地址随机化PIE enabled表示基址随机化开启需要配合泄漏绕过SHSTKShadow Stack影子栈CET 特性返回地址被额外保护可有效对抗 ROP 中改写返回地址的手法IBTIndirect Branch Tracking间接分支跟踪CET 特性校验间接跳转目标限制 ret2plt / 跳板类利用其中SHSTK与IBT属于 Intel CETControl-flow Enforcement Technology的两大支柱在较新工具链编译的二进制上会以Enabled形式出现。攻击者视角下SHSTK/IBT 开启意味着经典 ROP 链的构造条件大幅收紧需要在利用设计中专门规避。实战两种调用方式方式一检查当前调试目标默认行为在 GDB/LLDB 中启动任意程序后直接执行pwndbg checksec命令会自动确定“当前被调试的可执行文件”。根据 pwndbg/commands/checksec.py 的实现pwndbg.commands.OnlyWithFile def checksec(file: str) - None: local_path file or pwndbg.aglib.file.get_proc_exe_file() print(pwndbg.wrappers.checksec.get_raw_out(local_path))若用户传入-f FILElocal_path取用户指定路径否则调用pwndbg.aglib.file.get_proc_exe_file()见 pwndbg/aglib/file.py它返回“调试目标文件的本地路径”从而实现对 GDB 加载目标的自动解析。方式二显式指定文件调试过程中想顺带分析另一个二进制例如漏洞利用要打的目标版本、或崩溃样本无需重新加载pwndbg checksec -f /path/to/other/binary这在对比“当前调试程序”与“待攻击目标”防护差异时非常实用。无文件加载时的行为checksec被pwndbg.commands.OnlyWithFile装饰器定义于 pwndbg/commands/init.py约束只有当前会话能够确定目标文件时才执行。当没有加载任何文件时它会拒绝执行并给出错误提示在 QEMU 调试场景下报错Could not determine the target binary on QEMU.其他场景下报错There is no file loaded.这意味着该命令依赖调试器上下文中存在可解析的 ELF 目标不能在“空会话”下凭空工作。源码级原理与 pwntools 的集成checksec的输出并非 pwndbg 自行实现而是基于 pwntools 的pwnlib.elf.ELF.checksec()生成。核心逻辑集中在 pwndbg/wrappers/checksec.pydef get_raw_out(local_path: str) - str: elf ELF(local_path) output File:.ljust(10) elf.path \n output Arch:.ljust(10) elf.arch \n with monkeypatch_pwnlib_term_text(): output elf.checksec() return output几个实现细节值得注意列对齐的“魔数 10”File:与Arch:两行使用ljust(10)对齐源码注释明确指出10是 pwntoolself.checksec()内部用于对齐输出的魔数二者必须保持一致否则输出会错位。若将来 pwntools 变更对齐宽度此处的10也需要同步更新。颜色输出接管monkeypatchpwntools 默认使用自己的pwnlib.term.text配色红/绿/黄来标记各防护状态。pwndbg 通过monkeypatch_pwnlib_term_text()上下文管理器把这些颜色函数临时替换为 pwndbg 自己的配色体系见 pwndbg/color/message.py 的error/success/warn从而让checksec的输出与 pwndbg 整体主题风格统一pwnlib.term.text.red message.error pwnlib.term.text.green message.success pwnlib.term.text.yellow message.warn离开上下文后立即del恢复避免污染 pwntools 全局状态。这是一个典型的“第三方库输出风格适配”模式也提示读者此处与 pwntools 内部实现强耦合升级 pwntools 时需要关注兼容性。日志静默模块顶部通过pwnlib.elf.elf.log._logger.disabled True关闭 pwntools 的日志输出避免其调试信息混入 pwndbg 的命令结果。此外该包装模块还提供了两个独立的判断函数relro_status(local_path)将 pwntools 的elf.relro取值Full/Partial/None映射为人类可读的Full RELRO/Partial RELRO/No RELROpie_status(local_path)根据elf.pie返回PIE enabled或No PIE。这两个函数可被 pwndbg 其他模块复用作为独立的防护状态查询接口。延伸内核加固检查kchecksecpwndbg 还提供了一条同族命令kchecksec文档见 docs/commands/kernel/kchecksec.md实现见 pwndbg/commands/kchecksec.py用于检查 Linux 内核的加固配置而非单个二进制。它需要满足OnlyWhenQemuKernelQEMU 内核调试环境与OnlyWhenPagingEnabled两个前提逐项读取内核 Kconfig 配置并对照一组加固期望值输出。其检查项覆盖面很广包括栈溢出保护STACKPROTECTOR、STACKPROTECTOR_STRONG、SHADOW_CALL_STACK可写可执行RWXSTRICT_KERNEL_RWX、STRICT_MODULE_RWX、DEBUG_WXASLRRANDOMIZE_BASE、RANDOMIZE_KSTACK_OFFSET_DEFAULT等内存分配加固SLAB_FREELIST_HARDENED、SLAB_FREELIST_RANDOM、KFENCECFICFI_CLANG访问控制SECURITY_YAMA、SELinux 相关选项以及FORTIFY_SOURCE、HARDENED_USERCOPY、RANDSTRUCT_FULL、STRICT_DEVMEM等数十项杂项加固。且针对不同架构附加专属检查项x86 系i386/x86-64额外检查X86_SMAP、IA32_EMULATION、X86_X32aarch64则检查ARM64_PAN、ARM64_EPAN、ARM64_PTR_AUTH、ARM64_BTI、ARM64_MTE等。该命令已有自动化测试覆盖见 tests/library/qemu_system/tests/test_commands_kernel.py 中的test_command_kchecksec。两者定位互补checksec面向用户态二进制的安全属性kchecksec面向内核映像的加固配置在涉及内核漏洞利用、沙箱逃逸等场景时尤其值得联合使用。小结checksec在调试器内直接输出目标 ELF 的 RELRO、Canary、NX、PIE、SHSTK、IBT 等防护状态零切换成本默认自动识别当前调试文件也可用-f FILE指定任意文件实现上以 pwntoolsELF.checksec()为引擎由 pwndbg/wrappers/checksec.py 完成对齐、配色接管与日志静默无文件加载或 QEMU 环境下命令会被OnlyWithFile装饰器拦截并提示配合kchecksec可从“用户态二进制”与“内核配置”两个层面完成安全评估。【免费下载链接】pwndbgExploit Development and Reverse Engineering with GDB LLDB Made Easy项目地址: https://gitcode.com/GitHub_Trending/pw/pwndbg创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表