计算机系统实验六:程序的链接

2023-11-11

参考教材:计算机系统基础 第二版 袁春风 机械工业出版社
参考慕课:计算机系统基础(四):编程与调试实践 https://www.icourse163.org/learn/NJU-1449521162

计算机系统实验导航

实验一:环境安装 https://blog.csdn.net/weixin_46291251/article/details/122477054

实验二:数据的存储与运算 https://blog.csdn.net/weixin_46291251/article/details/122478255

实验三:程序的机器级表示 https://blog.csdn.net/weixin_46291251/article/details/122478979

实验四:二进制程序逆向工程 https://blog.csdn.net/weixin_46291251/article/details/122479554

实验五:缓冲区溢出攻击 https://blog.csdn.net/weixin_46291251/article/details/122479798

实验六:程序的链接 https://blog.csdn.net/weixin_46291251/article/details/122480049

实验源码: xxx

准备

实验内容:

1 链接与 ELF 实验的内容、方法和基本步骤;
2 程序链接的作用与过程、ELF 文件格式组成等知识的回顾与应用。

实验目标:

1 加深对程序链接中符号解析、重定位等基本概念、位置无关代码和 ELF 文件的基本组成等方面知识的理解和掌握;
2 掌握计算机系统思维,理解高级语言中数据、运算、过程调用和 I/O 操作等在计算机系统
中的实现方法,将程序设计、汇编语言、系统结构、操作系统、编译链接中的重要概念贯穿起来。能够对计算机系统复杂工程问题制定解决方案
3 掌握各种开源的编译调试工具,能够对分析优化程序设计,提高在代码调试、性能提升、软件移植和鲁棒性等方面的能力。

实验任务:

1 学习 MOOC 内容

https://www.icourse163.org/learn/NJU-1449521162
第七周 程序的链接
第 1 讲 链接与 ELF 实验:概述
第 2 讲 链接与 ELF 实验:静态数据与 ELF 数据节
第 3 讲 链接与 ELF 实验:指令与 ELF 代码节及课后实验

2 完成作业

2.1修改二进制可重定位目标文件“phase1.o”的数据节内容(不允许修改 其他节),使其与main.o链接后运行时输出自己的学号:

2.2实验内容:修改二进制可重定位目标文件“phase2.o”的代码节内容(不允许修改 其它节),使其与main.o链接后运行输出自己的学号:

phase1:静态数据对象与 ELF 数据节

第一步.

使用objdump工具获得目标文件的汇编代码,使用readelf工具获得其重定位记录。
首先对程序进行链接并执行,查看输出结果:
在这里插入图片描述

然后用objdump对phase1.o进行反汇编,查看输出结果:
分析反汇编后的文件:
在这里插入图片描述

选中的两行实现了对常数0x9a进行压栈操作。

然后用readelf -r 查看phase.o对应的信息

然后分析phase1.o中出现的重定位记录:

在这里插入图片描述

R_386_PC32PC绝对地址重定位方式下,重定位后的引用地址=符号定义地址-符号引用所在地址+重定位前引用处的初始值

第二步.

结合并分析汇编代码与重定位信息,定位输出函数的调用参数在目标 文件中的存储地址
使用readelf工具查看.data节中相应偏移量(0x29)处的字符串内容,并与未修改的phase1.o模块链接生成的程序输出的字符串比较,确定该字符串为修改的目标。

利用readelf -x .data phase1.o获得模块1指定节的内容:
在这里插入图片描述

上述在data节中对应0x9a偏移量地址对应的字符串与前面执行程序输出的字符串一致,可见输出字符串对应的地址确实是data节中的0x9a

第三步.

使用hexedit工具,对phase1.o模块的数据节中相应字节进行修改。

下面使用hexedit工具对目标模块phase1.o中输出字符串内容进行修改:

首先利用readeif -S phase1.o 查看data节的偏移量
在这里插入图片描述

由上图可知,data节在文件中的偏移量为0x60.
所以输出字符串在文件中的偏移量为0x60 + 0x9a = 0xfa

然后利用hexedit工具打开phase1.o模块
定位到偏移量为0xfa的字节处:
在这里插入图片描述

