(1). 了解链接的基本概念和链接过程所要完成的任务。
(2). 理解ELF目标代码和目标代码文件的基本概念和基本构成
(3). 了解ELF可重定位目标文件和可执行目标文件的差别。
(4). 理解符号表中包含的全局符号、外部符号和本地符号的定义。
(5). 理解符号解析的目的和功能以及进行符号解析的过程。
每个实验阶段(共5个)考察ELF文件组成与程序链接过程的不同方面知识
阶段1:全局变量ó数据节
阶段2:强符号与弱符号ó数据节
阶段3:代码节修改
阶段4:代码与重定位位置
阶段5:代码与重定位类型
(1)首先我要以下代码,然而会出现一堆乱码
(2)输入readelf -a phase1.o 查看elf文件内容,找到输出的.data 节中偏移量为32的位置。如下图:
在这里插入图片描述
(3)用hexedit phase1.o命令来修改phase1.o,并对phase1.o数据节中相应字节进行修改
(4)删除前一个linkbomb,生成新的linkbomb,最后重新输出得到我们要的结果:
(1)输入readelf -a phase1.o 查看elf文件内容
(2)可以发现COM未被赋初始值,需要打补丁phase2_patch.o
得出偏移量为0
(3)创建文件,创建一个g_myCharArray,偏移量是0,根据ascii码表对比偏移量
推算出学号
(1)objdump -d phase3.o 编译查看汇编代码
(2)根据编程思想要打印学号,那肯定打印在后,所以包含puts语句的myFunc1方法在后面,接收一个参数,这个参数应该是学号
(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数据
(8)所以我们要注入的位置就是0x40+0x31=0x71
Hexedit phase3.o
将机器码写入0x71
(9)根据前面的我们可以推出.data节是0x1a0,给学号赋值
(10)编译运行查看结果
(1)readelf -o phase4.o 命令查看,查看phase4.o文件ELF数据
(3)一个是变量g_myCharArray一个是变量temp还有一个puts函数且g_myCharArray是位于.data节中偏移量为0(即value值)处temp是位于.data节中偏移量为0x14(即value值)处编译查看汇编代码
(4)观察可得,偏移量是要使变量和函数到0x6,0x11,0x19
需要把puts - 4的值设置成19
通过readelf命令得知开始为250
(5)根据思考,0x11应该放学号数组,因为要赋值给%rdi传递给puts函数打印,0x6应该放temp回到上面已经发现”.data+10”(temp)组偏移量是这里,修改为6
(6)编译运行查看结果
(5)编译查看汇编代码
(3) 查看发现g_guard等于1
下面会走到一个假的数组
(4) 查看一些0x601050的值,这个是真的
(5)观察发现只要将0x601050和0x601040换一下就可以了,找到偏移量了,互换即
(7)从这里可以开出g_myCharArray是一个位于.data中偏移量为0x10处的
.data在0x90处
(8)编译运行,查看结果:
实验总结:
通过此实验,我掌握了符号解析、符号定义分类 、静态链接解析过程、符号表条目、重定位、动态链接、静态库的缺点、位置无关代码、数据和代码调用,还有的是关于地址的计算。基于ELF文件格式和程序链接过程的理解,修改给定二进制可重定位目标文件的数据内容、机器指令、重定位记录等部分。这个实验也运用到了实验一的设断点。实验过程中,我有遇到了bug,但通过了查询资料、上百度搜问,最后自己独立解决了bug。通过完成此次实验,不仅收获了很多知识,而且还锻炼了我的动手能力。解决了问题,完成了实验,感觉收获满满的,也有一定的成就感。