Switch语句与链接—计算机系统基础

news2024/11/15 20:00:49

        实验内容:修改二进制可重定位目标文件“phase1.o”中相关节的内容(注意不允许修改.text节和重定位节的内容),使其与main.o模块如下链接后运行时输出目标字符串“123456789”

gcc -no-pie -o linkbomb main.o phase1.o
./linkbomb
目标字符串

        实验步骤:

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

                2.结合汇编代码和重定位信息,推断目标文件的汇编代码中各函数的功能作用,定位出其中负责输出的函数。

                3.构造调用输出函数的指令代码。

                4.使用构造的调用输出函数的指令代码,替换目标文件中的do_phase过程中的nop指令,实现目标字符串的输出。

        实验验证:

                1.查看反汇编代码

objdump -d phase1.o > phase1.s
cat phase1.s
00000028 <do_phase>:
  28:   55                      push   %ebp
  29:   89 e5                   mov    %esp,%ebp
  2b:   83 ec 28                sub    $0x28,%esp
  2e:   c7 45 e6 47 43 5a 56    movl   $0x565a4347,-0x1a(%ebp)
  35:   c7 45 ea 49 50 48 58    movl   $0x58485049,-0x16(%ebp)
  3c:   66 c7 45 ee 42 00       movw   $0x42,-0x12(%ebp)
  42:   c7 45 f0 00 00 00 00    movl   $0x0,-0x10(%ebp)
  49:   e9 e0 00 00 00          jmp    12e <do_phase+0x106>
  4e:   8d 55 e6                lea    -0x1a(%ebp),%edx
  51:   8b 45 f0                mov    -0x10(%ebp),%eax
  54:   01 d0                   add    %edx,%eax
  56:   0f b6 00                movzbl (%eax),%eax
  59:   88 45 f7                mov    %al,-0x9(%ebp)
  5c:   0f be 45 f7             movsbl -0x9(%ebp),%eax
  60:   83 e8 41                sub    $0x41,%eax
  63:   83 f8 19                cmp    $0x19,%eax
  66:   0f 87 b0 00 00 00       ja     11c <do_phase+0xf4>
  6c:   8b 04 85 04 00 00 00    mov    0x4(,%eax,4),%eax
  73:   ff e0                   jmp    *%eax
  75:   c6 45 f7 56             movb   $0x56,-0x9(%ebp)
  79:   e9 9e 00 00 00          jmp    11c <do_phase+0xf4>
  7e:   c6 45 f7 39             movb   $0x39,-0x9(%ebp)
  82:   e9 95 00 00 00          jmp    11c <do_phase+0xf4>
  87:   c6 45 f7 6e             movb   $0x6e,-0x9(%ebp)
  8b:   e9 8c 00 00 00          jmp    11c <do_phase+0xf4>
  90:   c6 45 f7 40             movb   $0x40,-0x9(%ebp)
  94:   e9 83 00 00 00          jmp    11c <do_phase+0xf4>
  99:   c6 45 f7 78             movb   $0x78,-0x9(%ebp)
  9d:   eb 7d                   jmp    11c <do_phase+0xf4>
  9f:   c6 45 f7 34             movb   $0x34,-0x9(%ebp)
  a3:   eb 77                   jmp    11c <do_phase+0xf4>
  a5:   c6 45 f7 3f             movb   $0x3f,-0x9(%ebp)
  a9:   eb 71                   jmp    11c <do_phase+0xf4>
  ab:   c6 45 f7 76             movb   $0x76,-0x9(%ebp)
  af:   eb 6b                   jmp    11c <do_phase+0xf4>
  b1:   c6 45 f7 49             movb   $0x49,-0x9(%ebp)
  b5:   eb 65                   jmp    11c <do_phase+0xf4>
  b7:   c6 45 f7 5b             movb   $0x5b,-0x9(%ebp)
  bb:   eb 5f                   jmp    11c <do_phase+0xf4>
  bd:   c6 45 f7 6b             movb   $0x6b,-0x9(%ebp)
  c1:   eb 59                   jmp    11c <do_phase+0xf4>
  c3:   c6 45 f7 6b             movb   $0x6b,-0x9(%ebp)
  c7:   eb 53                   jmp    11c <do_phase+0xf4>
  c9:   c6 45 f7 30             movb   $0x30,-0x9(%ebp)
  cd:   eb 4d                   jmp    11c <do_phase+0xf4>
  cf:   c6 45 f7 65             movb   $0x65,-0x9(%ebp)
  d3:   eb 47                   jmp    11c <do_phase+0xf4>
  d5:   c6 45 f7 67             movb   $0x67,-0x9(%ebp)
  d9:   eb 41                   jmp    11c <do_phase+0xf4>
  db:   c6 45 f7 5a             movb   $0x5a,-0x9(%ebp)
  df:   eb 3b                   jmp    11c <do_phase+0xf4>
  e1:   c6 45 f7 32             movb   $0x32,-0x9(%ebp)
  e5:   eb 35                   jmp    11c <do_phase+0xf4>
  e7:   c6 45 f7 38             movb   $0x38,-0x9(%ebp)
  eb:   eb 2f                   jmp    11c <do_phase+0xf4>
  ed:   c6 45 f7 77             movb   $0x77,-0x9(%ebp)
  f1:   eb 29                   jmp    11c <do_phase+0xf4>
  f3:   c6 45 f7 3f             movb   $0x3f,-0x9(%ebp)
  f7:   eb 23                   jmp    11c <do_phase+0xf4>
  f9:   c6 45 f7 37             movb   $0x37,-0x9(%ebp)
  fd:   eb 1d                   jmp    11c <do_phase+0xf4>
  ff:   c6 45 f7 33             movb   $0x33,-0x9(%ebp)
 103:   eb 17                   jmp    11c <do_phase+0xf4>
 105:   c6 45 f7 35             movb   $0x35,-0x9(%ebp)
 109:   eb 11                   jmp    11c <do_phase+0xf4>
 10b:   c6 45 f7 59             movb   $0x59,-0x9(%ebp)
 10f:   eb 0b                   jmp    11c <do_phase+0xf4>
 111:   c6 45 f7 31             movb   $0x31,-0x9(%ebp)
 115:   eb 05                   jmp    11c <do_phase+0xf4>
 117:   c6 45 f7 36             movb   $0x36,-0x9(%ebp)
 11b:   90                      nop
 11c:   8d 55 dc                lea    -0x24(%ebp),%edx
 11f:   8b 45 f0                mov    -0x10(%ebp),%eax
 122:   01 c2                   add    %eax,%edx
 124:   0f b6 45 f7             movzbl -0x9(%ebp),%eax
 128:   88 02                   mov    %al,(%edx)
 12a:   83 45 f0 01             addl   $0x1,-0x10(%ebp)
 12e:   8b 45 f0                mov    -0x10(%ebp),%eax
 131:   83 f8 08                cmp    $0x8,%eax
 134:   0f 86 14 ff ff ff       jbe    4e <do_phase+0x26>
 13a:   8d 55 dc                lea    -0x24(%ebp),%edx
 13d:   8b 45 f0                mov    -0x10(%ebp),%eax
 140:   01 d0                   add    %edx,%eax
 142:   c6 00 00                movb   $0x0,(%eax)
 145:   83 ec 0c                sub    $0xc,%esp
 148:   8d 45 dc                lea    -0x24(%ebp),%eax
 14b:   50                      push   %eax
 14c:   e8 fc ff ff ff          call   14d <do_phase+0x125>
 151:   83 c4 10                add    $0x10,%esp
 154:   90                      nop
 155:   c9                      leave  
 156:   c3                      ret    

        类似一个9层循环,思路如下


                2.修改跳转表(因为不允许修改.text节和重定位节),存放在.rodata节。