现在把输出字符串从第一个字节开始,依次替换为需要输出的学号对应的字符串,1对应的编码为31后面依次类推,输入完学号后,最后加上00作为字符串结束的标志。然后ctrl+x保存退出即可。
在这里插入图片描述

以上就完成了对phase1.o的修改。

第四步.

重新链接phase1.o模块和main.o模块,运行生成的可执行程序,验证修改是否完成了实验的目标。
在这里插入图片描述

验证了前面对字符串的修改,达到了实验目标。

phase2:指令与 ELF 代码节

第一步.

使用objdump工具获得phase2.o目标模块的汇编代码,使用readelf工具获得其重定位记录和符号表。
首先对程序进行链接,然后运行查看结果:
在这里插入图片描述

由以上结果可知,默认phase2不输出任何信息。

然乎利用objdump对phase2进行反汇编,并查看代码:
在这里插入图片描述

然乎利用readelf查看phase2中出现的重定位记录:
在这里插入图片描述

第二步.

分析汇编代码并结合重定位信息、符号表,推断phase2.o模块中各函数的功能作用,定位出其中负责输出的函数。
在获得了phase2.o目标模块的汇编代码和重定位记录知之后,进一步分析该模块中各个函数的功能。

首先在phase2.o代码节中找到包含有类似puts输出函数调用的函数
利用less工具查看反汇编代码phase2.o,利用其查找功能查找call指令出现的位置:
在这里插入图片描述

然后查找重定位表
在这里插入图片描述

发现其对应puts函数。
所以调用puts语句的函数即为输出字符串的函数这里是(00000061 :)
然后就可以在phase2模块的dophase函数中调用kfSvKnbh函数以实现字符串的输出

下面从符号表中获得目标函数在.text节中的偏移量(这里是0x61)
利用readelf查看phase2的符号表
在这里插入图片描述

可以看出这个函数对应编号为1的节,大小为48。
然后利用readelf查看得到编号为1的节是text节。
在这里插入图片描述

所以目标函数位于text节中偏移量为0x61的位置上。

kfSvKnbh函数具有LOCAL链接绑定属性,故调用该函数可通过相对于PC值的偏移量来进行跳转,不需要构造相应的重定位记录进行配合。

第三步.

构造调用输出函数的指令代码。
分析目标函数kfSvKnbh的执行逻辑:

在这里插入图片描述

查看第一个call语句的重定位记录可知其调用的是strcmp函数,strcmp函数比较传递给它的两个字符串参数的内容是否相同,如果相同的话将返回0,如不同则返回非0的一个数。

当存放于EAX寄存器中的、strcmp函数的返回值等于0,即两个字符串相同时,将执行jne跳转指令后的参数压栈指令和调用puts函数的另一call指令。这个call对应的就是puts输出函数,被输出的、传递给puts函数的参数字符串地址就是传递给kfSvKnbh函数的第二个参数。

综上所述:
为了正确调用ecRIvzPzKN函数完成学号字符串的输出,需要完成两个任务:
1.确保ecRIvzPzKN函数中传递给strcmp函数的两个参数字符串,在内容上相同。
2.结合重定位记录确定用于strcmp函数进行字符串比较的内置字符串在phase2.o中的存放位置,进一步获得字符串内容。

可以看到先压入栈的偏移量的位置对应一个重定位记录如下:
在这里插入图片描述

结合重定位记录确定内置字符串在phase2.o中的存放位置,进一步使用readelf工具输出模块中 .rodata节的内容:
在这里插入图片描述

获得其内容为“MSLuleX.” 
内置字符串地址 = .rodata节起始地址 + 引用处的初始值0x2

然后在栈中构造与内置字符串和学号字符串内容相同的局部字符串变量,并将其地址作为实参压入栈中 。
构造在do phase函数中,调用kfSvKnbh函数的机器指令代码
指令内容:在栈中构造和初始化两个字符串局部变量,使其内容相同于程序内置的比较字符串"MSLuleX"和待输出的学号字符串“123456789" 。

