利用两个小demo理解汇编代码排查内存溢出问题

2023-10-31

利用两个小demo理解汇编代码排查内存溢出问题 icon-default.png?t=M85Bhttps://www.cnblogs.com/liuchuanloong/articles/16925695.html

【背景】

近日处理现场问题时遇到了踩内存导致的崩溃问题,然而个人对反汇编程序执行过程不熟悉,通过查阅资料,对比分析两个小demo理解汇编代码踩内存的分析。

【基础】

对于反汇编过程,首先需要理解的是寄存器。以64位寄存器rax为例,其中0到31就是平常分析32位程序是常见的eax,0到15则是ax,而ah和al则分别是8到15和0到7。其中rax常用来做存储返回值的寄存器,rdi,rsi,rdx,rcx,r8,r9常用作函数的参数传递寄存器,分别对应函数的第1~6个参数,rbp、rsp、rip分别对应栈基、栈顶、指向当前栈帧中执行的指令。函数的入参顺序这里不做说明,感兴趣可以了解__stdcall、__fastcall。

对于寻址问题,这里列出几种寻址方式,具体可查阅相关资料。

【问题解析】

 

这里写了一个demo,先分析该demo的Begin函数的调用堆栈,如下图所示

函数在栈中内存分布大致分为四个部分:

参数空间

Call指令执行完的下一条指令地址

前EBP的值(当前EBP中保存)

局部变量空间

注意:对于__security_cookie取决于编译器

___security_cookie机制,防止栈溢出___security_cookie机制,防止栈溢出 - mavaL - 博客园

先分析正常函数的例子:

 

Begin函数的ebp地址为0xC8,存储main函数ebp,向下偏移4个字节为_security_cookies,向下偏移8个字节为数组地址,这里注意数组大小为6,为了内存对齐分配8个字节,向下偏移4个字节为result(int),向下偏移4个字节为数组首地址(MemCpy的参数),再向下偏移4字节地址为call下一条指令的地址,再向下4个字节为MemCpy函数的ebp

 

当我们修改memcpy函数将hello word!!!!(截图有误)写进大于dst空间的内存,运行马上崩溃。

 

分析此时的栈内存,这里看到函数Begin函数的ebp 0x0137fa5c 所存储的数据(0x0137fa50,实际为main函数的地址)被修改为(0x01000000)

【分析工具】

踩内存问题被发现,通常是程序崩溃的时候,能够生成coredump分析,知道是哪个内存被踩了,但通常是很难分析出是哪段代码出现了踩内存的问题,也就是内存践踏的第一现场,我们只能借助工具排查。

对于简单的容易发现内存被篡改的可以使用VS自带数据断点和Gdb watch,对于复杂问题可参考Mprotect、Asan、Perf(hardware breakpoint)、Valgrind、Magic number等工具。

https://blog.csdn.net/zz460833359/article/details/121769216

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

利用两个小demo理解汇编代码排查内存溢出问题 的相关文章

  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • 以文化中立的方式将字符串拆分为单词

    我提出了下面的方法 旨在将可变长度的文本拆分为单词数组 以进行进一步的全文索引处理 删除停止词 然后进行词干分析 结果似乎不错 但我想听听关于这种实现对于不同语言的文本的可靠性的意见 您会建议使用正则表达式来代替吗 请注意 我选择不使用 S
  • 按成员序列化

    我已经实现了template
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • 类模板参数推导 - clang 和 gcc 不同

    下面的代码使用 gcc 编译 但不使用 clang 编译 https godbolt org z ttqGuL template
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new