readelf -S phase1.o

        在这,我们可以看到.rodata节的偏移量为2a8, 然后我们再寻找跳转表相对.rodata的偏移量。

        所以跳转表的位置为 2a8+0x4=2ac

                3.修改跳转表

hexedit phase1.o

        以0✖56为例,它在地址为2ac+4*(56-41)=300,我们找到300

       可以看到它的绝对跳转地址为9F ,我们把它改为0×34的绝对地址也是9F,其他的修改方法也是如此。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Boot+RocketMQ 实现多实例分布式环境下的事件驱动

为什么要使用MQ&#xff1f; 在Spring Boot Event这篇文章中已经通过Guava或者SpringBoot自身的Listener实现了事件驱动&#xff0c;已经做到了对业务的解耦。为什么还要用到MQ来进行业务解耦呢&#xff1f; 首先无论是通过Guava还是Spring Boot自身提供的监听注解来实现的事…

CNN实现对手写字体的迭代

导入库 import torchvision import torch from torchvision.transforms import ToTensor from torch import nn import matplotlib.pyplot as plt 导入手写字体数据 train_dstorchvision.datasets.MNIST(data/,trainTrue,transformToTensor(),downloadTrue) test_dstorchvis…

Hive实战:统计总分与平均分

文章目录 一、实战概述二、提出任务三、完成任务&#xff08;一&#xff09;准备数据文件1、在虚拟机上创建文本文件2、将文本文件上传到HDFS指定目录 &#xff08;二&#xff09;实现步骤1、启动Hive Metastore服务2、启动Hive客户端3、创建Hive表&#xff0c;加载HDFS数据文件…

