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

Linux plt表调用汇编代码分析

linux调用共享库中的函数时通过plt表和got表实现位置无关代码,过程中涉及到lazy binding,即在第一调用外部函数时解析被调用的函数地址并将地址写入到got表,后续调用则不需要解析函数地址,具体过程如下

1.c程序如下

#include <stdio.h>
#include <cstub.h>
#include <dlfcn.h>
extern void a();
int main()
{a();int i=1;
}

2.c程序文件如下

#include <stdio.h>void a()
{void *b = printf;printf("hahahaha\n");
}

编译参数如下

gcc -g  1.c -I. -L. -la -ldl -z lazy
gcc -g -fPIC -shared 2.c -o liba.so

使用gdb调试a.out,在main上下断点,反汇编main函数如下

可以看出程序时通过0x401030这个地址来调用a函数,反编译0x401030如下

 0x401030这个地址反编译对应着plt表,jmpq *0x2fe2(%rip) 是 x86-64 架构中的一条跳转指令。我们来逐部分分析这条指令的含义:

  1. jmpq: 这是一个跳转指令,jmp 表示无条件跳转(jump),q 表示这是一个 64 位的跳转("quad" 的缩写)。

  2. 0x2fe2(%rip): 这里使用的是相对寻址模式,%rip 是指令指针寄存器(Instruction Pointer Register),它指向当前正在执行的指令的地址。0x2fe2 是一个偏移量,表示从当前指令的地址向前或向后偏移 0x2fe2 字节。也就是说,0x2fe2(%rip) 将计算出一个地址,这个地址是当前指令地址加上 0x2fe2。

  3. *0x2fe2(%rip): 星号(*)表示将这个计算出的地址作为跳转目标,而不是直接跳转到一个固定的地址。也就是说,指令会跳转到由 0x2fe2(%rip) 指向的地址。

  4. 使用x读取这个地址内容,发现对应应位置是got表内容,值未0x401036,对应着上图pushq这条汇编指令,即程序执行完plt表第一条jumq后紧接着执行pushq %0;jump 0x401020,0x401020保存了解析a函数地址的代码。

 执行r命令,并执行到int i=1这行代码,此时程序执行完a函数并输出,再次查看got表内容,可以发现got表对应的值改变为0x00007ffff7fcb105,反汇编a函数,可以看出a函数的地址也为0x00007ffff7fcb105,因此后续在调用a函数是,程序通过jmpq *0x2fe2(%rip) 这句指令跳转到a函数真实地址并执行a函数。

 

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

相关文章:

  • ubunut声卡配置 播放视频没有声音的解决方法 蓝牙问题
  • 《软件工程概论》作业一:新冠疫情下软件产品设计
  • 大厂出来的人为什么不比你高效?
  • 71.【C语言】动态内存管理(重点)(4)
  • JavaScript 用HTML5约束验证API做表单验证
  • Unity 编辑器多开
  • 【Spring Boot React】Spring Boot和React教程 完整版
  • Linux中的多线程
  • 《计算机原理与系统结构》学习系列
  • 征程6 工具链常用工具和 API 整理(含新手示例)
  • 我有一张图,我怎么让midjourney按照这张图继续生成呢?
  • MSF捆绑文件
  • 01_SQLite
  • 【STM32开发笔记】移植AI框架TensorFlow到STM32单片机【下篇】
  • 畅阅读小程序|畅阅读系统|基于java的畅阅读系统小程序设计与实现(源码+数据库+文档)
  • 【机器学习(十一)】糖尿病数据集分类预测案例分析—XGBoost分类算法—Sentosa_DSML社区版
  • 二分查找一>寻找峰值
  • 《Linux从小白到高手》理论篇:深入理解Linux的网络管理
  • redis数据类型介绍
  • 一张照片变换古风写真,Flux如何做到?
  • 医药行业的智能合同审查:大模型与AI赋能合规管理
  • 幂等性接口实现
  • C++ 语言特性29 - 协程介绍
  • [Day 84] 區塊鏈與人工智能的聯動應用:理論、技術與實踐
  • 八大排序--01冒泡排序
  • 【Kubernetes】常见面试题汇总(五十)
  • Linux 操作系统中的 main 函数参数和环境变量
  • Vue项目中通过插件pxtorem实现大屏响应式
  • (Django)初步使用
  • 【星汇极客】单片机竞赛之2024睿抗机器人大赛-火线速递赛道(持续更新)