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

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 原始套接字的 RX 环大小限制为 4GB?

    背景 我试图mmap 我的原始套接字的 RX 环形缓冲区64 bitLinux 应用程序 我的环由 4096 个块组成 每个块大小为 1MB 总共 4GB 请注意 每个 1MB 块中可以有许多帧 如果您好奇 请参阅此文档了解背景信息 htt
  • Linux 中 m 标志和 o 标志将存储在哪里

    我想知道最近收到的路由器通告的 m 标志和 o 标志的值 从内核源代码中我知道存储了 m 标志和 o 标志 Remember the managed otherconf flags from most recently received R
  • ALSA:snd_pcm_writei 调用时缓冲区不足

    当运行我最近从灰烬中带回来的旧程序时 我遇到了缓冲区不足的情况 该程序将原始声音文件完全加载到内存中 2100 字节长 525 帧 并准备 ALSA 进行输出 44 1khz 2 通道 有符号 16 位 if err snd pcm set
  • docker 非 root 绑定安装权限,WITH --userns-remap

    all 尝试让绑定安装权限正常工作 我的目标是在容器中绑定安装卷 以便 a 容器不以 root 用户身份运行入口点 二 docker daemon 配置了 userns remap 这样容器 主机上没有 root c 我可以绑定挂载和读 写
  • 在 .gitconfig 中隐藏 GitHub 令牌

    我想将所有点文件存储在 GitHub 上 包括 gitconfig 这需要我将 GitHub 令牌隐藏在 gitconfig 中 为此 我有一个 gitconfig hidden token 文件 这是我打算编辑并放在隐藏令牌的 git 下
  • 如何在linux中以编程方式获取dir的大小?

    我想通过 C 程序获取 linux 中特定目录的确切大小 我尝试使用 statfs path struct statfs 但它没有给出确切的大小 我也尝试过 stat 但它返回任何目录的大小为 4096 请建议我如何获取 dir 的确切大小
  • GMail 421 4.7.0 稍后重试,关闭连接

    我试图找出为什么它无法使用 GMail 从我的服务器发送邮件 为此 我使用 SwiftMailer 但我可以将问题包含在以下独立代码中
  • 尽管 if 语句,Visual Studio 仍尝试包含 Linux 标头

    我正在尝试创建一个强大的头文件 无需更改即可在 Windows 和 Linux 上进行编译 为此 我的包含内容中有一个 if 语句 如下所示 if defined WINDOWS include
  • 如何根据标签将单个 XML 文件拆分为多个

    我有一个带有标签的 XML 文件 我想像这样分割文件
  • 使用 MAX_ORDER / 包含 mmzone.h

    根据https www kernel org doc Documentation networking packet mmap txt https www kernel org doc Documentation networking pa
  • 如何让R使用所有处理器?

    我有一台运行 Windows XP 的四核笔记本电脑 但查看任务管理器 R 似乎一次只使用一个处理器 如何让 R 使用全部四个处理器并加速我的 R 程序 我有一个基本系统 我使用它在 for 循环上并行化我的程序 一旦您了解需要做什么 此方
  • 内核的panic()函数是否完全冻结所有其他进程?

    我想确认内核的panic 功能和其他类似kernel halt and machine halt 一旦触发 保证机器完全冻结 那么 所有的内核和用户进程都被冻结了吗 是panic 可以被调度程序中断吗 中断处理程序仍然可以执行吗 用例 如果
  • C修改printf()输出到文件

    有没有办法修改printf为了将字符串输出到文件而不是控制台 我尝试在互联网上查找一些内容 发现了类似的电话dup dup2 and fflush这可能与此有关 EDIT 也许我不清楚 问题是这是C考试问题 问题如下 解释一个通常将字符串输
  • 如何查找哪个 Yocto 项目配方填充图像根文件系统上的特定文件

    我经常与 Yocto 项目合作 一个常见的挑战是确定文件为何 或来自什么配方 包含在 rootfs 中 这有望从构建系统的环境 日志和元数据中得出 理想情况下 一组命令将允许将文件链接回源 即配方 我通常的策略是对元数据执行搜索 例如gre
  • linux下如何从文本文件中获取值

    我有一些文本格式的文件 xxx conf 我在这个文件中有一些文本 disablelog 1 当我使用 grep r disablelog oscam conf 输出是 disablelog 1 但我只需要值1 请问你有什么想法吗 一种方法
  • 如何使用Android获取Linux内核的版本?

    如何在 Android 应用程序中获取 Linux 内核的版本 不是 100 确定 但我认为调用 uname r 需要 root 访问权限 无论如何 有一种不太肮脏的方法可以做到这一点 那就是 System getProperty os v
  • 我什么时候应该编写 Linux 内核模块?

    有些人出于某种原因想要将 Linux 中的代码从用户空间移动到内核空间 很多时候 原因似乎是代码应该具有特别高的优先级 或者只是 内核空间更快 这对我来说似乎很奇怪 我什么时候应该考虑编写内核模块 有一套标准吗 我怎样才能激励将代码保存在
  • 如何在 Mac OSX Mavericks 中正确运行字符串工具?

    如何在 Mac OSX Mavericks 中正确运行字符串工具 我尝试按照我在网上找到的示例来运行它 strings a UserParser class 但我收到此错误 错误 Applications Xcode app Content
  • 尽管我已在 python ctypes 中设置了信号处理程序,但并未调用它

    我尝试过使用 sigaction 和 ctypes 设置信号处理程序 我知道它可以与python中的信号模块一起使用 但我想尝试学习 当我向该进程发送 SIGTERM 时 但它没有调用我设置的处理程序 只打印 终止 为什么它不调用处理程序
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的

随机推荐

  • 【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