websocket 介绍

目录 1&#xff0c;前端如何实现即时通讯短轮询长轮询 2&#xff0c;websocket2.1&#xff0c;握手2.2&#xff0c;握手过程举例2.3&#xff0c;socket.io 3&#xff0c;websocket 对比 http 的优势 1&#xff0c;前端如何实现即时通讯 在 websocket 协议出现之前&#xff0c;…

Tuxera NTFS for Mac2024免费Mac读写软件下载教程

在日常生活中&#xff0c;我们使用Mac时经常会遇到外部设备不能正常使用的情况&#xff0c;如&#xff1a;U盘、硬盘、软盘等等一系列存储设备&#xff0c;而这些设备的格式大多为NTFS&#xff0c;Mac系统对NTFS格式分区存在一定的兼容性问题&#xff0c;不能正常读写。 那么什…

Flask 与微信小程序对接

Flask 与微信小程序的对接 在 web/controllers/api中增建py文件&#xff0c;主要是给微信小程序使用的。 web/controllers/init.py # -*- coding: utf-8 -*- from flask import Blueprint route_api Blueprint( api_page,__name__ )route_api.route("/") def ind…

c++输入输出流和文件操作总结

目录 一、c的输入输出流——> 指的是字节流的数据传送;具有类型安全和可扩展性。 二、流的出入路径 三、c流类库 ①概览 ②标准输出流&#xff1a; ③标准输入流&#xff1a; 四、文件操作&#xff08;ascii文件和二进制文件&#xff09; 五、字符串流&#xff08;或称…

Amazon CodeWhisperer 免费 AI 代码生成助手体验分享

今年上半年&#xff0c;亚马逊云科技正式推出了实时AI编程助手 Amazon CodeWhisperer&#xff0c;还提供了供所有开发人员免费使用的个人版版本。经过一段时间的体验&#xff0c;我觉得 CodeWhisperer 可以处理编程工作中遇到的很多问题&#xff0c;并且帮助开发人员提高编程效…

opencv和gdal的读写图片波段顺序问题

最近处理遥感影像总是不时听到 图片的波段错了&#xff0c;一开始不明就里&#xff0c;都是图片怎么就判断错了。 1、图像RGB波段顺序判断 后面和大家交流&#xff0c;基本上知道了一个判断标准。 一般来说&#xff0c;进入人眼的自然画面在计算机视觉中一般是rgb波段顺序表示…

【Java EE初阶三 】线程的状态与安全(上)

1. join方法与多线程 1.1 初识多线程 为了提高cpu得利用率&#xff0c;因此就引入了多个线程的概念&#xff1b;即每个线程负责完成整个程序的一部分工作即可。 写一个代码&#xff0c;让主线程&#xff0c;创建一个新的线程&#xff0c;由新线程负责完成运算&#xff08;12。…

Baumer工业相机堡盟工业相机如何通过BGAPI SDK实现Raw格式的图像保存(C++)

