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

GEF 逆向实战:用 pattern 命令基于 De Bruijn 序列定位溢出偏移量

发布时间:2026/9/25 7:32:55 来源:云帆数科 栏目:资讯中心
GEF 逆向实战:用 pattern 命令基于 De Bruijn 序列定位溢出偏移量
网络安全开发工具【免费下载链接】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 的pattern命令通过生成与搜索 De Bruijn德布鲁恩循环序列把猜偏移量变成一次可复制的查表操作先向目标程序灌入一段每个子串都唯一的填充串崩溃后读取被破坏的寄存器值再用搜索子命令反查出精确的字节偏移。本文以 pattern 命令文档 为核心结合 gef.py 中的实现源码与 tests/commands/pattern.py 测试用例完整讲解pattern create/pattern search的参数、底层算法与端到端使用流程。读完本文你将能够独立生成与 pwntools 完全兼容的 De Bruijn 序列理解 GEF 如何根据架构字长与字节序自动选择搜索方向掌握从崩溃寄存器值反推返回地址、栈指针偏移的完整工作流。1. De Bruijn 循环序列为什么它能唯一定位偏移pattern命令生成的字符串由大量互不重复的定长子串组成。以n4为例aaaabaaacaaadaaae...中任意连续 4 个字符都是唯一的——因此当这段字符串覆盖了某个缓冲区并在溢出后残留在寄存器中时只要读出寄存器里的 4 个字符就能在序列中反查出这 4 个字符起始位置的字节偏移即溢出点距离缓冲区首地址的距离。官方文档指出一个关键设计决策GEF 实现的算法与 pwntools 完全一致因此两侧工具生成的序列互为兼容崩溃后即使脱离 GDB 也可以把泄漏值贴进 pwntools 脚本求偏移from pwn import * p cyclic(128, n8)1.1 源码实现与 pwnlib 兼容的递归生成器生成逻辑位于 gef.pydef de_bruijn(alphabet: bytes, n: int) - Generator[int, None, None]: De Bruijn sequence for alphabet and subsequences of length n (for compat. w/ pwnlib). k len(alphabet) a [0] * k * n def db(t: int, p: int) - Generator[int, None, None]: if t n: if n % p 0: for j in range(1, p 1): yield alphabet[a[j]] else: a[t] a[t - p] yield from db(t 1, p) for j in range(a[t - p] 1, k): a[t] j yield from db(t 1, t) return db(1, 1) def generate_cyclic_pattern(length: int, cycle: int 4) - bytearray: Create a length byte bytearray of a de Bruijn cyclic pattern. charset bytearray(babcdefghijklmnopqrstuvwxyz) return bytearray(itertools.islice(de_bruijn(charset, cycle), length))从源码可以看出几个实现细节字母表固定为 26 个小写字母a-z即charset babcdefghijklmnopqrstuvwxyz这也是为什么泄漏值通常是aaaab...这类纯字母序列de_bruijn是一个惰性生成器按 DAWGDe Bruijn 序列标准构造法递归产出字符generate_cyclic_pattern再用itertools.islice截取所需的length字节因此生成任意长度的序列都不会一次性构造完整超串docstring 中明确标注 for compat. w/ pwnlib印证了与 pwntoolscyclic()的算法级兼容。2.pattern create生成并暂存序列2.1 语法与参数pattern create [-h] [-n N] [length]参数含义默认值length生成的序列总字节数配置项pattern.length默认1024-n N唯一子串的定长周期当前架构指针宽度gef.arch.ptrsizex86_64 为 832 位为 4默认长度来自命令自身注册的配置项——PatternCommand.__init__中self[length] (1024, Default length of a cyclic buffer to generate)见 gef.py可通过 GEF 的config机制持久化修改对应文档见 config 命令。2.2 运行示例gef➤ pattern create -n 4 128 [] Generating a pattern of 128 bytes (n4) aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaaxaaayaaazaabbaabcaabdaabeaabfaabgaab [] Saved as $_gef0执行流程对应 PatternCreateCommand.do_invoke解析length缺省读gef.config[pattern.length]与n缺省读gef.arch.ptrsize→ 调用generate_cyclic_pattern(length, n)生成字节串 → 打印明文 → 通过gef_convenience(pattern_str)存入一个GDB 便捷变量。2.3 便捷变量$_gef0溢出 payload 的搬运工gef_conveniencegef.py按$_gef0、$_gef1…… 的递增序号命名字符串值会被定义为形如$_gef0 aaaabaaac...的便捷变量。这个设计让 payload 的传递非常自然gef➤ pattern create 256 [] Generating a pattern of 256 bytes (n8) ... [] Saved as $_gef0 gef➤ set args $_gef0 gef➤ run在命令行直接引用$_gef0即可把整段循环序列作为目标程序的输入参数无需手动拷贝长字符串。3.pattern search从泄漏值反查偏移量3.1 语法与参数pattern search [-h] [-n N] [--max-length MAX_LENGTH] [pattern]search子命令在 De Bruijn 序列中查找给定pattern返回其偏移。参数说明参数含义默认值pattern待搜索的值GDB 符号如寄存器名、字符串或十六进制数无必填-n N子串定长应与pattern长度一致gef.arch.ptrsize--max-length搜索所覆盖的序列最大长度即假设溢出最多发生在前 N 字节内pattern.length默认 1024pattern search还有一个别名pattern offset源码中_aliases_ [pattern offset]见 gef.py语义上更直白地表达求偏移。源码中的参数校验值得注意PatternSearchCommand.do_invokemax_length args.max_length or gef.config[pattern.length] n args.period or gef.arch.ptrsize if n not in (2, 4, 8) or n gef.arch.ptrsize: err(Incorrect value for period)即-n只接受 2/4/8且不能超过当前架构指针宽度——这是为了保证子串长度 ≥ 泄漏值宽度时查表结果不产生歧义。3.2 三种输入形式与官方示例文档给出的三组示例覆盖了全部输入形式gef➤ pattern search 0x6161616161616167 [] Searching 0x6161616161616167 [] Found at offset 48 (little-endian search) likely [] Found at offset 41 (big-endian search) gef➤ pattern search $rbp [] Searching $rbp [] Found at offset 32 (little-endian search) likely [] Found at offset 25 (big-endian search) gef➤ pattern search aaaaaaac [] Searching for aaaaaaac [] Found at offset 16 (little-endian search) likely [] Found at offset 9 (big-endian search)三种形式分别对应十六进制值寄存器里读出的原始机器码GDB 符号直接传$rbp这类寄存器名GEF 会先gdb.parse_and_eval取值明文字符串直接粘贴泄漏的字符。4. 搜索原理小端/大端双向查找与 likely 标记PatternSearchCommand.search 的实现揭示了输出中little-endian / big-endian / likely三个词的由来def search(self, pattern: str, size: int, period: int) - None: # 1. check if its a symbol (like $sp or 0x1337) symbol safe_parse_and_eval(pattern) if symbol: addr int(abs(to_unsigned_long(symbol))) ... mask (1 (8 * period)) - 1 addr mask pattern_le addr.to_bytes(period, little) pattern_be addr.to_bytes(period, big) else: # 2. assume its a plain string pattern_be gef_pybytes(pattern) pattern_le gef_pybytes(pattern[::-1]) cyclic_pattern generate_cyclic_pattern(size, period) off cyclic_pattern.find(pattern_le) if off 0: ok(fFound at offset {off:d} (little-endian search) f{Color.colorify(likely, bold red) if gef.arch.endianness Endianness.LITTLE_ENDIAN else }) return off cyclic_pattern.find(pattern_be) ...可以归纳出四条机制符号优先解析先用safe_parse_and_eval尝试按 GDB 表达式求值。成功则按数值处理并用(1 8*period) - 1掩码只保留低n字节——因为 8 字节的$rbp值里可能混入非 pattern 的高位如 0x7ffd... 的栈地址只有低n字节落在循环序列上明文字符串则构造双字节序把字符串本身当大端字节串、反转后当小端字节串各自在序列中find先小端、后大端命中哪一端就报告哪一端并只报告第一个命中的方向所以输出里同时出现两行如 48 与 41是文档示例在不同场景下的组合展示实际单次运行按小端优先短路返回likely 由架构字节序决定当前架构是小端时小端命中行加粗红色标注likely大端架构则反之gef.py。这个提示告诉用户该结果与目标机器字节序一致可信度更高在跨字节序分析如远程调试时另一端的偏移同样有用。搜索所用的序列是按--max-length默认 1024与-n现场重新生成的——由于生成器确定性与 pwntools 兼容无需与pattern create时保存的$_gefN严格一致但两者参数保持一致才能覆盖真实 payload 长度如果实际 payload 有 2048 字节而搜索时max_length仍是默认 1024超过 1024 的偏移将显示 not found。5. 端到端工作流以 strcpy 溢出为例仓库自带的测试二进制 tests/binaries/pattern.c 就是一个标准的栈溢出靶场void greetz(char* buf) { char name[8] {0,}; strcpy(name, buf); // 8 字节缓冲无边界检查 printf(Hello %s\n, name); }tests/commands/pattern.py 中的自动化用例完整演示了标准工作流可直接照搬为手动调试步骤gef➤ file tests/binaries/pattern gef➤ pattern create 64 -n 4 [] Generating a pattern of 64 bytes (n4) aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaaxaaayaaazaab [] Saved as $_gef0 gef➤ set args aaaabaaacaaadaaaeaaafaaagaaahaaa gef➤ run # 在 strcpy 崩溃点断住后查看 $rbp gef➤ pattern search -n 4 $rbp [] Found at offset 8 (little-endian search) likely测试用例 test_cmd_pattern_search 在不同架构下验证了相同偏移结论x86_64 上-n 4搜索$rbp期望得到 offset 8即 8 字节缓冲name之后恰好是保存的帧指针-n 8搜索同样期望 832 位 i686 因栈布局不同期望 16。用例最后还断言了搜索不存在模式JUNK时输出 not found 的分支tests/commands/pattern.py。得到 offset 后的典型利用动作是偏移 4/8 覆盖saved rbp后ret地址的起始位置从而精确控制返回地址。5.1 与 pwntools 联合使用的注意事项由于算法兼容同一泄漏值可以离线复算from pwn import * offset cyclic_find(baaaag\x00\x00\x00, n4) # 注意字节序与 n 必须与 GEF 端一致需要保持两侧n周期一致GEF 端-n 4对应 pwntools 端n4若一侧用 8 另一侧用 4偏移结果会完全不同。文档示例p cyclic(128, n8)即与pattern create -n 8 128一一对应。6. 小结命令作用关键默认值pattern create [-n N] [length]生成 De Bruijn 序列并存入$_gefNlength1024pattern.lengthn架构指针宽度pattern search [-n N] [--max-length L] [pattern]在序列中反查偏移别名pattern offsetn架构指针宽度max-length1024GEF 的pattern命令把缓冲区溢出分析中偏移计算这一环节封装成了两步操作且其 De Bruijn 生成器与 pwntools 保持算法级兼容见 gef.py 的de_bruijn与generate_cyclic_pattern。配合$_gefN便捷变量传参、寄存器直接作为搜索参数、小/大端双向查找与字节序 likely 提示它构成了从 payload 注入到偏移反查的闭环。理解-n与max-length两个参数如何共同决定搜索空间是避免 not found 假阴性的关键。赞分享网络安全开发工具【免费下载链接】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点击查看免费下载相关推荐pwntools cyclic 模块详解De Bruijn 序列生成、偏移定位与 Metasploit 模式pwntools cyclic 模块详解De Bruijn 序列生成、偏移定位与 Metasploit 模式 pwnlib.util.cyclic 是 pwn网络安全渗透测试逆向工程ESP-DL实战教程在ESP32上部署YOLO11n目标检测模型ESP DL实战教程在ESP32上部署YOLO11n目标检测模型 ESP DLEspressif deep learning library是乐鑫科技推出人工智能推理引擎嵌入式pwndbg 的 hi 命令堆地址归属快速定位与 malloc_chunk 逆向解析实战pwndbg 的 hi 命令堆地址归属快速定位与 malloc_chunk 逆向解析实战 导读 hi 是 pwndbg 面向 glibc ptmalloc2逆向工程调试器应用安全开发工具上一篇【免费下载】 探索Tikhonov正则化与L曲线MATLAB代码资源推荐【matlab下载】下一篇Matrix-Game-3.0开发者指南自定义动作控制与模型微调教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