可以利用sub指令先分配两个字符串的存储空间,然后使用一组move指令对两个字符串的内容按照前面分析的结果进行设置。然后用push指令将两个字符串的地址作为参数压入栈中。并进一步使用call指令调用目标函数。
在这里插入图片描述

然后利用as工具进行汇编,再利用objdump进行反汇编并查看:
在这里插入图片描述

第五步.

使用上步构造的调用输出函数的指令代码,替换do_ _phase()函数体中的nop指令,以实现期望输出。

使用readelf工具及其“-S”命令行选项获得节头表,从中获得.text在phase2.o中偏移量为 0x34
在这里插入图片描述

进一步得到函数中插入指令代码的位置为:
0x34 + 0xcf = 0xc8 (0xcf是do_phase函数中第一个被替换的nop指令的偏移量)

使用hexedit将phase2.o文件中上述位置0xc8起始的字节内容(原为nop指令代码0x90) 替换为调用指令代码序列
在这里插入图片描述

然后使用调用输出函数的指令代码,替换do_phase()函数体中的nop指令,以获得期望输出。

最后重新链接、生成和运行程序,验证修改有效:
在这里插入图片描述

可见,成功完成了目标。

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

计算机系统实验六:程序的链接 的相关文章

  • 在主目录中安装库

    在 Linux Ubuntu 中 我尝试运行一个工具 但它显示错误 库丢失 我无权在系统中安装任何内容 或者根本无法从我的用户帐户执行 sudo 是否可以在我的主目录 没有 sudo 中安装缺少的库 在我的例子中为 libstdc so 6
  • PHP 致命错误:未找到“MongoClient”类

    我有一个使用 Apache 的网站 代码如下 当我尝试访问它时 我在 error log 中收到错误 PHP Fatal Error Class MongoClient not found 以下是可能错误的设置 但我认为没有错误 php i
  • 如何更改 Ubuntu 14.04 上的 php-cli 版本?

    我是 Linux 新手 在篡改时破坏了一些 php 设置 如果我执行一个包含以下内容的 php 脚本 phpinfo 它显示 php 版本为 5 6 但通过命令行 如果我运行php v它返回 7 0 版本 我想让两个版本匹配 我怎样才能修复
  • 并行运行 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 poll()不断返回

    我有一个特别的问题 当我知道没有什么可读时 民意调查不断返回 因此设置如下 我有 2 个文件描述符 它们构成fd设置民意调查监视 一种用于引脚从高到低的变化 GPIO 另一个用于代理输入 代理输入出现问题 处理的顺序是 启动main函数 然
  • 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
  • 修改linux下的路径

    虽然我认为我已经接近 Linux 专业人士 但显然我仍然是一个初学者 当我登录服务器时 我需要使用最新版本的R 统计软件 R 安装在 2 个地方 当我运行以下命令时 which R I get usr bin R 进而 R version
  • 为什么我收到“无法进行二进制日志记录”的信息。在我的 MySQL 服务器上?

    当我今天启动 MySQL 服务器并尝试使用以下命令进行一些更改时用于 MySQL 的 Toad http www quest com toad for mysql 我收到此消息 MySQL 数据库错误 无法进行二进制日志记录 消息 交易级别
  • Bash 解析和 shell 扩展

    我对 bash 解析输入和执行扩展的方式感到困惑 对于输入来说 hello world 作为 bash 中的参数传递给显示其输入内容的脚本 我不太确定 Bash 如何解析它 Example var hello world displaywh
  • Linux 中的无缓冲 I/O

    我正在写入大量的数据 这些数据数周内都不会再次读取 由于我的程序运行 机器上的可用内存量 显示为 空闲 或 顶部 很快下降 我的内存量应用程序使用量不会增加 其他进程使用的内存量也不会增加 这让我相信内存正在被文件系统缓存消耗 因为我不打算
  • 通过特定分隔符删除字符串

    我的文件中有几列 其中第二列有 分隔符 我想删除第二列中的第一个 第三个和第四个字符串 并将第二个字符串留在该列中 但我有正常的分隔符空间 所以我不知道 input 22 16050075 A G 16050075 A G 22 16050
  • GLIBCXX_3.4.26 未找到在 BeagleBone 上运行交叉编译的程序

    我有以下程序 include
  • 如何禁用 GNOME 桌面屏幕锁定? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何阻止 GNOME 桌面在几分钟空闲时间后锁定屏幕 我已经尝试过官方手册了在红帽 https access redhat com doc
  • 我可以从命令行打印 html 文件(带有图像、css)吗?

    我想从脚本中打印带有图像的样式化 html 页面 谁能建议一个开源解决方案 我使用的是 Linux Ubuntu 8 04 但也对其他操作系统的解决方案感兴趣 你可以给html2ps http user it uu se jan html2
  • 从 Python 调用 PARI/GP

    我想打电话PARI GP http pari math u bordeaux fr dochtml gpman html仅从Python计算函数nextprime n 对于不同的n是我定义的 不幸的是我无法得到帕里蟒蛇 http code
  • Linux中的定时器类

    我需要一个计时器来以相对较低的分辨率执行回调 在 Linux 中实现此类 C 计时器类的最佳方法是什么 有我可以使用的库吗 如果您在框架 Glib Qt Wx 内编写 那么您已经拥有一个具有定时回调功能的事件循环 我认为情况并非如此 如果您
  • 所有平台上的java

    如果您想用 java 为 Windows Mac 和 Linux 编写桌面应用程序 那么所有这些代码都相同吗 您只需更改 GUI 即可使 Windows 应用程序更像 Windows 等等 如果不深入细节 它是如何工作的 Java 的卖点之
  • 如何有效截断文件头?

    大家都知道truncate file size 函数 通过截断文件尾部将文件大小更改为给定大小 但是如何做同样的事情 只截断文件的尾部和头部呢 通常 您必须重写整个文件 最简单的方法是跳过前几个字节 将其他所有内容复制到临时文件中 并在完成
  • nslookup 报告“无法解析 '(null)': 名称无法解析”,尽管它成功解析了 DNS 名称

    我在 ubuntu 上 并且正在运行 docker 默认桥接网络 我有 Zookeeper kafka 的容器化版本 以及我编写的与 kafka 对话的应用程序 I do a docker exec it
  • arm64和armhf有什么区别?

    Raspberry Pi Type 3 具有 64 位 CPU 但其架构不是arm64 but armhf 有什么区别arm64 and armhf armhf代表 arm hard float 是给定的名称Debian 端口 https

