首页/新闻资讯/正文详情

GEF 的 `$_bss()` 便捷函数:在 GDB 调试中精准定位 BSS 段基地址

发布时间:2026/9/26 2:58:14 来源:云帆数科 栏目:资讯中心
GEF 的 `$_bss()` 便捷函数:在 GDB 调试中精准定位 BSS 段基地址
网络安全开发工具【免费下载链接】gefGEF (GDB Enhanced Features) - a modern experience for GDB with advanced debugging capabilities for exploit devs reverse engineers on Linux项目地址https://gitcode.com/gh_mirrors/gef/gef点击查看免费下载导读GEFGDB Enhanced Features为 GDB 提供了一组以$_开头的便捷函数convenience functions用于在调试会话中快速获取进程内存布局的关键地址。$_bss()正是其中之一它返回当前调试进程 BSS 段未初始化数据段的基地址并允许附加一个可选偏移量。本文以 docs/functions/bss.md 为主线结合 gef.py 的源码实现与 tests/functions/elf_sections.py 的测试用例完整讲解$_bss()的语法、行为约束、底层原理与实战用法帮助你将其用于堆利用、PIE 地址解算、内存读写等逆向与漏洞利用场景。一、函数速览语法与核心语义根据 docs/functions/bss.md$_bss()的完整定义如下Return the current BSS base address plus the given offset.语法$_bss([offset])关键语义返回值当前调试进程的 BSS 段基地址加上传入的可选偏移量后得到最终地址offset 为可选参数省略时等价于$_bss(0)返回 BSS 段基地址本身会话要求必须处于活跃的调试会话中进程已运行、或处于 core 调试等有目标进程的场景否则调用会失败。最小示例gef➤ p $_bss(0x20)该命令会计算BSS 基地址 0x20并打印结果可用于直接访问 BSS 段内偏移0x20处的符号或数据。二、函数注册机制GEF 便捷函数是如何接入 GDB 的要理解$_bss()先要明白 GEF 如何把自定义函数注册进 GDB。在 gef.py 中所有便捷函数都继承自抽象基类GenericFunction见 gef.pyclass GenericFunction(gdb.Function): This is an abstract class for invoking convenience functions, should not be instantiated. _function_: str _syntax_: str _example_: str def __init__(self) - None: super().__init__(self._function_) def invoke(self, *args: Any) - int: if not is_alive(): raise gdb.GdbError(No debugging session active) return self.do_invoke(args) def arg_to_long(self, args: Any, index: int, default: int 0) - int: try: addr args[index] return int(addr) if addr.address is None else int(addr.address) except IndexError: return default def do_invoke(self, args: Any) - int: raise NotImplementedError该机制的关键点有三GDB 原生钩子GenericFunction直接继承gdb.Function在初始化时以_function_的名字例如_bss调用super().__init__()GDB 便会自动注册一个名为$_bss的便捷函数会话活跃性检查基类统一在invoke()中调用is_alive()实现见 gef.py通过gdb.selected_inferior().pid 0判断是否存在运行中的 inferior进行前置校验若没有活跃调试会话直接抛出gdb.GdbError(No debugging session active)——这正是原文档注释 a debugging session must be active 的底层来源参数解析arg_to_long()负责把 GDB 传入的参数统一转换为整数支持直接整数或带地址对象的参数当参数缺失IndexError时返回默认值 0这保证了$_bss()与$_bss(0x20)两种调用方式都能正常工作。三、$_bss()的源码实现从函数名到 BSS 基地址$_bss()的具体实现位于 gef.pyregister class BssBaseFunction(GenericFunction): Return the current bss base address plus the given offset. _function_ _bss _syntax_ f${_function_}([OFFSET]) _example_ deref $_bss(0x20) def do_invoke(self, args: list) - int: base get_zone_base_address(.bss) if not base: raise gdb.GdbError(BSS not found) return self.arg_to_long(args, 0) base核心逻辑只有两步解析 BSS 段基地址调用get_zone_base_address(.bss)叠加偏移量将可选参数默认 0加到基地址上返回。其中get_zone_base_address()的定义在 gef.pylru_cache() def get_zone_base_address(name: str) - int | None: zone file_lookup_name_path(name, get_filepath()) return zone.zone_start if zone else None它会根据当前正在调试的可执行文件路径在 GDB 的info files输出中检索名为.bss的内存区域返回其起始地址zone_start。file_lookup_name_path()见 gef.py遍历get_info_files()得到的 Zone 列表按“文件名 区域名”双重匹配定位目标区域get_filepath()见 gef.py则返回当前调试目标的本地绝对路径且在远程调试场景下会自动回退到远端文件在本地缓存路径gef.session.remote.lfile。需要特别留意的是这两处查找函数都被lru_cache()装饰——也就是说基地址查找结果会被缓存在调试会话的地址空间未发生重映射如exec新的镜像时无需重复解析性能开销极小。与其他$_函数的定位区别$_bss()并非孤立存在它与 GEF 的其余便捷函数构成一套“取基址”工具族便于在 PIE 化场景下计算任意地址函数作用实现位置$_bss([offset])当前可执行文件 BSS 段基地址 偏移gef.py$_base([filepath])指定文件默认当前文件加载基地址 偏移gef.py$_got([offset])当前文件 GOT 段基地址 偏移gef.py$_heap([offset])堆基地址 偏移gef.py$_stack([offset])栈区基地址 偏移gef.py从源码结构看_got与_bss共用get_zone_base_address()查找路径只是传入的段名不同而_heap、_stack则走gef.heap.base_address或get_section_base_address()按页边界对齐见 gef.py。理解这层差异有助于你判断不同场景下该信任哪个函数的返回值。四、行为边界与约束条件4.1 必须存在活跃调试会话由于GenericFunction.invoke()的统一前置检查在未启动目标程序进程不存在时调用$_bss()会直接报错[*] No debugging session active这一点在 tests/utils.py 中被定义为标准错误消息常量ERROR_INACTIVE_SESSION_MESSAGE并在 tests/functions/elf_sections.py 的测试用例中做了正向与负向双重验证def test_func_bss(self): $_bss() GDB function test gdb self._gdb cmd deref $_bss() self.assertEqual( ERROR_INACTIVE_SESSION_MESSAGE, gdb.execute(cmd, to_stringTrue) ) gdb.execute(run) res gdb.execute(cmd, to_stringTrue) self.assertIn(Hello world!, res)测试先用deref $_bss()确认无会话时报错随后run启动目标进程后再次调用并通过deref成功解引用到 BSS 中存放的Hello world!字符串——验证了$_bss()解析出的地址确实指向 BSS 段内可读数据。4.2 找不到 BSS 段时抛错如果目标镜像不存在.bss段某些极简二进制或特殊加载场景do_invoke会抛出gdb.GdbError(BSS not found)此时 GDB 会将错误透传给用户。正常 ELF 可执行文件与共享库通常都包含.bss段因此该分支属于防御性兜底。4.3 偏移量语义偏移量的单位是字节$_bss(0x20)即基地址加 32 字节。偏移可以省略、为 0、为负向 BSS 起始地址之前偏移通常用于访问邻近的只读数据区但需自行确认页权限。GEF 不会对偏移做范围校验实际可读性由目标内存映射决定超出映射范围时deref等命令会报内存访问错误。五、实战用法BSS 段在漏洞利用中的典型场景5.1 结合deref直接读取/查看 BSS 数据原文档给出的官方示例就是与deref配合gef➤ deref $_bss(0x20)deref会从给定地址开始连续解引用内存并格式化打印非常适合在 BSS 段内定位全局变量链或堆指针。你也可以省略偏移从 BSS 起点开始查看gef➤ deref $_bss()5.2 与p配合获取精确地址需要拿到数值型地址参与后续计算时直接使用pgef➤ p $_bss(0x20) $1 0x555555558120这个地址可以直接用作x、set、watch、break等 GDB 命令的参数例如gef➤ x/gx $_bss(0x20) gef➤ watch $_bss(0x20)5.3 PIE 化场景下的地址换算开启 PIE 的二进制每次加载基址都不同而 BSS 段位于可执行文件镜像内其运行时地址 镜像加载基址 BSS 段的相对偏移。$_bss()直接给出运行时 BSS 地址无需手动记录加载基址再换算配合$_base()使用可在脚本或条件断点中快速定位任意全局符号位置。5.4 在 GDB 脚本/条件断点中做动态计算由于$_bss()是 GDB 原生便捷函数可以嵌入条件断点或命令脚本。例如在访问 BSS 内特定偏移的写入时触发断点gef➤ break *$_bss(0x100) gef➤ commands x/16gx $_bss() continue end需要注意便捷函数在目标进程尚未加载时不可用见 4.1因此此类断点/命令应在run或start之后设置。六、测试与验证仓库如何保证$_bss()正确性GEF 仓库对$_bss()提供了自动化回归测试位于 tests/functions/elf_sections.py配套的测试二进制是 tests/binaries/bss.cchar msg[0x100]; int main(int argc, char** argv, char** envp) { strncpy(msg, Hello world!, sizeof(msg)); DebugBreak(); return EXIT_SUCCESS; }该二进制刻意声明了一个 0x100 字节的未初始化全局数组msg——它正是存放在 BSS 段中的典型符号。测试流程为未运行进程时调用deref $_bss()断言输出[*] No debugging session activerun启动进程再次调用deref $_bss()断言输出中包含Hello world!。这从行为上验证了两个关键事实$_bss()返回的地址确实落在存放msg的 BSS 段内且该段内数据可被正确解引用读取。除此之外GEF 的 tests/commands/patch.py 也以bss为调试目标间接表明 BSS 是补丁patch等内存修改功能的常见实验区域。七、总结要点结论语法$_bss([offset])offset 可选单位字节返回值当前可执行文件 BSS 段运行时基地址 偏移前置条件必须存在活跃调试会话进程已运行典型用法deref $_bss(0x20)、p $_bss()、断点地址动态计算底层实现BssBaseFunction.do_invoke()→get_zone_base_address(.bss)→file_lookup_name_path()错误行为无会话报No debugging session active无 BSS 段报BSS not found$_bss()是 GEF 提供的极简而实用的地址辅助函数一条命令即可将符号层面的“BSS 段”概念落地为可直接参与计算的运行时地址。结合 docs/functions 目录下的$_base()、$_got()、$_heap()、$_stack()等兄弟函数你可以在逆向分析与漏洞利用工作中构建一套完整的“运行时内存布局快速寻址”工作流。若想深入了解函数族全貌可运行 GEF 内置的functions命令实现见 gef.py查看所有便捷函数的语法与示例或直接查阅 docs/api/gef.md 获取更多 GDB 自动化能力。赞分享网络安全开发工具【免费下载链接】gefGEF (GDB Enhanced Features) - a modern experience for GDB with advanced debugging capabilities for exploit devs reverse engineers on Linux项目地址https://gitcode.com/gh_mirrors/gef/gef点击查看免费下载相关推荐GEF 便捷函数 $_stack()在 GDB 中精确获取栈基址与偏移寻址GEF 便捷函数 $_stack 在 GDB 中精确获取栈基址与偏移寻址 $_stack 是 GEFGDB Enhanced Features提供的一类网络安全开发工具GEF 中的 $_base() 函数在 GDB 会话中精确定位模块基址GEF 中的 $_base 函数在 GDB 会话中精确定位模块基址 导读 $_base 是 GEFGDB Enhanced Features为 GDB 提网络安全开发工具GEF functions 命令详解用 $_base/$_bss/$_got/$_heap/$_stack 便捷函数动态计算调试地址GEF functions 命令详解用 $_base/$_bss/$_got/$_heap/$_stack 便捷函数动态计算调试地址 GEF 除了提供 vmm网络安全开发工具上一篇Teleport 基于路径的 Kubernetes 访问路由非证书路由从 KubernetesCluster 属性到 /v1/teleport 路径前缀的设计与实践下一篇godot-demo-projects 上手指南3 条路径带你从 0 做出可玩 Demo创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

