当前位置: 首页 > news >正文

多线程动态库里面调用静态库分配内存函数导致的崩溃cltp汇编指令导致

1、概述

        有这样的一个场景,我有一个动态库myso.so里面有函数start_crash(),用到静态库的内存分配函数,其实静态库里面的static.a 里面就封装了一个函数叫system_malloc(),函数返回的是分配的内存地址,然后发现,我在测试demo里面创建了个子线程,然后在子线程里面调用start_crash(),会发现system_malloc函数返回的地址不对,内存不可访问,使用时直接会发生崩溃

图1.1 exmaple为测试的例子,src为my.so动态库,util为负责调用malloc并返回分配的地址

图1.2 util system_malloc函数

图1.3 为myso.so中的start_crash()函数

图1.4为main函数调用myso.so中的start_crash函数

2、分析过程

我采用的是visual stdio 2022进行调试Linux的程序,具体怎么配置,请看在 Visual Studio 中连接到你的目标 Linux 系统 | Microsoft Learn,这个教程进行配置调试

2.1 主线程的调用

        2.1.1 myso.so中start_crash反汇编代码

        

        2.1.2 my.so中的start_crash的寄存器值

        2.1.3 返回的地址指针

我们可以看到rax 跟eax的地址值就是最终给payload变量的值,这个是没有问题的

2.2 子线程的调用

2.2.1 my.so 中start_crash的反汇编

调用流程跟主线程中的一样,但是为啥多了个cltp汇编指令呢,我们看cltp的解释

这样我们继续看调用system_malloc函数后返回的地址

payload的地址变成了0xffffffff000b60,不可访问,其实根据汇编指令,是把rax的地址给了payload变量,所以看到payload的地址跟rax是一样的,为啥好好的在system_malloc明明得到正确的地址,为啥函数调用回来之后就变了,很奇怪,我们根据汇编代码其实是多了调cltp指令导致的。

2.2.2 在utils.a中分配的地址值

rax 跟eax寄存器存的内容

3、原因分析

根据2.1跟2.2的比较我们可以得出,在主线程中调用test_mem得到的地址是没有问题的,但是在子线程中的就有问题,我们找了网上的资料发现也有这个cltp指令导致的错误GCC cutting of higher 32 bits of qword in dlmalloc port - OSDev.org

所以我们在编译时候加add_compile_options(-Werror)编译选项,发现编译不过,发现我没有把system_interface.h头文件给包含过来导致的,然后加上之后竟然不会发生崩溃了。怀疑这是编译器进行优化导致的一个问题。

但是我没有在myso.c中包含system_interface.h头文件我竟然都能编译过去,这也很奇怪,通过对比内存和反汇编,我们可以得出结论应该是

4、结论

system_malloc函数没有被正确声明,编译把返回当成32位了?,还是没怎么搞懂,为啥在主线程调用就不会发生这事,在子线程就会,从地址来看,子线程分配的地址控件大于32,这才导致这样的问题,而且发生了cltp扩展

http://www.lryc.cn/news/503397.html

相关文章:

  • 力扣刷题TOP101: 31.BM38 在二叉树中找到两个节点的最近公共祖先
  • 前端项目打包部署
  • 《CSS 知识点》大屏卡片布局思路:弹性布局 flex-grow
  • nVisual 登录页页面配置说明
  • 后端接受前端传递数组进行批量删除
  • 拍频实例 - 一组恒力矩电流采样数据
  • Jvm之NativeMemoryTracking 使用
  • PKCS#7、Bit padding(位填充)、Byte padding(字节填充)、Zero padding(零填充)
  • R语言学习笔记-1
  • 我在广州学 Mysql 系列之 数据“表”的基本操作
  • auto-gptq安装以及不适配软硬件环境可能出现的问题及解决方式
  • 【R语言】基础知识
  • 【一本通】虫洞
  • python爬虫--小白篇【爬虫实践】
  • Unity背包道具拖拽(极简版实现)
  • spark读取普通文件
  • MySQL SQL语句性能优化
  • 【蓝桥杯每日一题】技能升级
  • css 实现在一条线上流动小物体(offset-path)
  • 探索 Robyn 框架 —— 下一代高性能 Web 框架
  • STL容器-map P3613【深基15.例2】寄包柜 普及-
  • 【MySQL 进阶之路】了解 性能优化 与 设计原则
  • MySQL之数据库三大范式
  • [大数据]Hudi
  • jenkins harbor安装
  • JavaScript 高级特性与 ES6 新特性:正则表达式的深度探索
  • 正则表达式——参考视频B站《奇乐编程学院》
  • 【FFmpeg】FFmpeg 内存结构 ⑥ ( 搭建开发环境 | AVPacket 创建与释放代码分析 | AVPacket 内存使用注意事项 )
  • 【多模态文档智能】OCR-free感知多模态大模型技术链路及训练数据细节
  • Mybatis动态sql执行过程