随机推荐

  • get 和 post 的区别

    使用场景 GET请求一般用于向服务器请求数据 POST请求一般用于向服务器提交数据 请求参数的位置 GET请求通常将参数放在URL的 query 中 POST 请求通常会将数据放在请求体 body 中 GET请求通常将参数放在URL的 qu
  • unity 2D中,实现点击按钮可以游戏暂停的效果

    在Unity 2D中 可以通过以下步骤和代码来设置一个按钮 实现游戏暂停的效果 创建一个空对象 命名为 GameManager 用于管理游戏状态 在GameManager对象上添加一个脚本 命名为 PauseManager 在脚本中添加以下
  • 简述“自顶向下,逐步求精”——面向过程程序设计方法

    引入 所谓 自顶向下 逐步求精 的程序设计方法 网络上有着如下的说法 一者是百度百科所述 另一者则为维基百科的说法 自顶向下设计 一种逐步求精的设计程序的过程和方法 对要完成的任务进行分解 先对最高层次中的问题进行定义 设计 编程和测试 而
  • C# 联合Halcon开发的完整项目案例(三套完整源码)附下载连接

    C 联合Halcon开发的完整项目案例 三套完整源码 点我下载三套项目源码 1 C 联合Halcon开发的程序 一整套源码 相机点胶定位 图像采集 数据查询相机间通讯具体情况如下图所示 案例注释详细 方便二次开发 2 C Halcon Vi
  • 从零开发校园商铺平台(SSM到SpringBoot)一.开发准备,实体类设计与表创建

    依山傍水房树间 行也安然 住也安然 一条耕牛半顷田 收也凭天 荒也凭天 雨过天晴驾小船 鱼在一边 酒在一边 夜晚妻子话灯前 今也谈谈 古也谈谈 日上三竿犹在眠 不是神仙 胜似神仙 一 开发准备 创建maven项目 解决项目报错 新增pom
  • Chrome插件(扩展)开发全攻略

    目录 写在前面 仓库说明 前言 什么是Chrome插件 学习Chrome插件开发有什么意义 为什么是Chrome插件而不是Firefox插件 开发与调试 核心介绍 manifest json content scripts backgrou
  • qRegisterMetaType

    如果要在Qt信号槽中使用自定义类型 需要注意使用qRegisterMetaType对自定义类型进行注册 当然在不跨线程时使用自定义类型signal slot来传递 可能不会出现什么问题 一旦涉及跨线程就很容易出错 回想下信号槽的作用就是用来
  • 机器学习——朴素贝叶斯分类器及sklearn实现

    前言 参考 机器学习 简单介绍朴素贝叶斯分类器 机器学习专栏 机器学习专栏 文章目录 一 贝叶斯定理 二 贝叶斯分类法 三 sklearn实现贝叶斯分类 一 贝叶斯定理 贝叶斯定理 Bayes theorem 是概率论中的一个定理 描述在已
  • Metasploit search参数

    msfvenom 参数 q快速启动msf 不显示banner信息 x加载模块代码 p payload lt payload gt 指定需要使用的payload 攻击荷载 也可以使用自定义payload 几乎是支持全平台的 l list mo
  • ThinkPHP3.2.3关闭调试模式及做些修改

    1 首先在入口文件中关闭调试模式 开启调试模式 建议开发阶段开启True 部署阶段注释或者设为false define APP DEBUG false 2 修改 Conf config php 异常页面的模板文件 TMPL EXCEPTIO
  • Cookie与Session深入理解(一)——Cookie

    基本操作 HttpServletRequest request HttpServletResponse response 1 获取cookies Cookie cookieList request getCookies 2 根据cookie
  • 力扣312题:戳气球

    力扣312题 戳气球 题目描述 有 n 个气球 编号为0 到 n 1 每个气球上都标有一个数字 这些数字存在数组 nums 中 现在要求你戳破所有的气球 戳破第 i 个气球 你可以获得 nums i 1 nums i nums i 1 枚硬
  • 机器学习深度学习数据集大汇总

    寻找一个好用的数据集需要注意一下几点 数据集不混乱 否则要花费大量时间来清理数据 数据集不应包含太多行或列 否则会难以使用 数据越干净越好 清理大型数据集可能非常耗时 应该预设一个有趣的问题 而这个问题又可以用数据来回答 数据集发布平台 A
  • linux安装pycharm详细步骤

    一 用xftp远程根据把解压后的安装包文件上传到指定目录 opt module 然后 cd opt module pycharm community linux 2018 1 4 bin 执行以代码 chmod u x pycharm sh
  • C++小游戏---坦克大战(二)(加入传送门)--附完整代码

    目录 素材整理 穿越草地 坦克穿越草地 子弹穿越草地 传送门 判定形式 生成传送门 传送坦克 关卡模式 效果展示 总结 完整代码 上一篇坦克大战居然意外获得了一些关注 正好最近也完善了一些功能 同时也加入了一些自己想到的新元素 主要是关于穿
  • 基于Matlab实现图像去噪技术(附上完整源码+图像+程序运行说明)

    图像去噪是数字图像处理中一个重要的问题 它的目标是恢复由于噪声引起的图像质量下降 噪声可以由各种原因引起 如图像传感器的不完美性能 图像传输过程中的干扰等 在实际应用中 图像去噪技术被广泛应用于医学图像处理 计算机视觉 图像识别等领域 本文
  • vim

    three basic mode of vim command mode also is default mode all the alphanumeric keys are bound to commands Typing dd will
  • 【数据库】封锁技术

    一 前言 数据库的并发操作通常会带来三个问题 丢失更新 读脏数据 不可重复读 解决这些问题就需要用到数据库的封锁机制进行控制 但封锁机制的引入又引起了一系列问题 性能下降 死锁等 1 丢失更新 一个事务的更新覆盖了其他事务的更新结果 例如用
  • android小项目之新闻客户端四

    基于Android小巫新闻客户端开发 显示新闻详细内容UI设计 2013年2月27日 天气潮湿 距上一次写的主界面业务逻辑实现 已经过来11天 小巫觉得拖得太久了 所以决定尽量把所有的内容介绍完 好完成这个任务 因为小巫已经开学了 将会有更
  • 利用两个小demo理解汇编代码排查内存溢出问题

    利用两个小demo理解汇编代码排查内存溢出问题 https www cnblogs com liuchuanloong articles 16925695 html 背景 近日处理现场问题时遇到了踩内存导致的崩溃问题 然而个人对反汇编程序执