The Concise TypeScript Book:深入解析 TypeScript 字面量类型(Literal Types)——从单元素集合到可辨识联合
The Concise TypeScript Book:深入解析 TypeScript 字面量类型(Literal Types)——从单元素集合到可辨识联合

文档教程 【免费下载链接】typescript-book The Concise TypeScript Book: A Concise Guide to Effective Development in TypeScript. Free and Open Source. 项目地址: https://gitcode.com/gh_mirrors/typ/typescript-book 点击查看 免费下载 字面量类型&#x… · 2026/9/26 2:58:14

【关注可白嫖源码】--课程设计+毕业设计+springboot学生心理素质管理APP[编号:project20702](案例分析)
【关注可白嫖源码】--课程设计+毕业设计+springboot学生心理素质管理APP[编号:project20702](案例分析)

本文仅展示核心实现逻辑与部分代码片段,完整项目源码、配套文档、数据库脚本内容较多,篇幅有限无法全部放出。 有需要完整资源的同学,可以在评论区留言【资料或领源码】,我会一 一回复站内私信,发送完整文件 目录 摘 … · 2026/9/26 2:58:14

Kata Containers 之 dbs-pci crate 深度解析:轻量级 VMM 中的 PCI 设备模拟与直通框架
Kata Containers 之 dbs-pci crate 深度解析:轻量级 VMM 中的 PCI 设备模拟与直通框架

