CTF权威指南 笔记 -第二章二进制文件- 2.3 -静态链接

news2024/12/28 21:06:42

目录

地址空间分配

两个链接的方式

 按序叠加

相似节合并

静态链接的详细过程

虚拟内存

重定位文件

静态链接库


地址空间分配

我们把之前的两函数分为两个文件

main.c

extern int shared
extern vooid fun(int *a,int *b);
int main(){
	int a=100;
	func(&a,&shared);
	return 0;
}

func.c

int shared =1;
int tmp=0;
void func(int *a,int *b){
	tmp = *a;
	*a=*b;
	*b=tmp;
}
gcc -static -fno-stack-protector main.c func.c -save-temps --verbose -o func.ELF

两个链接的方式

这里我们先给出

 

 按序叠加

 我们如果要把main.o 和func.o 链接成一个可执行文件 最简单就是按序叠加

但是这种弊端 就是如果链接的目标文件过多 可执行文件就会巨大

而且一个不足一页的代码节或数据节 也要占一页的空间 这样就造成了浪费

相似节合并

把不同目标文件相同属性的节合并为一个节

main func的text 合并为一个新的text节

这种方式被现在的编译器所采用

先对各个节的长度 属性 和偏移进行分析 
然后输入目标文件中的符号表的符号定义和符号引用统一成一个全局符号表
最后 读取输入文件的各类信息对符号进行解析 重定位等操作


相似节合并就出现在重定位当中


完成后 程序的每条指令和全局变量都有了运行的时候唯一的内存地址

静态链接的详细过程

为了构造可执行文件

编译器必须经过两个过程

符号解析 
把每一个符号 (函数,全局变量,静态变量)的引用和其定义关联
重定位
把每一个符号定义和一个内存地址进行关联 然后修改这些符号的引用 让他指向地址

我们下面进行对比 可执行文件 func.ELF 和 中间产物 main.o的对比

我们重点关注 .text .bss .data

objdump -h func.ELF-main.o

main.o的

 func.ELF的

objdump -h func.ELF

 我们这里关注 VMA 和 LMA

VMA :虚拟地址
LMA :加载地址


这两个一般情况下是相同的

我们能发现 main.o的VMA和LMA是0 因为还没有进行链接

而func.ELF 有实际地址  因为相似节合并了 并且完成了虚拟内存的分配

虚拟内存

虚拟内存 就是 程序执行 是把代码RAM载入内存 如果一个代码很多 内存就饱满了

所以虚拟内存的作用就是 让机器认为还有很多内存 但是实际上 代码只是部分进入了内存中

还有一些在外存上 机器要使用外存代码了 就自动载入


百度百科:虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。

接着我们使用objdump查看main.o的反汇编

objdump -d -M intel --section=.text func.ELF-main.o

 只对text段进行反汇编

 这里我们进行分析

main函数从 地址0开始 
call函数的操作码是e8 
后面是调取的函数地址 偏移量 但是没有进行重定位 所以0x000000000
函数的地址是在便宜处 0x2e的地方
我们可以通过下一条返回地址进行计算函数地址

mov的地址为2e 
函数偏移量为 0x0

0x2e+0x0 = 0x2e 这只是一个临时地址

shared的地址在rip+0x0
其实编译器还根本不知道地址在哪 所以使用00000000代替

接着我们看看func.ELF的文件

objdump -d -M intel --section=.text func.ELF |grep -A 16 "<main>"


16 "<main>"找到main函数 并且打印前面的地址

main函数从 0x401745开始 
call函数在 40176e的位置 
mov为 401773 + 0x07 =0x4177A 这个就是func函数的地址

同时 rip+0xc398d 为 shared的地址

重定位文件

重定位文件中最重要的就是要包含重定位表 用于告诉链接器如何修改节的内容

例如

.rela.text 的节保存 .text的重定位表 
.rela.text包含两个重定位入口 
shared的类型为 R_X86_64_32 用于绝对寻址 cpu 直接把 指令编码中32位值作为有效地址 
func的类型为R_X86_64_PC32 用于相对寻址 cpu 把指令编码中的32位值加上 PC的值得到下一条地址
objdump -r func.ELF-main.o

静态链接库

后缀名为.a 的为静态链接库文件 libc.a 
 

