计算机系统基础、LinkLab实验每个实验阶段(共5个)考察ELF文件组成与程序链接过程的不同方面知识 阶段1:全局变量ó数据节 阶段2:强符号与弱符号ó数据节 阶段3:代码节修改 阶段4:代码与重定

LinkLab实验

1.实验目的与要求

(1). 了解链接的基本概念和链接过程所要完成的任务。
(2). 理解ELF目标代码和目标代码文件的基本概念和基本构成
(3). 了解ELF可重定位目标文件和可执行目标文件的差别。
(4). 理解符号表中包含的全局符号、外部符号和本地符号的定义。
(5). 理解符号解析的目的和功能以及进行符号解析的过程。

2.实验原理与内容

每个实验阶段(共5个)考察ELF文件组成与程序链接过程的不同方面知识
阶段1:全局变量ó数据节
阶段2:强符号与弱符号ó数据节
阶段3:代码节修改
阶段4:代码与重定位位置
阶段5:代码与重定位类型

3.实验过程与结果

实验阶段1:

(1)首先我要以下代码,然而会出现一堆乱码

在这里插入图片描述

(2)输入readelf -a phase1.o 查看elf文件内容,找到输出的.data 节中偏移量为32的位置。如下图:
在这里插入图片描述

我的是0×60+0=0×60处
在这里插入图片描述

(3)用hexedit phase1.o命令来修改phase1.o,并对phase1.o数据节中相应字节进行修改
在这里插入图片描述

(4)删除前一个linkbomb,生成新的linkbomb,最后重新输出得到我们要的结果:
在这里插入图片描述

实验阶段2

(1)输入readelf -a phase1.o 查看elf文件内容
在这里插入图片描述

(2)可以发现COM未被赋初始值,需要打补丁phase2_patch.o
在这里插入图片描述

得出偏移量为0
(3)创建文件,创建一个g_myCharArray,偏移量是0,根据ascii码表对比偏移量

在这里插入图片描述

推算出学号

在这里插入图片描述
在这里插入图片描述

实验阶段3

(1)objdump -d phase3.o 编译查看汇编代码
(2)根据编程思想要打印学号,那肯定打印在后,所以包含puts语句的myFunc1方法在后面,接收一个参数,这个参数应该是学号
在这里插入图片描述

(3)myFunc2获取一个地址的值给到%rax寄存器
在这里插入图片描述

(4)那就是先调用myFunc2函数获取学号赋值给%rax,然后mov %rax,%rdi设置参数在调用myFunc1。
需要注入的命令是call myFunc2mov %rax,%rdicall myFunc1call
call指令对应的机器码是e8 xx xx xx xx。
在这里插入图片描述

(5)0x400593:e8 xx xx xx xx
0x400598:(下一条指令的地址)
MyFunc2的地址是0x40057d,计算0x400559到0x40057d的偏移量是-1b,即ff ff ff e5
在这里插入图片描述

(6)0x400593:e8 e5 ff ff ff
0x400598:这里是mov %rax,%rdi,mov %rax,%rdi的机器码是48 89 c7
所以即
0x400593:e8 e5 ff ff ff (callmyFunc2)
0x400598:48 89 c7 (movq %rax,%rdi)
0x40059b:e8 xx xx xx xx (call myFunc1)
0x4005a0:(下一条指令的地址)myFunc1的地址是0x400562
在这里插入图片描述

(7)0x4005a0到0x400562的偏移量是-3e即补码ff ff ff c2即
0x400593:e8 e6 ff ff ff (call myFunc2)
0x400598:48 89 c7 (movq %rax,%rdi)
0x40059b:e8 c2 ff ff ff (call myFunc1)
使用readelf -a phase3.o命令查看ELF数据
在这里插入图片描述

objdump命令查看phase3.o
在这里插入图片描述

(8)所以我们要注入的位置就是0x40+0x31=0x71
Hexedit phase3.o
将机器码写入0x71
在这里插入图片描述

(9)根据前面的我们可以推出.data节是0x1a0,给学号赋值
在这里插入图片描述

(10)编译运行查看结果

在这里插入图片描述

实验阶段4

(1)readelf -o phase4.o 命令查看,查看phase4.o文件ELF数据
在这里插入图片描述

(2)要修改这里的偏移值
从下图可以看出
在这里插入图片描述

(3)一个是变量g_myCharArray一个是变量temp还有一个puts函数且g_myCharArray是位于.data节中偏移量为0(即value值)处temp是位于.data节中偏移量为0x14(即value值)处编译查看汇编代码
在这里插入图片描述

用objdump查看汇编代码
在这里插入图片描述

(4)观察可得,偏移量是要使变量和函数到0x6,0x11,0x19
需要把puts - 4的值设置成19
通过readelf命令得知开始为250
在这里插入图片描述

重新查看汇编代码

值已经更改
重新编译查看汇编代码
在这里插入图片描述

(5)根据思考,0x11应该放学号数组,因为要赋值给%rdi传递给puts函数打印,0x6应该放temp回到上面已经发现”.data+10”(temp)组偏移量是这里,修改为6
在这里插入图片描述

.data+0”组偏移量是这里,修改为11
在这里插入图片描述

(6)编译运行查看结果

在这里插入图片描述

实验阶段5

(5)编译查看汇编代码

在这里插入图片描述
(2)此时可以发现myFunc是关键函数,用gdb调试
在这里插入图片描述

(3) 查看发现g_guard等于1
下面会走到一个假的数组

在这里插入图片描述

(4) 查看一些0x601050的值,这个是真的

在这里插入图片描述

(5)观察发现只要将0x601050和0x601040换一下就可以了,找到偏移量了,互换即
在这里插入图片描述

编译gdb调试
在这里插入图片描述

(6) 成功调换
接下来更改数据为学号
在这里插入图片描述

(7)从这里可以开出g_myCharArray是一个位于.data中偏移量为0x10处的
.data在0x90处
在这里插入图片描述

所以g_myCharArray在0xA0处,修改为学号
在这里插入图片描述

(8)编译运行,查看结果:

在这里插入图片描述实验总结:
通过此实验,我掌握了符号解析、符号定义分类 、静态链接解析过程、符号表条目、重定位、动态链接、静态库的缺点、位置无关代码、数据和代码调用,还有的是关于地址的计算。基于ELF文件格式和程序链接过程的理解,修改给定二进制可重定位目标文件的数据内容、机器指令、重定位记录等部分。这个实验也运用到了实验一的设断点。实验过程中,我有遇到了bug,但通过了查询资料、上百度搜问,最后自己独立解决了bug。通过完成此次实验,不仅收获了很多知识,而且还锻炼了我的动手能力。解决了问题,完成了实验,感觉收获满满的,也有一定的成就感。

  • 6
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AL.千灯学长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值