云原生容器运行时 【免费下载链接】kata-containers Kata Containers is an open source project and community working to build a standard implementation of lightweight Virtual Machines (VMs) that feel and perform like containers, but provide the workload isolat… · 2026/9/26 2:58:08

RPA选型总烂尾?三大根源与泛微千里聆适用边界全解析
RPA选型总烂尾?三大根源与泛微千里聆适用边界全解析

先说我这些年在企业里看到的RPA项目,十个里有六七个是“选型那一刻就注定要烂尾”的。不是因为产品不行,而是很多企业把RPA选型当成了一次普通软件采购——看演示、比价格、谈商务,却完全没想清楚自己要解决什么问题、现有系统长什么样、未来… · 2026/9/26 3:33:39

MySQL8.0定时删除数据实战:Event Scheduler与分批清理大表日志
MySQL8.0定时删除数据实战:Event Scheduler与分批清理大表日志

先说个真实场景。我去年接手一套订单系统的时候,发现一张操作日志表在半年内从不到1GB涨到了近30GB。业务方最初说“日志不删也不影响主流程”,直到某天大促脚本在凌晨跑批卡了十几分钟,磁盘IO被日志表的数据文件打到接近100%,清理… · 2026/9/26 3:33:27

S004H-基于STM32智能门禁系统(密码、指纹、蓝牙)【Proteus仿真+Keil程序+原理图】
S004H-基于STM32智能门禁系统(密码、指纹、蓝牙)【Proteus仿真+Keil程序+原理图】

