GDB怎么调试buffer overflow

夜杰吖_3171

夜杰吖_3171

2026-09-13

168人浏览

原创

用gdb定位buffer overflow崩溃点:先加-g -fno-stack-protector编译,启动gdb后在疑似函数设断点,运行并用p &buffer和x/16xb查看内存,崩溃后立即bt;若触发stack smashing,可用watch $rbp-8捕获canary被改瞬间,并结合x/4wx $rbp检查返回地址是否被覆盖为用户数据。

gdb怎么调试buffer overflow

怎么用GDB定位buffer overflow的崩溃点

直接运行崩溃程序后在GDB里看backtrace,基本就能锁定溢出发生在哪个函数、哪行代码。关键不是“能不能跑起来”,而是“崩溃时栈帧是否还完整”——如果__stack_chk_fail被触发,说明canary已被破坏,但函数返回前的栈布局通常尚可分析。

常见错误现象:Segmentation fault*** stack smashing detected *** 后直接退出,没打印调用栈;这时必须加-g重新编译,并确保没开-O2等优化(优化会打乱变量布局,让buffer地址难追踪)。

  • 编译命令必须带-g -fno-stack-protector(禁用canary)或-fstack-protector(保留canary用于观察)
  • 启动GDB后先b func(在疑似溢出函数入口设断点),再r运行,输入触发数据
  • 停住后用p &buffer拿到缓冲区起始地址,再用x/16xb &buffer查看原始内存内容
  • 继续c直到崩溃,立刻执行backtrace,对比两次$rsp$rbp值是否异常跳变

为什么x/4wx $rbpinfo registers更有用

因为buffer overflow的本质是往栈上写超了,覆盖了保存的%rbp或返回地址。只看寄存器快照抓不到“被覆盖的过程”,但用x/4wx $rbp能直观看到$rbp下方8字节(x86_64下返回地址位置)是否已被污染成非地址值(比如全是0x90909090或用户输入的ASCII码)。

使用场景:你在strcpy(buffer, str)后立刻执行x/4wx $rbp,发现$rbp+8处的值变成0x61616161(即"aaaa"),就确认str至少写了4字节进返回地址区域。

  • x/4wx $rbp显示的是[%rbp]开始连续4个4字节单元(共16字节),其中$rbp+8就是返回地址存储位
  • 若用x/8wx $rbp-16,能同时看到buffer末尾、saved %rbp、return address三段,更利于判断溢出长度
  • 注意32位和64位下偏移不同:x86_64中返回地址在$rbp+8,x86中在$ebp+4

如何用watch捕获canary被修改的瞬间

当程序报__stack_chk_fail但你不知道谁动了canary时,watch是唯一能精准卡住“第一现场”的方法。canary在函数prologue里从%fs:0x28读出并存到$rbp-8(x86_64),所以观察这个地址即可。

GDB 16.2
GDB 16.2

GDB 16.2 GNU 官方历史源码发布包,适合旧项目兼容、复现调试环境、排查版本差异和在 Unix-like 系统中自行构建。

下载

容易踩的坑:用watch *(char*)$rbp-8会失败——GDB不支持寄存器参与地址计算的动态表达式;必须先算出具体地址再下观察点。

  • 先在函数内断住,执行p/x $rbp - 0x8得到canary地址(如0x7fffffffe4a8
  • 再执行watch *(char*)0x7fffffffe4a8(硬件观察点,开销小)
  • 然后c,GDB会在任意指令向该地址写入时中断,x/i $rip就能看到是哪条movstrcpy干的
  • 若提示“Could not insert hardware watchpoint”,说明目标地址不在可写内存页,换用watch *(char*)0x7fffffffe4a8 - 1扩大范围再试

为什么disass func要配合x/2i $rip看汇编

源码里一行strcpy(buffer, str)实际对应多条汇编指令,而溢出可能发生在其中某条内存写操作上(比如mov %rax,(%rdx))。只看disass输出无法知道当前执行到哪一指令,必须结合$rip实时定位。

性能影响:x/2i $rip只反汇编当前指令和下一条,比disass全函数快得多,适合单步时快速确认上下文。

  • strcpy调用前断住,用disass strcpy确认它是否是glibc的优化版本(如__strcpy_sse2),这会影响溢出行为
  • 单步进入strcpy后,每按一次n就执行x/2i $rip,观察%rdi(dst)和%rsi(src)寄存器值是否开始越界
  • 若看到mov %rsi,%rdi之后mov (%rsi),%almov %al,(%rdi)循环,说明正逐字节拷贝,此时info reg rsi rdi能帮你预判第几轮会溢出

真实调试中,最易被忽略的是栈地址每次运行都变(ASLR开启时),而很多人记下第一次p &buffer的地址后,第二次就直接x/16xb 0x7fffffffe424硬查——结果什么也看不到。必须每次重新p &buffer,或干脆用watch绕过地址不确定性。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
overflow什么意思
overflow什么意思

overflow是一个用于控制元素溢出内容的属性,当元素的内容超出其指定的尺寸时,overflow属性可以决定如何处理这些溢出的内容。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.08.15

3120

3

AI视频生成软件推荐
AI视频生成软件推荐

本专题汇总了当前主流的AI视频生成软件推荐与排行榜单,涵盖seko、AniShort、剧云、Lovart、LiblibAI及立刻mv等热门工具。同时整理了各软件在文生视频、图生视频、时长限制、画质表现及免费额度等方面的差异对比,助您快速选对适合创作需求的AI视频生成工具。

2026.09.16

160

9

ai生成视频的工具免费版合集
ai生成视频的工具免费版合集

本专题汇总了当前免费AI生成视频工具的排行榜与推荐清单,涵盖seko、讯飞智作、AniShort及剧云、Lovart等多模型集成平台。同时整理了各工具的免费额度、输出时长、水印政策及适用场景差异,助您快速选择合适工具开启AI视频创作。

2026.09.16

60

10

Pandas时间序列分析与可视化报表
Pandas时间序列分析与可视化报表

本专题整理Pandas日期转换、时间索引、重采样、滚动窗口、时区处理、plot绘图、Styler表格样式和报表输出方法。

2026.09.16

60

23

Pandas数据筛选索引与清洗处理
Pandas数据筛选索引与清洗处理

本专题整理Pandas中的loc、iloc、条件筛选、query查询、缺失值处理、重复值删除、类型转换和字符串列清洗方法。

2026.09.16

40

25

Pandas数据读取导入与文件导出处理
Pandas数据读取导入与文件导出处理

本专题整理Pandas读取CSV、Excel、JSON、SQL、Parquet等文件的方法,以及to_csv、to_excel、to_sql和to_parquet等常用数据导出流程。

2026.09.16

40

27

GDB怎么设置断点
GDB怎么设置断点

本专题介绍GDB按照函数名、源代码行号和文件位置设置断点的方法,详细说明run、continue、next、step等命令的配合使用,帮助定位程序崩溃、逻辑异常及代码未按预期执行的问题。

2026.09.11

360

28

GDB怎么查看变量值
GDB怎么查看变量值

本专题介绍GDB调试过程中查看变量值的具体方法,涵盖局部变量、函数参数、数组、结构体和指针内容查询,同时整理变量持续显示、格式化输出及无法读取变量时的排查思路。

2026.09.11

120

22

GDB C++程序怎么调试
GDB C++程序怎么调试

本专题围绕GDB调试C++程序的实际过程,详细说明程序编译、调试器启动、命令行参数传入、断点命中和程序继续运行等步骤,并介绍条件断点、临时断点和观察点的设置方法,方便开发者跟踪复杂代码的执行状态。

2026.09.11

140

20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133万人学习