一个静态链接库可以视为一组目标文件经过压缩打包的文件集合

执行各种编译任务的时候 需要有不同的目标文件

比如输入输出 printf.o scanf.o等

我们使用ar对目标文件进行压缩 编号 引用 这就形成了 libc.a
ar -t libc.a

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/483226.html

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

相关文章

MySQL监控告警及可视化:Zabbix+Percona PMP实现(Part III)

MySQL监控告警及可视化&#xff1a;ZabbixPercona PMP实现&#xff08;Part III&#xff09; 告警配置配置告警邮箱配置告警消息模板配置告警用户配置告警规则告警测试 告警配置 配置告警邮箱 在Zabbix Web前端的 Administration - Media Types - Email 中配置发送告警信息的…

什么是恺撒密码?如何用Python实现它(36)

小朋友们好&#xff0c;大朋友们好&#xff01; 我是猫妹&#xff0c;一名爱上Python编程的小学生。 欢迎和猫妹一起&#xff0c;趣味学Python。 今日主题 猫妹目前在看的&#xff0c;ycl Python等级考试五级教材&#xff0c;有一章是介绍恺撒密码的。 今天&#xff0c;咱们…

2023-5-2面试题学习

1、内存的可见性你了解吗&#xff0c;讲述一下&#xff1f; 内存可见性是指多个线程访问同一共享变量时&#xff0c;在一个线程修改了该变量值后&#xff0c;下一个线程能立即看到这种变化的能力。 如果一个变量在多个线程间共享&#xff0c;那么为了避免出现数据不一致的情况&…

为什么DDD难落地?

为什么DDD难落地&#xff1f; lorne 2023-04-23 视频地址&#xff1a; 为什么DDD难落地&#xff1f;_哔哩哔哩_bilibili 洋葱架构图&#xff1a; DDD能解决什么问题&#xff1f; 其实DDD的核心是&#xff1a;提升业务的聚合性、提升业务的拓展性。 DDD的错误认知&#xff…

CentOS7安装和部署Jenkins

安装Java环境 检查旧版&#xff1a; rpm -qa | grep java若已经安装了旧版本&#xff0c;则需要先删除&#xff0c;删除方法&#xff1a; rpm -qa nodeps [java package]安装新版&#xff1a; yum install java-11-openjdk yum install java-11-openjdk-devel&#xff08;开…

07 KVM虚拟机引导固件安装

文章目录 07 KVM虚拟机引导固件安装7.1 概述7.2 安装方法7.2.1 安装edk软件包7.2.2 查询edk软件是否安装成功 07 KVM虚拟机引导固件安装 7.1 概述 针对不同的架构&#xff0c;引导的方式有所差异。x86支持UEFI&#xff08;Unified Extensible Firmware Interface&#xff09;…

MySQL示例数据库(MySQL Sample Databases) 之 World数据库

文章目录 MySQL示例数据库(MySQL Sample Databases) 之 World数据库官方示例数据介绍World数据库World 数据库安装world-db/world.sql的脚本内容参考 MySQL示例数据库(MySQL Sample Databases) 之 World数据库 官方示例数据介绍 MySQL 官方提供了多个示例数据库&#xff0c;在…

【致敬未来的攻城狮计划】— 连续打卡第十九天:RA2E1串口通信基础知识

系列文章目录 1.连续打卡第一天&#xff1a;提前对CPK_RA2E1是瑞萨RA系列开发板的初体验&#xff0c;了解一下 2.开发环境的选择和调试&#xff08;从零开始&#xff0c;加油&#xff09; 3.欲速则不达&#xff0c;今天是对RA2E1 基础知识的补充学习。 4.e2 studio 使用教程 5.…

什么是GPT模型,GPT下载和国内镜像

什么是GPT模型&#xff0c;GPT模型是通过预训练的方式&#xff0c;采用无监督学习方式&#xff0c;大量语料输入&#xff0c;经过多次训练后得到模型。它能够自动学习并理解自然语言中的语义、句法和语法信息&#xff0c;并可以用于文本生成、对话系统、情感分析、机器翻译等自…

HTTP第二讲——HTTP相关概念

与HTTP 相关的各种应用 1.网络世界 实际的互联网是由许许多多个规模略小的网络连接而成的&#xff0c;这些“小网络”可能是只有几百台电脑的局域网&#xff0c;可能是有几万、几十万 台电脑的广域网&#xff0c;可能是用电缆、光纤构成的固定网络&#xff0c;也可能是用基站、…