【windows】安装抓包工具Burp Suite 2024_10激活汉化
【windows】安装抓包工具Burp Suite 2024_10激活汉化

【windows】安装抓包工具Burp Suite 2024&激活&汉化 前言 在项目即将上线阶段,迈入生产环境之际,确保其安全性成为我们不可忽视的首要任务。为筑起一道坚不可摧的安全防线,我们借助业界公认的网络安全利器——Burp Suite,… · 2026/9/25 7:32:55

AI Agent工具链实战:CLI、MCP与OpenRouter集成指南
AI Agent工具链实战:CLI、MCP与OpenRouter集成指南

1. 从"treg"这个模糊词说起:它到底指什么第一次看到"treg"这个词,很多人会一头雾水。它不像"codex cli"或者"openrouter"那样有明确的指向,更像是一个被截断的缩写或者内部代号。结合热搜词里高频出… · 2026/9/25 7:32:49

Windows内核非分页池泄漏诊断:PoolMon与RAMMap实战指南
Windows内核非分页池泄漏诊断:PoolMon与RAMMap实战指南

1. 这不是“内存不足”,是内核在悄悄吃掉你的RAM 你有没有遇到过这种情况:刚重启的 Windows 11,任务管理器显示“已使用内存”只有 3GB,但系统却卡得像在用软盘加载高清视频?打开 Chrome 多几个标签页,内存… · 2026/9/25 7:32:49

