哈工大 计算机系统 实验五
作者:互联网
所有实验文件可见github 计算机系统实验整理
实验报告
实 验(五)
题 目 LinkLab
链接
专 业 计算学部
学 号
班 级
学 生
指 导 教 师
实 验 地 点
实 验 日 期
计算机科学与技术学院
目 录
第1章 实验基本信息 - 3 -
1.1 实验目的 - 3 -
1.2 实验环境与工具 - 3 -
1.2.1 硬件环境 - 3 -
1.2.2 软件环境 - 3 -
1.2.3 开发工具 - 3 -
1.3 实验预习 - 3 -
第2章 实验预习 - 4 -
2.1 ELF文件格式解读 - 4 -
2.2程序的内存映像结构 - 4 -
2.3程序中符号的位置分析 - 5 -
2.4程序运行过程分析 - 7 -
第3章 各阶段的原理与方法 - 8 -
3.1 阶段1的分析 - 8 -
3.2 阶段2的分析 - 9 -
3.3 阶段3的分析 - 11 -
3.4 阶段4的分析 - 13 -
3.5 阶段5的分析 - 13 -
第4章 总结 - 14 -
4.1 请总结本次实验的收获 - 14 -
4.2 请给出对本次实验内容的建议 - 14 -
参考文献 - 15 -
第1章 实验基本信息
1.1 实验目的
理解链接的作用与工作步骤
掌握 ELF 结构、符号解析与重定位的工作过程
熟练使用 Linux 工具完成 ELF 分析与修改
1.2 实验环境与工具
1.2.1 硬件环境
X64 CPU; 2GHz; 2G RAM; 256GHD Disk 以上
1.2.2 软件环境
Windows7 64位以上; VirtualBox/Vmware 11以上; Ubuntu 16.04
LTS 64 位/优麒麟 64 位;
1.2.3 开发工具
Visual Studio 2010 64 位以上; GDB/OBJDUMP; DDD/EDB 等
1.3 实验预习
上实验课前,必须认真预习实验指导书(PPT 或 PDF)了解实验的目的、实验环境与软硬件工具、实验操作步骤,复习与实验有关的理论知识。请按顺序写出 ELF 格式的可执行目标文件的各类信息。请按照内存地址从低到高的顺序,写出 Linux 下 X64 内存映像。请运行“LinkAddress -u 学号 姓名” 按地址顺序写出各符号的地址、空间。并按照 Linux 下 X64 内存映像标出其所属各区。请按顺序写出 LinkAddress 从开始执行到 main 前/后执行的子程序的名字。 (gcc 与 objdump/GDB/EDB)
第2章 实验预习
2.1 ELF文件格式解读
请按顺序写出ELF格式的可执行目标文件的各类信息(5分)
2.2程序的内存映像结构
请按照内存地址从低到高的顺序,写出Linux下X64内存映像(5分)
2.3程序中符号的位置分析
请运行“LinkAddress -u 学号 姓名” 按地址顺序写出各符号的地址,并按照Linux下X64内存映像标出其所属内存区段(5分)
所属区 各符号的地址、空间(地址从小到大)
2.4程序运行过程分析
请按顺序写出LinkAddress从开始执行到main前/后执行的子程序的名字(使用gcc与objdump/GDB/EDB)(5分)
第3章 各阶段的原理与方法
每阶段40分,phasex.o 20分,分析20分,总分不超过80分
3.1 阶段1的分析
程序运行结果截图:
分析与设计的过程:
首先我们将没有修改过的phase1.o和main.o链接,并输出结果,可以发现是一段乱码,我们猜想如果把这一段乱码改成学号就可以输出我们需要的结果。
因此我们可以使用hexedit读取phase.o的信息,可以发现一段字符串如下:
我们发现这里有一段字符串和输出的字符串是一致的,那么就可以猜测将这一段字符串的前面一部分改成学号即可,而学号最后需要一个0x00标志字符串输出结束,那么我们可以得到如下的修改结果,
将修改过的phase1.o和main.o链接即可得到结果。
3.2 阶段2的分析
程序运行结果截图:
分析与设计的过程:
首先,根据ppt提示这一问我们需要修改.text的内容,那么首先我们先查看phase2.o的反汇编如下,我们可以发现我们需要调用的函数的逻辑是根据一个输入参数和一个事先定义好的变量进行比较,如果相等的话就输出,如果不相等的话就不输出并退出函数。这也和PPT上的提示相一致。
由于我们需要输出的是学号,因此我们可以大胆猜测已经定义好的变量存储的就是我们的学号,我们可以进行验证。首先将phase2.o和main.o进行链接之后查看其中的一些变量的值。
可以发现我们需要调用的函数在进行链接之后的反汇编如上图所示,我们发现它向栈中压入了两个值,一个是0x804a07c,另外一个是0x8(%ebp),那么显然前一个是已经定义好值的变量,后一个使我们需要输入的变量,我们可以使用gdb查看一下前一个变量存储的值,如下:
我们发现这个值就是我们需要输出的信息,因此下一步我们只需要将0x8(%ebp)也修改成这个值就可以了,因此下一步我们可以开始修改do_phase函数的内容。这个函数有两部分功能:首先是将学号存储的内存地址存储在一个寄存器之后压栈,第二步是调用lpqWzYWG函数,因此我们可以写出我们需要加入的汇编代码如下:
主要的思路就是直接将%eax指向存储了我们学号的地址,并将其压栈,这样的话调用我们的函数的时候0x8(%ebp)指向的地址就是存储了我们学号的地址,这样比较的话就可以成功。第三行的思路是首先找到do_phase函数在phase2.o中的地址是0x34,而lpqWzYWG的地址是0x00,二者的差值是0xffffffbe,因此我们用这个指令可以直接调用lpqWzYWG。到此我们的汇编代码编写完成,以下就是修改do_phase部分。
上一步生成的机器码如下:
我们只需要将生成的机器码填写到phase2.o中的nop部分即可,我们可以得到相关部分修改后的机器码如下:
这时候我们的phase2.o也就修改完成了,只需要将它与main.o链接之后生成linkbomb2即可,如下图所示:
3.3 阶段3的分析
程序运行结果截图:
分析与设计的过程:
首先我们得知我们需要做的就是符号解析,我们可以先看一下do_phase的反汇编代码,如下:
里面出现了一个地址,我们直接查看%ebp-0x17地址的内容,我们发现了一个字符串,这个就是我们的COOKIE字符串,我们可以先把它转换成ascii码如下:100 101 122 113 114 102 119 106 116 112,这个也就是我们需要输出的学号在全局变量字符串中的索引。
我们可以查看全局变量数组的名字,我们发现它的名字为WzDTGpmQDa:
因此我们需要做的就是把100 101 122 113 114 102 119 106 116 112改为学号,因此可以写出如下c语言代码:
将这个代码编译之后与phase3.o和main.o链接就可以得到我们需要的结果。
3.4 阶段4的分析
程序运行结果截图:
分析与设计的过程:
3.5 阶段5的分析
程序运行结果截图:
分析与设计的过程:
第4章 总结
4.1 请总结本次实验的收获
对于链接有了更加深刻的了解,对于链接的一些基本形式也都进行了实际操作,加深了印象
4.2 请给出对本次实验内容的建议
PPT里可以多一些展示的环节,同时PPT中可以更多一些教学的内容
注:本章为酌情加分项。
参考文献
为完成本次实验你翻阅的书籍与网站等
标签:分析,计算机系统,1.2,学号,地址,哈工大,实验,我们 来源: https://www.cnblogs.com/Zhengsh123/p/15856389.html