SQL之SQL索引

文章目录 一、索引概述介绍演示优缺点 二、索引结构二叉树B-Tree (多路平衡查找树)BTreeHash 三、索引分类四、索引语法五、SQL性能分析SQL执行频率慢查询日志profile详情 索引使用原则验证索引效率最左前缀法则索引列运算字符串不加引号模糊查询or连接的条件数据分布影响 .SQL…

[LeetCode周赛复盘] 第 103 场双周赛20230429

[LeetCode周赛复盘] 第 103 场双周赛20230429 一、本周周赛总结2656. K 个元素的最大和1. 题目描述2. 思路分析3. 代码实现 2657. 找到两个数组的前缀公共数组1. 题目描述2. 思路分析3. 代码实现 2658. 网格图中鱼的最大数目1. 题目描述2. 思路分析3. 代码实现 2659. 将数组清…

二分(整数二分 浮点数二分)

目录 一、整数二分 模板 右边界二分查找&#xff08;左开右闭&#xff09; 左边界二分查找&#xff08;左闭右开&#xff09; 应用 数的范围 二、浮点数的二分 模板 应用 算术平方根 三、习题 1.数的三次方根 一、整数二分 tip&#xff1a;满足单调性的数组一定可以…

【Linux】进程优先级 + 环境变量

文章目录 &#x1f4d6; 前言1. 进程优先级1.1 什么是优先级&#xff1a;1.2 如何修改优先级&#xff1a; 2. 进程的其他概念2.1 竞争性与独立性&#xff1a;2.2 并行与并发&#xff1a;2.3 进程间优先级的体现&#xff1a;2.4 O(1) 调度算法&#xff1a;2.4 进程上下文&#x…

C语言进阶——数据在内存中的存储,你知道吗?

今天我们深度剖析数据在内存中的存储&#xff1a; 重点知识&#xff1a; 1、数据类型详细介绍 2、整形在内存中的存储&#xff1a;原码、反码、补码 3、大小端字节序介绍及判断 4、浮点型在内存中的存储解析 之前我们涉及关于这一部分的知识只是大致的进行讲解&#xff0…

网络编程:UDP socket

文章目录 阅读前导 服务端定义日志框架成员属性服务端框架 初始化服务器创建套接字绑定 运行服务端读取数据参数解读 处理数据向客户端发送响应数据关闭文件描述符 客户端定义创建套接字绑定发送数据接收服务器的响应数据关闭文件描述符 测试1本地环回作用 本地测试netstat 指令…

继续科普:ChatGPT 最新写论文使用方法

这两天发现了几个国内就能用的ChatGPT,不需要魔法! 给大家推荐两种方法,大家自行选择: 1、电脑端安装VSCode软件,使用GPT插件: 优点: 无需魔法、无需付费、软件简单易用(稍懂电脑就会用) 缺点: ① 只支持电脑端,不支持手机:软件安装虽简单,但不一定所有人都…

行业常识_RFID

文章目录 1 RF2 RFID2.1 RFID的应用场景2.2 RFID工作原理 1 RF RF&#xff0c;是Radio Frequency的缩写&#xff0c; Radio&#xff0c;n. 收音机&#xff1b;无线电通讯&#xff1b; v. 用无线电通讯&#xff08;或发送消息&#xff09; Frequency&#xff0c;n. 频率 RF中文…

electron+vue3全家桶+vite项目搭建【16】electron多窗口,pinia状态无法同步更新问题解决

文章目录 引入实现效果展示问题展示解决方案思路整理1.主进程添加handle2.编写pinia插件3.完善pinia插件4.最终实现效果 引入 pinia是vue3官方支持的全局状态管理工具&#xff0c;简单易用&#xff0c;但是electron的多窗口虽然加载的页面是单个路由&#xff0c;但其实已经是另…

【全网首发开源教程】【Labview机器人仿真与控制】Labview与Solidworks多路支配关系-四足爬行机器人仿真与控制

&#x1f389;欢迎来到Labview专栏~四足爬行机器人仿真与控制 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;Labview-3D虚拟平台 文章作者技术和水平有限&#xff0c;如果文中出现错误&#…