【计算机系统基础】程序数据与ELF数据节

目录

1. 任务描述

2. 实验阶段

2.1 反汇编+获取重定位记录

2.2 分析

2.3 查看节头表,确定偏移量

2.4 使用hexedit工具修改指定内容

1. 任务描述

        修改二进制可重定位目标文件“phase1.o”的数据(.data)节内容(不允许修改其他节),使其与main.o模块如下链接后运行时输出目标字符串“123456789”。

注意:实验目录中的phase1-backup.o文件与未修改的phase1.o相同,供可用于重置/覆盖实验中被错误修改的phase1.o目标文件。

2. 实验阶段

        ① 使用objdump工具获得目标文件的汇编代码,使用readelf工具获得其重定位记录;

        ② 结合汇编代码和重定位信息,定位输出函数的调用参数在目标文件中的存储地址;

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

2.1 反汇编+获取重定位记录

        1. 先切换当前工作目录到目标关卡

cd /data/workspace/myshixun/step1

        2. 使用实验平台中的objdump工具获得可重定位目标模块phase1.o的反汇编代码,分析程序执行逻辑

objdump -d phase1.o > phase1.s
cat phase1.s

注意:在可重定位的目标模块中,不管是要调用的函数还是其调用参数,它们的引用地址都不是以后链接后生成的可执行程序中的最终实际地址

        3. 使用readelf工具获得程序引用静态数据变量所对应的重定位记录,获得引用的变量名 

readelf -r phase1.o

2.2 分析

         readelf工具的输出是一条一条的重定位记录,每个重定位记录的内容如下面结构所示:

typedef struct {
    int offset;      //节内偏移
    int symbol:24,   //所绑定符号
        type:8;      //重定位类型
} Elf32_Rel;

        do_phase函数中偏移量为0x10call指令操作数对应了第二条重定位记录,也就是说call的实际目标函数是puts函数,用于输出一个字符串,并且链接器应该按照R_386_PC32重定位方式把puts函数的绝对地址相对于PC值的偏移量放到call指令中对应引用的4个字节的操作数中。

R_386_PC32  PC绝对地址重定位方式下:

重定位后的引用地址 = 符号定义地址 - 符号引用所在地址 + 重定位前引用处的初始值

        既然call指令调用的是完成打印输出的puts函数,那么压入栈中,传递给它的唯一参数就是输出字符串的地址。

        相应的可知:偏移量0x7开始的4个字节,在重定位后存放的是程序要输出的字符串的首地址,该引用地址在重定位时使用了R_386_32的重定位方法。

R_386_32  绝对地址重定位方式下:

重定位后的引用地址 = 符号定义地址 + 重定位前引用处的初始值

        由此得出输出字符串的起始地址:在.data节中相对节起始、偏移量为0x11f的位置。接下来我们要设法获知.data节在目标模块phase1.o中的什么位置。

2.3 查看节头表,确定偏移量

节头表(Section Header Table)

        • ELF可重定位目标文件中的重要组成部分;

        • 描述每个节的节名、在文件中的偏移、大小、访问属性、对齐方式等。

IA32/Linux系统中ELF文件的节头数据结构:

typedef struct {

        Elf32_Word        sh_name;       //节名

        Elf32_Word        sh_type;

        Elf32_Word        sh_flags;

        Elf32_Word        sh_addr;

        Elf32_Word        sh_offset;      //节在文件中的偏移地址

        Elf32_Word        sh_size;

        Elf32_Word        sh_link;

        Elf32_Word        sh_info;

        Elf32_Word        sh_addralign;

        Elf32_Word        sh_entsize;

} Elf32_Shdr

1.获取节头表

readelf -S phase1.o

        该命令打印输出了phase1.o文件中包含的所有节的信息:

2.确定偏移量

        由图读出.data节在文件中的起始偏移量为0x60

        结合前面的分析可知:输出字符串在文件中的起始地址为 0x60 + 0x11f = 0x17f

2.4 使用hexedit工具修改指定内容

1.检查确认原来的内容

readelf -x.data phase1.o

        该命令输出打印了phase1.o模块中.data节的内容        

 2.使用hexedit工具修改二进制目标文件中的数据对象初始值

hexedit phase1.o

        按Ctrl + G快速定位到0x17f的位置

        从0x17f开始将输出字符串替换为123456789(1的ASCII码为31),最后不要忘记设置一个00字符作为字符串的结尾。

3.验证修改是否有效完成实验目标 

gcc -no-pie -o linkbomb main.o phase1.o
./linkbomb

        可以看到程序的输出就是我们所期望的“123456789”,至此,实验圆满结束。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/924839.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

csp-j初赛模拟试题(解析)

题目: 在 C中,以下哪个关键字用于实现多态性? A. virtualB. staticC. externD. const 以下数据结构中,不属于线性结构的是( )。 A. 栈B. 队列C. 二叉树D. 链表 一个有 8 个顶点的无向图,若每个…

OSG开发笔记(三十五):OsgUtil::Optimizer:优化场景策略,提升显示性能和渲染效率

​若该文为原创文章,未经允许不得转载 本文章博客地址:https://blog.csdn.net/qq21497936/article/details/144092964 各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究 长沙红胖子Qt…

Axure RP教程:创建高效用户界面和交互

Axure RP是一款广受好评的软件,专门用于设计精致的用户界面和交互体验。这款软件提供了众多UI控件,并根据它们的用途进行了分类。与此同时,国产的即时设计软件作为Axure的替代品,支持在线协作和直接在浏览器中使用,无需…

1 ISP一键下载

BOOT0BOOT1启动模式说明0X用户Flash用户闪存存储器,也就是Flash启动10系统存储器系统存储器启动,串口下载11SRAM启动SRAM启动,用于在SRAM中调试代码 闪存存储器 是STM32 的内置FLASH,一般使用JTAG或者SWD模式下载程序时,就是下载…

