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

这篇具有很好参考价值的文章主要介绍了计算机系统基础、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)首先我要以下代码,然而会出现一堆乱码

linklab实验,linux,服务器,编辑器

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

我的是0×60+0=0×60处
linklab实验,linux,服务器,编辑器

(3)用hexedit phase1.o命令来修改phase1.o,并对phase1.o数据节中相应字节进行修改
linklab实验,linux,服务器,编辑器

(4)删除前一个linkbomb,生成新的linkbomb,最后重新输出得到我们要的结果:
linklab实验,linux,服务器,编辑器

实验阶段2

(1)输入readelf -a phase1.o 查看elf文件内容
linklab实验,linux,服务器,编辑器

(2)可以发现COM未被赋初始值,需要打补丁phase2_patch.o
linklab实验,linux,服务器,编辑器

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

linklab实验,linux,服务器,编辑器

推算出学号

linklab实验,linux,服务器,编辑器
linklab实验,linux,服务器,编辑器

实验阶段3

(1)objdump -d phase3.o 编译查看汇编代码
(2)根据编程思想要打印学号,那肯定打印在后,所以包含puts语句的myFunc1方法在后面,接收一个参数,这个参数应该是学号
linklab实验,linux,服务器,编辑器

(3)myFunc2获取一个地址的值给到%rax寄存器
linklab实验,linux,服务器,编辑器

(4)那就是先调用myFunc2函数获取学号赋值给%rax,然后mov %rax,%rdi设置参数在调用myFunc1。
需要注入的命令是call myFunc2mov %rax,%rdicall myFunc1call
call指令对应的机器码是e8 xx xx xx xx。
linklab实验,linux,服务器,编辑器

(5)0x400593:e8 xx xx xx xx
0x400598:(下一条指令的地址)
MyFunc2的地址是0x40057d,计算0x400559到0x40057d的偏移量是-1b,即ff ff ff e5
linklab实验,linux,服务器,编辑器

