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

GEF name-break 命令详解:为 GDB 断点命名,让 stripped 二进制调试不再“靠猜“

发布时间:2026/9/25 3:19:59 来源:云帆数科 栏目:资讯中心
GEF name-break 命令详解:为 GDB 断点命名,让 stripped 二进制调试不再“靠猜“
网络安全开发工具【免费下载链接】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 官方命令文档 name-break讲清name-break别名nb命令的完整语法、地址参数规则与真实输出效果并结合 GEF 主源码 中NamedBreakpoint断点类与extra上下文窗口的实现说明断点命中后名字如何被展示这一机制的底层调用链。读完后你可以在剥离符号stripped的二进制中高效管理多个断点并理解 GEF 上下文窗口的消息注入机制。解决什么问题多断点调试时的失忆困境调试 stripped 二进制时你经常需要在几个未知函数地址上下断点。原生 GDB 命中断点后只会告诉你Breakpoint 3, 0x400e0c而0x400e0c本身毫无语义。如果你同时挂着五六个断点每次命中都要回头翻info breakpoints才能想起这个地址我当时想验证什么。name-break就是为这个场景设计的给断点附加一个名字断点命中时该名字会出现在 GEF 上下文视图的extra窗口中让你对当前命中的断点一目了然。官方文档的原话是Every time this breakpoint is hit, the specified name will also be shown in theextrasection to make it easier to keep an overview when using multiple breakpoints in a stripped binary.命令语法与参数命令全名name-break别名nb。语法为name-break name [address]参数说明参数是否必需说明name是断点名称即命中后展示在extra窗口中的文字含空格时需用引号包裹如nb main func mainaddress否断点位置语义与原生break命令的地址表达式一致linespec、数值地址或显式位置均可缺省时断点设在当前指令指针$pc处文档中给出的官方示例可直接复制使用nb first *0x400ec0— 在0x400ec0处下断点并命名firstnb main func main— 在main符号处下断点并命名main func名称带空格加引号nb read_secret *main149— 地址支持偏移表达式断在main之后第 149 字节处nb check_heap— 省略地址参数在当前$pc处下断点最后一条省略地址的用法在边单步边定位时最顺手stepi走到感兴趣的指令后随手nb check_heap无需再敲地址。命中效果extra 窗口输出示例官方文档给出了完整的输出样例。注意extra分区的最后一行——断点位置与自定义名称并列展示名称以红粗色高亮─────────────────────────────────────────────────────────────────────────── code:x86:64 ──── 0x400e04 add eax, 0xfffbe6e8 0x400e09 dec ecx 0x400e0b ret → 0x400e0c push rbp 0x400e0d mov rbp, rsp 0x400e10 sub rsp, 0x50 0x400e14 mov QWORD PTR [rbp-0x48], rdi 0x400e18 mov QWORD PTR [rbp-0x50], rsi 0x400e1c mov rax, QWORD PTR fs:0x28 ───────────────────────────────────────────────────────────────────────────────── stack ──── 0x00007fffffffe288│0x0000: 0x0000000000401117 → movzx ecx, al ← $rsp 0x00007fffffffe290│0x0008: 0x00007fffffffe4b8 → 0x00007fffffffe71d → /ctf/t19/srv_copy 0x00007fffffffe298│0x0010: 0x0000000100000000 0x00007fffffffe2a0│0x0018: 0x0000000000000000 0x00007fffffffe2a8│0x0020: 0x0000000000000004 0x00007fffffffe2b0│0x0028: 0x0000000000000000 ───────────────────────────────────────────────────────────────────────────────── extra ──── [] Hit breakpoint *0x400e0c (check_entry) ──────────────────────────────────────────────────────────────────────────────────────────── gef➤同时可以看到完整的code与stack窗口照常渲染——name-break创建的断点是普通持久断点命中后 GEF 的整套上下文视图寄存器、堆栈、反汇编等全部生效。源码解析一命令入口与参数解析name-break命令的注册入口是 gef.py 中的NamedBreakpointCommandregister class NamedBreakpointCommand(GenericCommand): Sets a breakpoint and assigns a name to it, which will be shown, when its hit. _cmdline_ name-break _syntax_ f{_cmdline_} name [address] _aliases_ [ nb, ] _example f{_cmdline_} main *0x4008a9 parse_arguments({name: , address: *$pc}, {}) def do_invoke(self, _: list[str], **kwargs: Any) - None: args: argparse.Namespace kwargs[arguments] if not args.name: err(Missing name for breakpoint) self.usage() return NamedBreakpoint(args.address, args.name)从这段源码可以确认几个与文档一致且比文档更精确的实现事实$pc缺省值的实现方式parse_arguments({name: , address: *$pc}, {})装饰器把参数address的默认值设为字符串*$pc。也就是说未指定地址时断在当前位置是通过给地址表达式注入*$pc实现的而非在命令逻辑里单独判断空参。name 为空的校验若未提供名称命令会打印Missing name for breakpoint错误并回显用法与文档中name 是第一个必需参数的描述吻合。别名注册_aliases_ [nb]与文档中的 alias 说明对应。源码解析二断点对象与命中时的消息注入真正干活的是 gef.py 中继承自gdb.Breakpoint的NamedBreakpoint类class NamedBreakpoint(gdb.Breakpoint): Breakpoint which shows a specified name, when hit. def __init__(self, location: str, name: str) - None: super().__init__( speclocation, typegdb.BP_BREAKPOINT, internalFalse, temporaryFalse ) self.name name self.loc location return def stop(self) - bool: reset_all_caches() push_context_message( info, fHit breakpoint {self.loc} ({Color.colorify(self.name, red bold)}), ) return True逐点拆解temporaryFalse, internalFalse这是一个持久、对用户可见的断点会出现在info breakpoints列表中删除方式与原生断点相同delete N。stop()回调是命中时的全部行为先调用reset_all_caches()刷新 GEF 内部缓存保证上下文窗口读到的是最新状态随后把一条info级别的消息推入消息队列返回True表示停止执行。消息文本即你在extra窗口看到的[] Hit breakpoint *0x400e0c (check_entry)其中名称部分经过Color.colorify(self.name, red bold)处理呈现为红色粗体。消息如何进入 extra 窗口push_context_message是 GEF 提供给各功能模块的通用上下文消息注入机制定义在 gef.pydef push_context_message(level: str, message: str) - None: Push the message to be displayed the next time the context is invoked. if level not in (error, warn, ok, info): err(fInvalid level {level}, discarding message) return gef.ui.context_messages.append((level, message))消息被暂存进gef.ui.context_messages队列该列表在 UI 状态初始化时创建见 gef.py。渲染发生在context命令的extra分区——ContextCommand 的context_additional_information方法负责把队列中的消息按级别着色输出def context_additional_information(self) - None: if not gef.ui.context_messages: return self.context_title(extra) for level, text in gef.ui.context_messages: if level error: err(text) elif level warn: warn(text) elif level success: ok(text) else: info(text) return调用链总结nb name [address]→NamedBreakpointCommand.do_invoke→ 构造NamedBreakpoint→ 命中时stop()回调 →push_context_message入队 → 下一次context刷新时context_additional_information渲染extra窗口。这个机制也意味着任何 GEF 功能例如 use-after-free 检测等都可以借由push_context_message在extra窗口向用户提示信息name-break只是其中最先被用户感知的一个。测试用例验证仓库中 tests/commands/name_break.py 对该命令做了自动化验证值得注意的断言点def test_cmd_name_break(self): gdb self._gdb gdb.execute(start) res gdb.execute(nb foobar *main10, to_stringTrue) res gdb.execute(nb foobar *0xcafebabe, to_stringTrue) self.assertIn(at 0xcafebabe, res) res gdb.execute(start) gdb.execute(nb foobar, to_stringTrue)测试印证了两类行为其一nb foobar *0xcafebabe的下断输出包含 GDB 标准的Breakpoint ... at 0xcafebabe提示即NamedBreakpoint最终仍走 GDB 原生断点创建路径地址可以是任意表达式或裸地址其二不带地址的nb foobar在start停于$pc处之后可以正常执行即缺省地址路径无异常。测试基于 tests/base.py 的RemoteGefUnitTestGeneric远程 GDB 测试基类运行。实战工作流建议结合上述机制一个典型的 stripped 二进制调试工作流gef➤ vmmap/ 反汇编粗扫记下若干可疑地址逐一下具名断点名字用简短的功能假设例如nb auth_check *0x400a10nb key_xor *0x400b7cnb file_write *0x400d33gef➤ continue命中时extra窗口直接告诉你这是哪个断点无需info breakpoints对照对临时探索点用省略地址形式单步到指令处后nb probe配合delete清理。几点使用注意名称含空格必须加引号nb main func main否则参数会被切分第一个词成为 name、后续词被当作地址解析。地址语法与break完全一致linespecnb x main、显式地址nb y *0x400ec0、表达式偏移nb z *main149均可这是文档中明确的约束也与源码中直接把location透传给gdb.Breakpoint的构造方式一致。断点是持久的temporaryFalse不会命中一次后自动消失需要手动delete。extra 窗口依赖上下文输出开启extra分区由context命令渲染若你通过context相关配置关闭了自动上下文命中时的命名提示也会随之不显示此时仍可通过context手动触发一次渲染。小结name-break命令的功能边界很小——命名断点并在命中时展示名称——但它是 GEF 上下文优先调试理念的一个缩影把这个地址是干嘛的这一层语义从调试者的脑子里外置到断点对象上并借由push_context_messagecontext的extra窗口机制在每次命中时自动回显。源码层面它由 gef.py 的命令入口、gef.py 的断点回调和 gef.py 的消息队列三部分构成配合 tests/commands/name_break.py 的自动化测试行为完整可验证。在 CTF 与逆向场景中它是低成本、高回报的断点管理习惯。赞分享网络安全开发工具【免费下载链接】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 highlight 命令详解:为 GDB 调试输出自定义文本高亮的原理与实战GEF highlight 命令详解:为 GDB 调试输出自定义文本高亮的原理与实战 本文基于 GEF 仓库中的 highlight 命令文档 https://网络安全开发工具GEF context 命令详解在 GDB 中打造可定制的全景调试上下文视图GEF context 命令详解在 GDB 中打造可定制的全景调试上下文视图 GEFGDB Enhanced Features的 context 命令是其网络安全开发工具GEF aliases 命令深度解析为 GDB 打造 WinDBG/PEDA 风格命令习惯GEF aliases 命令深度解析为 GDB 打造 WinDBG/PEDA 风格命令习惯 本文以 GEF 的 aliases 命令文档为核心系统讲解 GE网络安全开发工具上一篇Fastboot Enhance终极Windows Fastboot工具箱与Payload解析工具全解析下一篇Reactide中的代码分割提升React应用加载速度创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

