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

2023-11-19

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。通过完成此次实验,不仅收获了很多知识,而且还锻炼了我的动手能力。解决了问题,完成了实验,感觉收获满满的,也有一定的成就感。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 标准头文件中的 C 编译器错误 - 未定义的 C++ 定义

    我正在尝试编译 C 程序 但收到许多错误 这些错误是在标准 C 头文件 inttypes h stdio h stat h 等 中遇到的 错误的来源是以下未定义的常量 BEGIN DECLS END DECLS BEGIN NAMESPAC
  • 每个进程每个线程的时间量

    我有一个关于 Windows 和 Linux 中进程和线程的时间量子的问题 我知道操作系统通常为每个线程提供固定的时间量 我知道时间量根据前台或后台线程而变化 也可能根据进程的优先级而变化 每个进程有固定的时间量吗 例如 如果操作系统为每个
  • linux x86 汇编语言 sys_read 调用的第一个参数应为 0 (stdin)

    我正在编写一个简单的汇编程序来从标准输入读取 如 scanf 这是我的代码 section bss num resb 5 section txt global start start mov eax 3 sys read mov ebx 0
  • 如何让“grep”从文件中读取模式?

    假设有一个很大的文本文件 我只想打印与某些模式不匹配的行 显然 我可以使用egrep v patter1 pattern2 pattern3 现在 如果所有这些模式都在一个文本文件中怎么办 最好的制作方法是什么egrep从文件中读取模式 g
  • 从 TypeScript 运行任何 Linux 终端命令?

    有没有办法直接从 TypeScript 类中执行 Linux 终端命令 这个想法是做类似的事情 let myTerminal new LinuxTerminal let terminalResult myTerminal run sudo
  • 让 MongoDB 在 Linux 上监听远程连接

    我已在 Windows 本地计算机上 上成功安装 MongoDB 作为服务 但现在我想将 MongoDb 移动到单独的服务器 所以我将 tarball 解压到网络上的虚拟服务器 运行 Linux 当我从本地计算机使用 PuTTY 连接到服务
  • 归档文件系统或格式

    我正在寻找一种文件类型来存储已退役系统的档案 目前 我们主要使用 tar gz 但从 200GB tar gz 存档中查找并提取几个文件是很麻烦的 因为 tar gz 不支持任何类型的随机访问读取规定 在你明白之前 使用 FUSE 安装 t
  • 如何使用 sed 仅删除双空行?

    我找到了这个问题和答案 https stackoverflow com questions 4651591 howto use sed to remove only triple empty lines关于如何删除三重空行 但是 我只需要对
  • SONAR - 使用 Cobertura 测量代码覆盖率

    我正在使用声纳来测量代码质量 我不知道的一件事是使用 Cobertura 测量代码覆盖率的步骤 我按照以下步骤操作http cobertura sourceforge net anttaskreference html http cober
  • 如何制作和应用SVN补丁?

    我想制作一个SVN类型的补丁文件httpd conf这样我就可以轻松地将其应用到其他主机上 If I do cd root diff Naur etc httpd conf httpd conf original etc httpd con
  • 并行运行 make 时出错

    考虑以下制作 all a b a echo a exit 1 b echo b start sleep 1 echo b end 当运行它时make j2我收到以下输出 echo a echo b start a exit 1 b star
  • 在 Linux 中禁用历史记录 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 要在 Linux 环境中禁用历史记录 我执行了以下命令 export HISTFILESIZE 0 export HISTSIZE 0 u
  • Godaddy 托管上的 CakePHP 控制台

    我一直在努力让我的 CakePHP 网站在 Godaddy 网格托管 帐户上运行 我的蛋糕应用程序设置是从帐户的子目录托管的 并且可以通过子域访问 我必须调整我的 htaccess 文件才能使其正常工作 现在我需要让 CakePHP 控制台
  • Locale.getDefault() 始终返回 en

    unix 机器上的服务器始终使用 en 作为默认区域设置 以下是区域设置输出 LANG en US LC CTYPE C LC NUMERIC C LC TIME C LC COLLATE C LC MONETARY C LC MESSAG
  • Unix 命令列出包含字符串但*不*包含另一个字符串的文件

    如何递归查看包含一个字符串且不包含另一个字符串的文件列表 另外 我的意思是评估文件的文本 而不是文件名 结论 根据评论 我最终使用了 find name html exec grep lR base maps xargs grep L ba
  • 跟踪 Linux 程序中活跃使用的内存

    我想跟踪各种程序在特定状态下接触了多少内存 例如 假设我有一个图形程序 最小化时 它可能会使用更少的内存 因为它不会重新绘制窗口 这需要读取图像和字体并执行大量库函数 这些对象仍然可以在内存中访问 但实际上并没有被使用 类似的工具top它们
  • GLIBCXX_3.4.26 未找到在 BeagleBone 上运行交叉编译的程序

    我有以下程序 include
  • 如何使用 xterm.js 创建基于 Web 的终端以 ssh 进入本地网络上的系统

    我偶然发现了这个很棒的图书馆xterm js https xtermjs org 这也是 Visual Studio Code 终端的基础 我有一个非常普遍的问题 我想通过基于网络的终端 不在网络中 可能位于 aws 服务器上 访问本地网络
  • 从 csv 文件中删除特定列,保持输出上的相同结构[重复]

    这个问题在这里已经有答案了 我想删除第 3 列并在输出文件中保留相同的结构 输入文件 12 10 10 10 10 1 12 23 1 45 6 7 11 2 33 45 1 2 1 2 34 5 6 I tried awk F 3 fil
  • 如何禁用 GNOME 桌面屏幕锁定? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何阻止 GNOME 桌面在几分钟空闲时间后锁定屏幕 我已经尝试过官方手册了在红帽 https access redhat com doc

随机推荐