Linux plt表调用汇编代码分析

news2024/11/29 20:53:43

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.coloradmin.cn/o/2191845.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Node2Vec的图嵌入实现过程

目录 一、引言二、Node2Vec&#xff08;原理&#xff09;2.1 随机游走&#xff08;Random Walk&#xff09;2.2 嵌入学习2.3 Node2Vec 的优势 三、使用 Node2Vec 进行图嵌入&#xff08;实践&#xff09;3.1 读取和转换 JSON 文件为 Graph 对象3.2 训练 Node2Vec 模型3.3 二维嵌…

Python+Django微信小程序前后端人脸识别登录注册

程序示例精选 PythonDjango微信小程序前后端人脸识别登录注册 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《PythonDjango微信小程序前后端人脸识别登录注册》编写代码&#xff0c;代码整…

2024年10月6日历史上的今天大事件早读

23年10月06日西汉“新莽政权”领袖王莽被刺身亡 1866年10月06日清政府批准筹设天津机器局 1905年10月06日俄国爆发铁路工人大罢工 1913年10月06日中、英西姆拉会商“西藏问题” 1927年10月06日阿尔-乔尔森主演第一部有声电影 1940年10月06日新四军获黄桥决战胜利 1949年1…

字节跳动员工玩转 AI 的 100 种办法

今年&#xff0c;字节跳动在国内上线了 AI 应用开发平台——扣子。用户可以根据自己的想法在扣子上创建 chat bot&#xff08;聊天机器人&#xff09;&#xff0c;甚至能利用扣子 API 上线一个产品。 扣子上有丰富的插件工具&#xff0c;如果用户希望 bot 具备某个功能&#x…

sql-labs靶场第九关测试报告

目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、寻找注入点 2、注入数据库 ①寻找注入方法 ②爆库&#xff0c;查看数据库名称 ③爆表&#xff0c;查看security库的所有表 ④爆列&#xff0c;查看users表的所有列 ⑤成功获取用户名…

2024年,现在做全职的AI产品经理,时机对不对?

就在最近&#xff0c;Chatgpt又更新了&#xff0c;推出了新版本名字叫做canvas。 这个版本可以支持对AI的对话内容进行编辑了&#xff0c;也就是以前prompt一次性生成的结果总是很难控制输出结果&#xff0c;新版新增了可以在结果内容与用户进行交互的产品入口&#xff0c;最终…

(20)MATLAB使用卡方(chi-square)分布生成Nakagami-m分布

文章目录 前言一、使用卡方分布函数生成Nakagami分布随机变量二、MATLAB仿真1.仿真代码2.运行结果 前言 Nakagami分布随机变量的生成&#xff0c;可以使用gamma分布实现&#xff0c;也可以使用卡方&#xff08;chi-square&#xff09;分布随机变量生成。使用伽马&#xff08;g…

AI 写作工具汇总

&#x1f423;个人主页 可惜已不在 &#x1f424;这篇在这个专栏AI_可惜已不在的博客-CSDN博客 &#x1f425;有用的话就留下一个三连吧&#x1f63c; 目录 前言: 正文: ​ 前言: 在信息时代的浪潮中&#xff0c;AI 写作应运而生。它以强大的算法和海量的数据为支撑&…

文本处理 — JavaScript 中的字符串——WEB开发系列44

掌握它所出现的文本是很有用的&#xff0c;字符串是最基本的数据类型之一&#xff0c;承载着我们与计算机之间的交流。它们可以用来表示文本、传递信息、构建用户界面等。JavaScript作为一种广泛使用的编程语言&#xff0c;为字符串提供了强大而灵活的处理功能。 一、创建字符串…

图解 Stable Diffusion 如何实现文生图

前言 1引言 Stable Diffusion 是 2022 年发布的深度学习文生图模型。它主要用于根据文本的描述产生详细图像&#xff0c;尽管它也可以应用于其他任务&#xff0c;如内补和外补绘制&#xff0c;以及在提示词指导下产生图生图的翻译。 算法原理 Stable Diffusion 是一种扩散模…