IronOS 开源焊台固件全解:设备支持矩阵、刷写流程与在机菜单系统的源码级剖析
IronOS 开源焊台固件全解:设备支持矩阵、刷写流程与在机菜单系统的源码级剖析

嵌入式固件硬件开发智能硬件 【免费下载链接】IronOS Open Source Soldering Iron firmware 项目地址: https://gitcode.com/gh_mirrors/ir/IronOS 点击查看 免费下载 本文以 IronOS 项目的文档索引 Documentation/index.md 为主体,系统梳理这款"智… · 2026/9/25 3:19:59

我用 Codex 从零做出一个“子弹撞木块”动力学仿真项目:VS Code、客户端与完整工作流实录
我用 Codex 从零做出一个“子弹撞木块”动力学仿真项目:VS Code、客户端与完整工作流实录

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

react-native-router-flux v3 核心特性演进解读:NavBar 自定义、状态刷新与场景管理
react-native-router-flux v3 核心特性演进解读:NavBar 自定义、状态刷新与场景管理

移动开发UI组件 【免费下载链接】react-native-router-flux The first declarative React Native router 项目地址: https://gitcode.com/gh_mirrors/re/react-native-router-flux 点击查看 免费下载 本篇围绕仓库 docs/CHANGELOG.md 记录的 v3 系列关键版本特性展… · 2026/9/25 3:19:59