随机推荐

  • 【6】Docker中部署Nginx

    1 拉取 Nginx 镜像 docker pull nginx latest 就是最新版本的 nginx 版本 2 创建 守护方式的 Nginx 容器 docker run di name nginx p 80 80 nginx 在第5篇
  • Typora设置标题自动添加序号

    Typora设置标题自动添加序号 文件 偏好设置 打开主题文件夹 设置css样式 创建文件base user css initialize css counter write counter reset h1 h1 counter rese
  • HW溯源反制

    windows 跳板服务器溯源 windows security日志 rdp 日志 里面能够拿到security或者rdp日志的ip信息 假如对方跳板是win 的话 顺藤摸瓜可以拿到对方真实连跳板的ip 然后需要注意的是 假如对方用的是随机
  • Tomcat优化集群

    1 分配给Tomcat足够大的内存空间 压解版本中 文件位置 bin catalina bat 这里增加了 set JAVA OPTS Xms1024m Xmx1024m XX PermSize 128M XX MaxPermSize 25
  • 2023通信工程专业毕业设计题目选题推荐

    文章目录 1前言 2 如何选题 2 1 移动通信方向 2 2 嵌入式开发方向 2 3 人工智能方向 2 4 物联网方向 2 5 算法研究方向 2 6 移动应用开发方向 2 7 网络通信方向 2 8 学长作品展示 4 最后 1前言 近期不少学
  • 技术至简-2:分集与交织

    分集 先开分后集合 空间 把数据分到不同的空间进行传输 频率 把数据分到不同的载频进行传输 时间 把数据分到不同的时隙进行传输 交织 分与合数据的方法 按比特的位置连续 分组 按比特的位置间隔 交织
  • Java常用包9

    下面列出了Java常用包 可以查找该包下面的常用类 可以查看该类的常用方法使用源码 模块 项目数 1 rx functions 有 21 个常用类 2 org springframework beans factory config 有 3
  • 20060217: 联合国的人权报告毫无根据?

    那你美国的人权报告就有根据了 环球时报 引用的不是 中韩观点 而是事实 转载于 https www cnblogs com yidinghe archive 2006 02 17 332220 html
  • 前端 h5实现自带浏览器支付功能

    前端需要做的 这里使用vue 中的 mixin 第一步获取订单号 调用后端的接口获取订单号 第二步 调用后端的接口 后端给返回一个url地址 然后打开这个地址 这个地址是调用微信支付的地址 打开即调用 这里使用decodeURICompon
  • Nginx配置origin限制跨域请求

    Nginx需要修复一个安全漏洞 这个需要根据客户端传递的请求头中的Origin值 进行安全的跨站策略配置 目的是对非法的origin直接返回403错误页面 配置如下 1 在http中定义一个通过map指令 定义跨域规则并返回是否合法 htt
  • SQL中的替换函数replace()使用

    语法REPLACE string expression string pattern string replacement 参数string expression 要搜索的字符串表达式 string expression 可以是字符或二进制
  • 【大数据分析与挖掘】挖掘建模之关联分析

    文章目录 一 关联规则 1 1 常用的关联规则算法 1 2 Apriori算法介绍 1 2 1 关联规则与频繁项集 1 2 2 Apriori算法的思想与性质 1 2 3 Apriori算法的实现的两个过程 1 2 4 Apriori算法的
  • PicGo+阿里云Oss图床

    首先说一下我为什么使用阿里云 我之前是用gitee做图床 后面被限制了 图片也访问不了 阿里云这个5块钱可以用半年 还是很便宜的 主要不会突然见不能用 文章目录 PicGo下载 阿里云Oss图床的配置 PicGo下载 PicGo2 3 0
  • Linux:查看进程+杀死进程

    查看进程 ps 查看所有进程状态 ps aux 参数 a 显示所有进程 包括其他用户的进程 u 用户以及其他详细信息 x 显示没有控制终端的进程 查看本用户的进程及其状态 ps u 状态 1 R 运行 表示进程正在运行或在允许队列中等待 2
  • Leetcode 704 二分查找

    Leetcode 704 二分查找 题目描述 给定一个 n 个元素有序的 升序 整型数组 nums 和一个目标值 target 写一个函数搜索 nums 中的 target 如果目标值存在返回下标 否则返回 1 示例1 输入 nums 1
  • Pr零基础入门指南笔记二-----------(粗剪、精剪、导出视频)

    目录 1 粗 精剪辑步骤 2 粗剪详细步骤 1 预览和挑选素材 2 调整素材顺序 3 精确修建素材 4 添加背景音乐 3 导出视频 干货 PR零基础入门指南第三集 10分钟学会PR基本剪辑 剪辑步骤 快捷操作大分享 哔哩哔哩 bilibil
  • 版本发布规范

    版本发布命名规范 版本命名规范 软件版本号有四部分组成 第一部分为主版本号 第二部分为次版本号 第三部分为修订版本号 第四部分为日期版本号加希腊字母版本号 希腊字母版本号共有五种 分别为base alpha beta RC release
  • Unity Shader初学——《Unity Shader入门摘要》

    由于项目需要加上本人兴趣 所以开始学习shader相关知识 主要参考冯乐乐的 Unity Shader入门摘要 作者的博客在此 https blog csdn net candycat1992 作者的个人网站 http candycat19
  • 【论文笔记】ICNet:用于无监督医学图像配准的逆一致性模型

    本文是文章 Inverse Consistent Deep Networks for Unsupervised Deformable Image Registration 的阅读笔记 过去基于学习的配准方法忽略了图像之间转换的逆一致性 并且
  • 计算机系统实验六:程序的链接

    参考教材 计算机系统基础 第二版 袁春风 机械工业出版社 参考慕课 计算机系统基础 四 编程与调试实践 https www icourse163 org learn NJU 1449521162 计算机系统实验导航 实验一 环境安装 htt