全国省市区三级联动表:MySQL导入与查询实战指南
全国省市区三级联动表:MySQL导入与查询实战指南

简介:这份资源是2024年最新整理的MySQL全国省市区三级联动数据表,面向后端开发、数据库设计人员以及需要地址级联选择功能的前端工程师,可解决地理信息查询与行政区域联动维护的问题。压缩包共2个文件,以sql数据脚本和zip归档为主… · 2026/9/25 7:54:52

可复用回归预测系统骨架:6类模型统一接口实践
可复用回归预测系统骨架:6类模型统一接口实践

简介:本资源是一套面向机器学习初学者与进阶实践者的预测建模综合代码包,覆盖贝叶斯网络、马尔科夫模型、线性回归、岭回归、多项式回归、决策树回归及深度神经网络七大主流预测方法,适用于时间序列预测、房价估算、用户行为建模等典型场景。… · 2026/9/25 7:54:34

Atlas 300V部署YOLOv5/YOLOv8:从ONNX到OM全流程
Atlas 300V部署YOLOv5/YOLOv8:从ONNX到OM全流程

先交代一下背景。不少人在搜“atlas部署yolo”和“atlas 300v 24g 是运算加速卡吗”这类词,说实话,这两个问题指向的是同一件事:你想在昇腾Atlas平台上面把YOLO检测模型跑起来,但不确定这块卡到底能不能干这个活、干起来麻不麻烦。… · 2026/9/25 7:54:28

