ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

pwndbg xinfo 命令全解:一键剖析任意地址的偏移关系与所属映射

pwndbg xinfo 命令全解:一键剖析任意地址的偏移关系与所属映射 pwndbg xinfo 命令全解一键剖析任意地址的偏移关系与所属映射【免费下载链接】pwndbgExploit Development and Reverse Engineering with GDB LLDB Made Easy项目地址: https://gitcode.com/GitHub_Trending/pw/pwndbgxinfo是 pwndbg 提供的一个内存分析命令用于展示指定地址相对各种关键位置的偏移量offset帮助调试者快速判断这个地址在哪里、离栈顶/栈底/栈指针/文件基址有多远。本文围绕 xinfo 命令文档 展开并结合 pwndbg/commands/xinfo.py 的完整实现深入讲解其输出字段的语义、底层判定逻辑与典型实战用法让读者在 GDB 与 LLDB 环境下都能熟练利用该命令定位内存地址的上下文。命令概览用法与参数xinfo的使用方式非常简洁其完整帮助文本如下usage: xinfo [-h] [address]参数类型参数名说明Positionaladdress要检查的地址默认值$pcOptional-h/--help显示帮助信息并退出命令行解析逻辑定义于 pwndbg/commands/xinfo.pyparser argparse.ArgumentParser( descriptionShows offsets of the specified address from various useful locations. ) parser.add_argument(address, nargs?, default$pc, helpAddress to inspect, typeint)关键点address是可选的nargs?省略时默认检查程序计数器$pc指向的地址即当前正在执行的位置该命令通过pwndbg.commands.Command(parser, categoryCommandCategory.MEMORY)注册归属于Memory内存命令类别命令带有pwndbg.commands.OnlyWhenRunning装饰器意味着只有当调试目标正在运行时才能使用进程尚未启动或已退出时命令不会执行这是 pwndbg 对依赖寄存器与内存映射的命令的统一约束。输出结构总览命令的核心函数xinfo()在 pwndbg/commands/xinfo.py 中实现其执行流程决定了输出的三个层次地址归一化address pwndbg.aglib.arch.ptrmask用架构指针掩码截断地址防止负值或高位垃圾位干扰查找映射调用pwndbg.aglib.vmmap.find(address)查找包含该地址的内存页Page按类型分支输出若地址未映射打印Virtual address 0x... is not mapped.并退出若该页属于栈stack进入xinfo_stack()输出栈相关偏移若该页属于内存映射文件memory-mapped file额外调用xinfo_mmap_file()输出文件相关偏移其余情况调用xinfo_default()输出到映射起点的距离。一次典型输出形如Extended information for virtual address 0x7fffffffe2a8: Containing mapping: 0x7ffffffde000 0x7ffffffff000 rw-p 21000 0 [stack] Offset information: Stack Top 0x7fffffffe2a8 0x7ffffffde000 0x4a2a8 Stack End 0x7fffffffe2a8 0x7ffffffff000 - 0xd58 Stack Pointer 0x7fffffffe2a8 0x7fffffffe218 0x90 Frame Pointer 0x7fffffffe2a8 0x7fffffffe270 - 0x1c8 Next Stack Canary 0x7fffffffe2a8 0x7fffffffe310 - 0x68其中Containing mapping一行直接复用了 pwndbg 内存页对象的字符串表示格式与vmmap命令的输出一致起始地址、结束地址、权限、大小、文件偏移、对象名。栈地址场景xinfo_stack详解当page.is_stack为真即页的对象名以[stack开头判定逻辑见 pwndbg/lib/memory.py时命令调用xinfo_stack()pwndbg/commands/xinfo.py输出以下偏移输出行计算方式含义Stack Topaddr - page.vaddr目标地址相对栈映射起始地址低位的偏移Stack Endpage.end - addr目标地址距离栈映射结束地址高位还有多少字节Stack Pointeraddr - sp目标地址相对当前$sp的偏移Frame Pointerframe - addr目标地址相对当前帧指针如$rbp/$fp的偏移Next Stack Canarynxt - addr目标地址之上、下一个栈 canary 的偏移各字段的实现细节值得注意Stack Top / Stack End依据的是vmmap中该栈映射的虚拟地址范围而非进程的逻辑栈顶概念因此这两个值刻画的是地址在栈这个内存区域内的高低位距离Stack Pointer直接读取pwndbg.aglib.regs.spFrame Pointer通过pwndbg.aglib.regs.read_reg(pwndbg.aglib.regs.frame)读取当前架构的帧指针寄存器x86-64 为$rbpARM64 为$fp等并且只有当时帧指针与目标地址位于同一 vmmap 映射时才会输出源码中先做frame_mapping查找再比较page.vaddr frame_mapping.vaddr避免在帧指针指向其他区域时给出误导性偏移Next Stack Canary的逻辑最有意思它先通过pwndbg.commands.canary.canary_value()拿到当前进程的全局栈 canary 值再用pwndbg.search.search()在当前线程的栈映射中搜索所有与该值相同的字节序列最后取大于目标地址的最小的一个输出该 canary 到目标地址的偏移。这相当于自动帮你在栈上定位下一道 canary对分析栈溢出利用链、理解缓冲区到 canary 的填充距离非常有用。canary 值的获取封装在 pwndbg/commands/canary.py其中包含 glibc 版本分支glibc 2.44 以下优先读取AT_RANDOM辅助向量更轻量2.44 及以上则从 TLS 中的stack_guard读取并在无法读取时返回None此时不输出 canary 相关行。内存映射文件场景xinfo_mmap_file详解当目标页的对象名是一个真实的文件路径is_memory_mapped_file为真即objfile非空且不以[开头见 pwndbg/lib/memory.py时命令调用xinfo_mmap_file()pwndbg/commands/xinfo.py输出该地址相对文件镜像的多种偏移输出行计算方式含义File (Base)addr - region_start相对该文件内存区域的加载基址的偏移RVAFile (Segment)addr - seg.p_vaddr相对包含该地址的 PT_LOAD 段的虚拟地址的偏移File (Disk)seg.p_offset (addr - seg.p_vaddr)该地址对应的磁盘文件字节偏移可用于换算 file offsetContaining ELF sectionsaddr - sec.sh_addr列出所有包含该地址的 ELF section 及其偏移File (Base)区域基址的确定region_start来自pwndbg.aglib.vmmap.addr_region_start()pwndbg/aglib/vmmap.py。该函数将region定义为由若干具有相同对象文件名且地址连续的内存映射拼接而成的连续区域。实现上先找到包含目标地址的映射再向前回溯所有objfile相同的相邻映射直到对象名变化为止若地址尚未被常规 vmmap 收录则会尝试pwndbg.aglib.vmmap_custom.explore()探索内存。当文件在内存中不连续时addr_region_start返回None命令会打印The file is not contiguous in memory.。File (Segment) 与 File (Disk)LOAD 段换算这两个字段依赖pwndbg.aglib.elf.get_containing_segments()pwndbg/aglib/elf.py通过 pyelftools 解析磁盘上的 ELF 文件并按加载基址重定位所有段地址过滤出p_type PT_LOAD且虚拟地址区间包含目标地址的段同时忽略无法识别段类型、以及非 LOAD 且无文件内容的段File (Segment)取第一个满足addr x_vaddr_mem_end的 LOAD 段计算addr - p_vaddrFile (Disk)取第一个满足addr x_vaddr_file_end的 LOAD 段计算p_offset (addr - p_vaddr)——这正是 ELF 加载映射的核心换算公式可以由此反推虚拟地址对应的磁盘文件偏移用于dd、readelf等工具进一步查看原始字节。Containing ELF sectionsSection 级定位最后命令调用pwndbg.aglib.elf.get_containing_sections()pwndbg/aglib/elf.py列出所有包含目标地址的 ELF section该函数只保留SHF_ALLOC置位即真正占用内存的 section再筛选sh_addr addr x_addr_mem_end的项逐行输出 section 名、地址和相对偏移。当二进制包含调试符号与 section 表时这一步能直接告诉你这个地址落在.text、.data、.got还是其他哪个 section 中对区分代码区与数据区、识别 GOT/PLT 跳转目标非常有价值。如果文件解析失败如远程调试时无法获取文件相关字段会以[not file backed]或空列表兜底不会中断命令执行。默认场景xinfo_default对于既不是栈、也不是文件映射的地址例如堆、匿名映射、[vdso]、[heap]等命令退回到xinfo_default()pwndbg/commands/xinfo.py仅输出一行Mapped Area 0x... 0x... 0x...即目标地址相对当前映射起始地址的偏移。这一行在几乎所有场景下都会出现栈场景中由更细分的 Stack Top/End 取代是理解这个地址在哪个映射里、离起点多远的最基本信息。应用场景与实战技巧结合xinfo的输出语义以下几个场景最能发挥其价值定位 PC 上下文直接执行xinfo省略参数即可查看当前执行地址相对代码段基址File (Base)与具体 section 的偏移等效于手动计算 RVA可用于快速判断$pc位于主程序、libc 还是某个共享库中再配合piebase或libcinfo换算模块基址栈溢出利用分析在栈上给定任意地址如缓冲区起始地址xinfo会一次性给出到栈顶、栈底、$sp、$rbp以及下一个 canary的距离省去反复telescope数偏移的步骤直接支撑填充多少字节能覆盖返回地址/绕过 canary的计算虚拟地址与文件偏移互转面对一个内存中的地址例如 ROP 链指向的 gadgetFile (Disk)直接给出对应的磁盘文件偏移Containing ELF sections则指出所属 section这两项对逆向分析、补丁分析、以及将地址换算为readelf可查的 file offset 非常关键快速确认映射归属输出第一段的Containing mapping行复用了与vmmap相同的内存页格式化逻辑见 pwndbg/lib/memory.py即使不看vmmap也能一眼确认地址所在区域的起止、权限与对象名。需要注意的是xinfo依赖进程运行时的寄存器与内存映射信息因此只适用于已启动并运行中的调试目标OnlyWhenRunning约束对于堆地址等匿名映射它提供的是映射内偏移而非 glibc 堆块元数据级别的信息后者应使用heap、bins等堆专用命令进一步分析。小结xinfo是一个信息密度极高的内存探查命令一次调用即可输出地址相对栈、帧指针、canary、文件加载基址、LOAD 段、磁盘偏移与 ELF section 的全套偏移关系。其实现贯穿了 pwndbg 的vmmap内存映射系统、elf段的解析封装与 canary 检测逻辑相关源码集中在 pwndbg/commands/xinfo.py、pwndbg/aglib/elf.py、pwndbg/aglib/vmmap.py既是日常调试的实用工具也是理解 pwndbg 内存抽象层如何协同工作的绝佳示例。在 GDB 或 LLDB 会话中对任意地址敲下xinfo往往比一连串手工换算更快地揭示该地址在进程地址空间中的真实位置。【免费下载链接】pwndbgExploit Development and Reverse Engineering with GDB LLDB Made Easy项目地址: https://gitcode.com/GitHub_Trending/pw/pwndbg创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表