Baumer工业相机堡盟工业相机如何通过BGAPI SDK实现Raw格式的图像保存&#xff08;C&#xff09; Baumer工业相机Baumer工业相机通过SDK实现Raw格式的图像保存的技术背景通过SDK获取相机信息的代码分析Baumer工业相机回调函数里保存原始图像数据Baumer保存Raw图像格式重要核心代…

时尚男童穿搭 I 棒球服穿搭永不过时

华棉刷毛复合牛奶丝面料 优质的华棉材质&#xff0c;轻柔中带着韧劲拥有卓越的软糯触感 平整的布面复合细腻的绒毛&#xff0c;增加挺阔感基础的佰搭款&#xff0c;利用率真的高 因为版型宽松&#xff0c;不挑身材&#xff0c;怎么搭都好看绣花是hen时尚的字母类绣花 韩范十…

用编程解决习题【计算机图像处理】

用编程解决习题【计算机图像处理】 前言版权第三章 03采样量化与像素间关系三种距离计算编程 第六章 06图像的直方图变换均衡化直方图编程规定化直方图编程 第七章 07图像的噪声抑制均值滤波 中值滤波计算编程knn滤波计算编程 第十章 10二值图像的分析贴标签 膨胀 腐蚀编程 最后…

网络隔离后,怎样建立高效安全的数据安全交换通道?

数据安全对企业生存发展有着举足轻重的影响&#xff0c;数据资产的外泄、破坏都会导致企业无可挽回的经济损失和核心竞争力缺失。数据流动才能让其释放价值&#xff0c;想要保护企业核心资产&#xff0c;就要实现数据安全交换。 很多企业为了防止知识产权、商业机密数据泄露&am…

python嵌套异常处理器

1 python嵌套异常处理器 python的异常处理器支持嵌套。 1.1 嵌套的try/except处理器 用法 def f1():raise E def f2():try:f1()except E:pass try:f2() except E:pass描述 嵌套的try/except处理器&#xff0c;发生异常时&#xff0c;控制权会跳回具有相符的except分句、最近…

钉钉机器人接入定时器(钉钉API+XXL-JOB)

钉钉机器人接入定时器&#xff08;钉钉APIXXL-JOB&#xff09; 首先需要创建钉钉内部群 在群设置中找到机器人选项 选择“自定义”机器人 通过Webhook接入自定义服务 创建完成后会生成一个send URL和一个加签码 下面就是干货 代码部分了 DingDingUtil.sendMessageByText(webho…

相机内参标定理论篇------相机模型选择

相机种类&#xff1a; 当拿到一款需要标定内参的相机时&#xff0c;第一个问题就是选择那种的相机模型。工程上相机类型的划分并不是十分严格&#xff0c;一般来说根据相机FOV可以把相机大概分为以下几类&#xff1a; 长焦相机&#xff1a;< 标准相机&#xff1a;~&…

gin框架使用系列之六——自定义中间件

系列目录 《gin框架使用系列之一——快速启动和url分组》《gin框架使用系列之二——uri占位符和占位符变量的获取》《gin框架使用系列之三——获取表单数据》《gin框架使用系列之四——json和protobuf的渲染》《gin框架使用系列之五——表单校验》 一、gin中间件概述 gin中将…

开源项目推荐:Frooodle/Stirling-PDF

简介一个本地的处理 PDF 的工具&#xff0c;界面是 Web UI&#xff0c;可以支持 Docker 部署。各种主要的 PDF 操作都可以支持。比如拆分、合并、转换格式、重新排列、添加图片、旋转、压缩等等。这个本地托管的网络应用最初完全由 ChatGPT 制作&#xff0c;后来逐渐发展&#…

数据结构学习 Leetcode322 零钱兑换

关键词&#xff1a;动态规划 完全背包 记忆化搜索 一个套路&#xff1a; 01背包&#xff1a;空间优化之后dp【target1】&#xff0c;遍历的时候要逆序遍历完全背包&#xff1a;空间优化之后dp【target1】&#xff0c;遍历的时候要正序遍历 题目&#xff1a; 方法一&#xff…