【数据结构与算法】链表之美-复杂链表的复制与链表的插入排序

主页:HABUO🍁主页:HABUO 🍁如果再也不能见到你,祝你早安,午安,晚安🍁 1.复杂链表的复制 题目:请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中…

统计字符串中单词出现的次数

效果&#xff1a; 代码&#xff1a; #include <iostream> #include <map> #include <string> int main() {std::string s;//std::cin >> s;s " aaa aaaaa a aa aaa aaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa Hi I am a person a…

comfyui使用记录-PuLID_Flux模型使用

文章目录 1.PuLID模型简介&#xff1a;2.PuLID_Flux 工作流的部署流程安装pulid节点 3.部署遇到的一些问题加载这个节点错误&#xff1a;PulidFluxInsightFaceLoaderPulidFluxEvaClipLoader加载错误 4.PuLID模型的出图效果5.一些参数的设置用到的提示词 1.PuLID模型简介&#x…

threeJs学习 贴图 :地球

效果图&#xff1a; 贴图以后的效果&#xff1a; vue代码&#xff1a; <template><div class"scene_box"><p>创建纹理贴图TextureLoader</p><div class"canvas"></div></div> </template><script s…

联想品牌的电脑 Bios 快捷键是什么?如何进入 Bios 设置?

在某些情况下&#xff0c;您可能需要通过U盘来安装操作系统或进行系统修复。对于联想电脑用户来说&#xff0c;了解如何设置U盘作为启动设备是非常有用的技能之一。本文简鹿办公将指导您如何使用联想电脑的 U 盘启动快捷键来实现这一目标。 联想笔记本 对于大多数联想笔记本电…

SmartSQL:一款方便、快捷的数据库文档查询、导出工具

&#x1f6a9; 项目介绍 SmartSQL 是一款方便、快捷的数据库文档查询、导出工具&#xff01;从最初仅支持SqlServer数据库、CHM文档格式开始&#xff0c;通过不断地探索开发、集思广益和不断改进&#xff0c;又陆续支持Word、Excel、PDF、Html、Xml、Json、MarkDown等文档格式…

Transformer?Attention?——Are All You Need!

Hi&#xff0c;大家好&#xff0c;我是半亩花海。本文主要较为深入地讲述 transformer 模型及 attention 机制等相关深度学习的知识&#xff0c;主要介绍模型结构、原理等。Transformer 属于是当下比较流行和创新的深度学习的基础模型架构&#xff0c;主要应用于自然语言处理&a…

24.11.28 Cookie

cookie_webstorage 1.cookie 每次请求时 可以把cookie自定义的数据 传给服务端 (请求参数 请求头之外 报文传自定义数据的位置 cookie可以长期保存) cookie特点 1.数据格式只有字符串 2.按键值对存储 3.对中文支持较差(尽量不要用中文) 4.按照网站(域 domain)存储 5.可…

尚硅谷前端 (wsy答辩)

尚硅谷前端 &#xff08;wsy答辩&#xff09; 文章目录 尚硅谷前端 &#xff08;wsy答辩&#xff09;一、前端开发过程和框架1.框架目录结构认识1.程序的入口 有两个 第一个是index,html , 第二个在SRC目录下的main,js2.前端页面环境使用框架&#xff08;模板&#xff09;3、框…

不间断电源 (UPS) 对现代技术可靠性的影响

在这个技术型世界里&#xff0c;无论是在个人还是商业环境中&#xff0c;电力供应商提供的稳定供电都变得越来越重要。 不间断电源 (UPS) 系统是一种不可或缺的解决方案&#xff0c;可保证终端设备不受干扰地运行&#xff0c;在出现电源问题或故障时让用户继续工作。 这篇文章…

【05】Selenium+Python 两种文件上传方式(AutoIt)

上传文件的两种方式 一、input标签上传文件 可以用send_keys方法直接上传文件 示例代码 input标签上传文件import time from selenium import webdriver from chromedriver_py import binary_path # this will get you the path variable from selenium.webdriver.common.by i…

leetcode 二叉树的最大深度

104. 二叉树的最大深度 已解答 简单 相关标签 相关企业 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3…

MATLAB - ROS2 ros2genmsg 生成自定义消息(msg/srv...)

系列文章目录 前言 语法 ros2genmsg(folderpath)ros2genmsg(folderpath,NameValue) 一、说明 ros2genmsg(folderpath) 通过读取指定文件夹路径下的 ROS 2 自定义信息和服务定义来生成 ROS 2 自定义信息。函数文件夹必须包含一个或多个 ROS 2 软件包。这些软件包包含 .msg 文件…

使用 Elastic 和 Apple 的 OpenELM 模型构建 RAG 系统

作者&#xff1a;来自 Elastic Gustavo Llermaly 如何部署和测试新的 Apple 模型并使用 Elastic 构建 RAG 系统。 在本文中&#xff0c;我们将学习部署和测试新的 Apple 模型&#xff0c;并构建一个 RAG 系统来模拟 Apple Intelligence&#xff0c;使用 Elastic 作为向量数据库…

springboot336社区物资交易互助平台pf(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 社区物资交易互助平台设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff…

python爬虫案例——猫眼电影数据抓取之字体解密,多套字体文件解密方法(20)

文章目录 1、任务目标2、网站分析3、代码编写1、任务目标 目标网站:猫眼电影(https://www.maoyan.com/films?showType=2) 要求:抓取该网站下,所有即将上映电影的预约人数,保证能够获取到实时更新的内容;如下: 2、网站分析 进入目标网站,打开开发者模式,经过分析,我…