Python+Django预约管理系统

程序示例精选 PythonDjango预约管理系统 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《PythonDjango预约管理系统》编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读。 学习…

【深度学习基础模型】液态状态机(Liquid State Machines, LSM)详细理解并附实现代码。

【深度学习基础模型】液态状态机&#xff08;Liquid State Machines, LSM&#xff09;详细理解并附实现代码。 【深度学习基础模型】液态状态机&#xff08;Liquid State Machines, LSM&#xff09;详细理解并附实现代码。 文章目录 【深度学习基础模型】液态状态机&#xff0…

No.4 笔记 | 探索网络安全:揭开Web世界的隐秘防线

在这个数字时代&#xff0c;网络安全无处不在。了解Web安全的基本知识&#xff0c;不仅能保护我们自己&#xff0c;也能帮助我们在技术上更进一步。让我们一起深入探索Web安全的世界&#xff0c;掌握那些必备的安全知识&#xff01; 1. 客户端与WEB应用安全 前端漏洞&#xff1…

【PACS源码】C#.net医学影像管理系统源码,支持CT、MR、CR、DR、ECT、DSA、X光机、超声、内镜、病理等多种设备。

PACS医学影像管理与传输系统软件可对医学仪器输出的视频信号进行接收、处理、存储、报告输出、管理、查询等&#xff0c;并支持网络&#xff0c;实现资源共享。为医院对病人信息资料进行数字化、科学化、网络化管理提供了必要的工具。 基于DICOM标准的PACS医学影像管理系统&am…

【C++】二叉搜索树+变身 = AVL树

&#x1f680;个人主页&#xff1a;小羊 &#x1f680;所属专栏&#xff1a;C 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 前言一、AVL树二、AVL树的实现2.1 平衡因子2.2 旋转处理2.2.1 左单旋&#xff1a;插入新节点后单纯的右边高2.2.2 …

Linux dlsym符号查找疑惑分析

dlsym 函数是 Linux 下动态链接库&#xff08;shared library&#xff09;编程中的一个重要函数。它用于在运行时获取动态链接库中符号的地址&#xff0c;通常用于获取函数指针或变量的地址。 以下是 dlsym 函数的基本用法和示例。 1. 函数原型 void *dlsym(void *handle, c…

3. OOP封装 -- get、set方法

文章目录 1. 抛出问题&#xff1a;存在安全隐患2. 那咋办呢&#xff1f;3. 上述方案行不通&#xff0c;只能引入封装的概念① public向private过渡② 这种情况下如何修改信息&#xff0c;使用get和set方法如何限制用户输入企业中为什么不用public快捷键生成所有私有成员变量的g…

老系统处理策略

1. 改造策略 定义&#xff1a;对技术含量高、业务价值大的遗留系统进行功能增强和数据模型改造。 适用场景&#xff1a;系统较新&#xff0c;能满足业务需求&#xff0c;但需增加新功能或优化数据模型。 优点&#xff1a;增强功能&#xff0c;优化数据&#xff0c;提升系统性…

第一批用大模型的程序员,已经碾压同事了...

自 ChatGPT 面世以来&#xff0c;市场上一直用“iPhone 时刻”“划时代”“工业革命”等关键词来形容 AI 领域的飞速进展。如今&#xff0c;AI 大模型的战争已经开启大卷特卷模式。 OpenAI 炸裂推出 GPT-4o&#xff0c;科幻电影照进现实&#xff0c;不仅免费可用&#xff0c;能…

Buck电路-电感电容计算

目录&#xff1a; 1、前置知识 1&#xff09;电感的公式 2&#xff09;电容的公式 3&#xff09;Buck电路框图 2、占空比D的计算 1&#xff09;Switch(on)状态 2&#xff09;Switch(off)状态 3&#xff09;占空比计算 3、电感计算 4、电容计算 5、电荷平衡与伏秒…