OpenCodex Windows 服务控制台窗口问题全解析:从根因调查到“无窗口后台服务“的完整修复路径
OpenCodex Windows 服务控制台窗口问题全解析:从根因调查到“无窗口后台服务“的完整修复路径

【免费下载链接】opencodex Universal provider proxy for OpenAI Codex & Claude Code — use any LLM (Claude, Gemini, Grok, DeepSeek, Ollama…) with Codex CLI, App, SDK, and Claude Code 项目地址: https://gitcode.com/gh_mirrors/ope/opencodex 点击… · 2026/9/25 7:54:28

Atlas 300V 24G部署YOLO全流程:从环境搭建到推理调优
Atlas 300V 24G部署YOLO全流程:从环境搭建到推理调优

如果你最近在搞AI推理,肯定绕不开"Atlas"这个名字。特别是Atlas 300V 24G这张卡,网上问得最多的一句就是:它到底是不是运算加速卡?答案是肯定的——这是一张标准的专用AI推理加速卡,24GB显存,专为… · 2026/9/25 7:54:28

深度拆解iMessage附件后门及辅助模块的完整分析链路
深度拆解iMessage附件后门及辅助模块的完整分析链路

我最早接触“三角测量”(Triangulation)这个代号,是在处理一部iPhone异常发热、流量飙升的排查任务里。查了一整天日志,最后在一个不显眼的iMessage消息附件目录里翻出了一个伪装成图片的二进制文件,当时就觉得不对劲。… · 2026/9/25 7:54:22

数值优化(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

了解更多?预约专属演示

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

企业微信二维码