华为CE8800密码过期警告处理:机制、操作与排查实战
华为CE8800密码过期警告处理:机制、操作与排查实战

上周远程登一台 CE8850 做季度巡检,SSH 连上去之后,屏幕上除了正常的版本信息,还多了一行格外扎眼的提醒:Warning: The password will expire in 21 days. The password needs to be changed, Continue? [Y/N]:干网络这一行&… · 2026/9/25 5:33:41

Atlas 300V部署YOLO全记录:从ONNX到OM的推理迁移实战
Atlas 300V部署YOLO全记录:从ONNX到OM的推理迁移实战

前阵子在客户现场折腾了一周,核心任务就一句话:把一张Atlas 300V 24G运算加速卡塞进服务器,把原本跑在GPU上的YOLO检测服务迁过去,还要保证1080P视频能实时出结果。这卡名字看着像显卡,但实际是专为AI推理设计的加速卡… · 2026/9/25 5:33:41

xberg C FFI 实战:用 force_ocr 强制对每一页 PDF 执行 OCR
xberg C FFI 实战:用 force_ocr 强制对每一页 PDF 执行 OCR

后端AI 应用NLP 【免费下载链接】xberg Polyglot document intelligence with a Rust core: extract text, metadata, images, tables, and structured data from 106 formats across 140 file extensions, plus code intelligence for 371 languages. Fifteen bindings, with … · 2026/9/25 5:33:41

docker-stacks 的 Lint 工作流实战:pre-commit 多工具检查与 Hadolint Dockerfile 规范落地
docker-stacks 的 Lint 工作流实战:pre-commit 多工具检查与 Hadolint Dockerfile 规范落地

云原生开发工具数据科学 【免费下载链接】docker-stacks Ready-to-run Docker images containing Jupyter applications 项目地址: https://gitcode.com/gh_mirrors/do/docker-stacks 点击查看 免费下载 本文基于 docs/contributing/lint.md 展开,介绍 … · 2026/9/25 5:33:41

Atlas 300V 24G推理卡实战:从ONNX到OM,高效部署YOLOv5/YOLOv8
Atlas 300V 24G推理卡实战:从ONNX到OM,高效部署YOLOv5/YOLOv8

1. 先搞清楚Atlas 300V到底是个什么卡1.1 一张加速卡的完整身份信息先说结论:Atlas 300V(尤其24G版本)是华为昇腾生态里的一款推理加速卡,不是训练卡,也不是普通的图形显卡。它基于昇腾310系列芯片(部分型号… · 2026/9/25 5:33:41

Docker快速入门:从环境一致性到生产就绪的实战路径
Docker快速入门:从环境一致性到生产就绪的实战路径

1. 为什么“Docker快速入门”不是一句空话,而是你今天必须动手的起点 我带过三届校招新人,也帮二十多家中小团队做过技术基建梳理。每次聊到容器化落地,总有人先叹气:“Docker太重了,学完还得配环境、调网络、写Docke… · 2026/9/25 5:33:35

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

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

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

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

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

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

了解更多?预约专属演示

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

企业微信二维码