(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
linklab实验,linux,服务器,编辑器

(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数据
linklab实验,linux,服务器,编辑器

objdump命令查看phase3.o
linklab实验,linux,服务器,编辑器

(8)所以我们要注入的位置就是0x40+0x31=0x71
Hexedit phase3.o
将机器码写入0x71
linklab实验,linux,服务器,编辑器

(9)根据前面的我们可以推出.data节是0x1a0,给学号赋值
linklab实验,linux,服务器,编辑器

(10)编译运行查看结果

linklab实验,linux,服务器,编辑器

实验阶段4

(1)readelf -o phase4.o 命令查看,查看phase4.o文件ELF数据
linklab实验,linux,服务器,编辑器

(2)要修改这里的偏移值
从下图可以看出
linklab实验,linux,服务器,编辑器

(3)一个是变量g_myCharArray一个是变量temp还有一个puts函数且g_myCharArray是位于.data节中偏移量为0(即value值)处temp是位于.data节中偏移量为0x14(即value值)处编译查看汇编代码
linklab实验,linux,服务器,编辑器

用objdump查看汇编代码
linklab实验,linux,服务器,编辑器

(4)观察可得,偏移量是要使变量和函数到0x6,0x11,0x19
需要把puts - 4的值设置成19
通过readelf命令得知开始为250
linklab实验,linux,服务器,编辑器

重新查看汇编代linklab实验,linux,服务器,编辑器

值已经更改
重新编译查看汇编代码
linklab实验,linux,服务器,编辑器

(5)根据思考,0x11应该放学号数组,因为要赋值给%rdi传递给puts函数打印,0x6应该放temp回到上面已经发现”.data+10”(temp)组偏移量是这里,修改为6
linklab实验,linux,服务器,编辑器

.data+0”组偏移量是这里,修改为11
linklab实验,linux,服务器,编辑器

(6)编译运行查看结果

linklab实验,linux,服务器,编辑器

实验阶段5

(5)编译查看汇编代码

linklab实验,linux,服务器,编辑器
(2)此时可以发现myFunc是关键函数,用gdb调试
linklab实验,linux,服务器,编辑器

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

linklab实验,linux,服务器,编辑器

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

linklab实验,linux,服务器,编辑器

(5)观察发现只要将0x601050和0x601040换一下就可以了,找到偏移量了,互换即
linklab实验,linux,服务器,编辑器

编译gdb调试
linklab实验,linux,服务器,编辑器

(6) 成功调换
接下来更改数据为学号
linklab实验,linux,服务器,编辑器

(7)从这里可以开出g_myCharArray是一个位于.data中偏移量为0x10处的
.data在0x90处
linklab实验,linux,服务器,编辑器

所以g_myCharArray在0xA0处,修改为学号
linklab实验,linux,服务器,编辑器

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

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

到了这里,关于计算机系统基础、LinkLab实验每个实验阶段(共5个)考察ELF文件组成与程序链接过程的不同方面知识 阶段1:全局变量ó数据节 阶段2:强符号与弱符号ó数据节 阶段3:代码节修改 阶段4:代码与重定的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 计算机操作系统实验:进程调度实验

    计算机操作系统实验:进程调度实验

    前言 二、实验目的 三、实验要求 四、实验原理 五、实验过程 六、代码详解 总结 计算机操作系统是管理计算机硬件和软件资源的核心软件,它负责为用户提供一个友好、高效、安全的使用环境。进程调度是操作系统的一个重要功能,它决定了进程在处理器上的执行顺序和时

    2024年02月07日
    浏览(9)
  • 计算机系统实验二——bomblab(炸弹实验)

    bomblab 使用gdb工具 反汇编 出汇编代码,结合c语言文件找到每个关卡的 入口函数 。然后分析汇编代码,分析得到每一关的通关密码。 进一步加深对linux指令的理解,对 gdb调试 的一些基本操作以及高级操作有所了解。 熟悉汇编程序,懂得如何利用汇编程序写出C语言程序伪代

    2023年04月20日
    浏览(4)
  • 计算机系统装配与集成实验

    计算机系统装配与集成实验

    1.通过学习、查阅/寻找资料,培养学生获取有关计算机组装的技术、工艺及测试方法、驱动程序的能力。 2.培养学生计算机硬件系统的拆卸、安装、故障排除,操作系统安装与设置,驱动程序加载,技术指标测试等方面的能力,获得计算机系统维护的基本训练。 3.培养学生遵

    2024年02月11日
    浏览(3)
  • 实验四-Shelllab实验(csapp、计算机系统外壳实验)

    实验四-Shelllab实验(csapp、计算机系统外壳实验)

    1、首先明确实验目的: ·总的来说就是让我们补充位于tsh.c中的七个函数,从而实现一个支持任务功能的shell。 因此在这儿将这七个函数分为两部分: (1)实现完成内建命令(jobs、fg、bg、kill)的四个函数:    接着再来了解一下tsh支持的四个内置命令: ·Q uit: 命令终止

    2024年02月05日
    浏览(8)
  • 计算机视觉实验:人脸识别系统设计

    计算机视觉实验:人脸识别系统设计

    设计 计算机视觉目标识别系统,与实际应用有关(建议:最终展示形式为带界面可运行的系统),以下内容选择其中一个做。 1. 人脸识别系统设计 (1) 人脸识别系统设计(必做):根据课堂上学习的理论知识(包括特征提取、分类器设计),设计一个人脸识别系统,该系统具

    2024年02月14日
    浏览(7)
  • 深入理解计算机系统AttackLab实验

    深入理解计算机系统AttackLab实验

    实验目的与要求 强化机器级表示、汇编语言、调试器和逆向工程等方面基础知识,并结合栈帧工作原理实现简单的栈溢出攻击,掌握其攻击的基本方式和原理,进一步为编程过程中应对栈溢出攻击打下一定的基础。 理解缓冲区的工作原理和字符填充过程及其特点。对于无边

    2024年02月04日
    浏览(8)
  • 计算机系统(3) 实验一:MIPS64位指令集实验

    计算机系统(3) 实验一:MIPS64位指令集实验

    一、   实验目标: 了解WinMIPS64的基本功能和作用; 熟悉MIPS指令、初步建立指令流水执行的感性认识; 掌握该工具的基本命令和操作,为流水线实验作准备。 二、实验内容 按照下面的实验步骤及说明,完成相关操作 记录实验过程的截图 : 1)下载WinMIPS64;运行样例代码并

    2024年02月07日
    浏览(6)
  • 计算机操作系统实验-进程调度模拟算法

    进程调度是处理机管理的核心内容。本实验要求用高级语言编写模拟进程调度程序,以 便加深理解有关进程控制快、进程队列等概念,并体会和了解优先数算法和时间片轮转算法 的具体实施办法。 1.设计进程控制块 PCB 的结构,通常应包括如下信息: 进程名、进程优先数(

    2024年02月05日
    浏览(37)
  • 计算机组成原理实验二 存储系统预习报告

    计算机组成原理实验二 存储系统预习报告

    掌握静态随机存储器 RAM  工作特性及数据的读写方法。 基于信号时序图,了解读写静态随机存储器的原理。 1、阅读实验指导书,然后回答问题。 实验所用的静态存储器由一片 6116( 2K*8bit  )构成(位于MEM 单元),6116 有三个控制线:CS 表示( 片选线  ) ,   OE 表示

    2023年04月15日
    浏览(8)
  • 计算机系统结构与操作系统实验三(6)-内存管理

    计算机系统结构与操作系统实验三(6)-内存管理

    实现内存管理 这里修改makefile文件和run.sh文件 在《操作系统真相还原源码》的基础上稍加修改makefile 注意:这里要用 make all 命令来执行makefile文件了 本实验所有源码👉👉👉 计算机系统结构与操作系统实验三bochs源代码

    2024年02月15日
    浏览(8)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包