☆、设计硬件组成:STM32单片机最小系统4*4矩阵键盘AS608指纹识别模块HC-05蓝牙模块OLED液晶显示继电器蜂鸣器红色LED灯; 1、本设计采用STM32F103C8T6单片机作为主控芯片; 2、实时显示:通过OLED液晶显示屏实时显示操作信息&#… · 2026/9/26 3:33:27

Snail-Job:简介、原理、实战
Snail-Job:简介、原理、实战

概述 官网,Java实现、开源(Gitee,3.6K Star,652 Fork;GitHub,822 Star,112 Fork)灵活,可靠和快速的分布式任务重试和分布式任务调度平台。在线体验地址,登录… · 2026/9/26 3:33:21

刷短视频越刷越累?从注意力消耗到戒断方案,找回生活主动权
刷短视频越刷越累?从注意力消耗到戒断方案,找回生活主动权

每天刷5小时抖音,听起来像句玩笑,但我身边真的有人做到了,而且一刷就是大半年。更可怕的是,刷之前他们觉得“这是在休息”,刷完之后却经常皱着眉头说“好累,什么都没干”。标题里我用“精神自残”这四个字&… · 2026/9/26 3:33:15

NCM转MP3原理与实战:ncmdump本地解密全指南
NCM转MP3原理与实战:ncmdump本地解密全指南

1. 项目概述:为什么一个“NCM转MP3”的工具能引发全网搜索狂潮?你有没有过这样的经历:在网易云音乐里反复单曲循环一首歌,收藏夹里存了上百首“仅限APP内播放”的歌曲,某天想把它们导进车载音响、传到老式MP3播放器、或… · 2026/9/26 3:33:15

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21

OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40

向下兼容与向上兼容:接口设计中的兼容性策略与工程实践
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践

一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码