csapp-linklab之第4阶段“输出学号”实验报告(switch跳转表)

实验内容

修改phase4.o相应节中的内容,使其与main.o链接后运行能够输出自己的学号:

$ gcc -o linkbomb main.o phase4.o

$ ./linkbomb

$学号

实验提示

掌握switch语句的机器语言表示及其跳转表的实现。 

找出跳转表

反汇编phase4.o,看看里面干了些什么内容。

粗略一看,那么长;看到中间,猜到是switch;看看头尾,和phase3一模一样。

头尾我还是一字一句的看了一遍,真的完全一样。细节略。

找到这里就是跳转表了。在56位置重定位,看看重定位到哪了。

如下图,重定位到rodata节去了。

看rodata节,跳转表就是这里。

插一句

我做的时候是先链接的,这样似乎不用查重定位表,比较不用动脑子。

找到0x8048734位置,还是只读数据节。

分析跳转表

对照写出ax是几时跳到哪,如下。

 53:	8b 04 85 00 00 00 00 	mov    0x0(,%eax,4),%eax5a:	ff e0                	jmp    *%eax5c:	c6 45 e3 33          	movb   $0x33,-0x1d(%ebp)——————————060:	e9 9e 00 00 00       	jmp    103 <do_phase+0x103>65:	c6 45 e3 34          	movb   $0x34,-0x1d(%ebp)——————————169:	e9 95 00 00 00       	jmp    103 <do_phase+0x103>6e:	c6 45 e3 74          	movb   $0x74,-0x1d(%ebp)——————————272:	e9 8c 00 00 00       	jmp    103 <do_phase+0x103>77:	c6 45 e3 36          	movb   $0x36,-0x1d(%ebp)——————————37b:	e9 83 00 00 00       	jmp    103 <do_phase+0x103>80:	c6 45 e3 6d          	movb   $0x6d,-0x1d(%ebp)——————————484:	eb 7d                	jmp    103 <do_phase+0x103>86:	c6 45 e3 38          	movb   $0x38,-0x1d(%ebp)——————————58a:	eb 77                	jmp    103 <do_phase+0x103>8c:	c6 45 e3 62          	movb   $0x62,-0x1d(%ebp)——————————690:	eb 71                	jmp    103 <do_phase+0x103>92:	c6 45 e3 30          	movb   $0x30,-0x1d(%ebp)——————————796:	eb 6b                	jmp    103 <do_phase+0x103>98:	c6 45 e3 79          	movb   $0x79,-0x1d(%ebp)——————————89c:	eb 65                	jmp    103 <do_phase+0x103>9e:	c6 45 e3 3b          	movb   $0x3b,-0x1d(%ebp)——————————9a2:	eb 5f                	jmp    103 <do_phase+0x103>a4:	c6 45 e3 37          	movb   $0x37,-0x1d(%ebp)——————————aa8:	eb 59                	jmp    103 <do_phase+0x103>aa:	c6 45 e3 47          	movb   $0x47,-0x1d(%ebp)——————————bae:	eb 53                	jmp    103 <do_phase+0x103>b0:	c6 45 e3 4d          	movb   $0x4d,-0x1d(%ebp)——————————cb4:	eb 4d                	jmp    103 <do_phase+0x103>b6:	c6 45 e3 5a          	movb   $0x5a,-0x1d(%ebp)——————————dba:	eb 47                	jmp    103 <do_phase+0x103>bc:	c6 45 e3 3f          	movb   $0x3f,-0x1d(%ebp)——————————ec0:	eb 41                	jmp    103 <do_phase+0x103>c2:	c6 45 e3 39          	movb   $0x39,-0x1d(%ebp)——————————fc6:	eb 3b                	jmp    103 <do_phase+0x103>c8:	c6 45 e3 40          	movb   $0x40,-0x1d(%ebp)——————————10cc:	eb 35                	jmp    103 <do_phase+0x103>ce:	c6 45 e3 6b          	movb   $0x6b,-0x1d(%ebp)——————————11d2:	eb 2f                	jmp    103 <do_phase+0x103>d4:	c6 45 e3 70          	movb   $0x70,-0x1d(%ebp)——————————12d8:	eb 29                	jmp    103 <do_phase+0x103>da:	c6 45 e3 32          	movb   $0x32,-0x1d(%ebp)——————————13de:	eb 23                	jmp    103 <do_phase+0x103>e0:	c6 45 e3 31          	movb   $0x31,-0x1d(%ebp)——————————14e4:	eb 1d                	jmp    103 <do_phase+0x103>e6:	c6 45 e3 7c          	movb   $0x7c,-0x1d(%ebp)——————————15ea:	eb 17                	jmp    103 <do_phase+0x103>ec:	c6 45 e3 40          	movb   $0x40,-0x1d(%ebp)——————————16f0:	eb 11                	jmp    103 <do_phase+0x103>f2:	c6 45 e3 6e          	movb   $0x6e,-0x1d(%ebp)——————————17f6:	eb 0b                	jmp    103 <do_phase+0x103>f8:	c6 45 e3 35          	movb   $0x35,-0x1d(%ebp)——————————18fc:	eb 05                	jmp    103 <do_phase+0x103>fe:	c6 45 e3 5e          	movb   $0x5e,-0x1d(%ebp)——————————19102:	90                   	nop

然后看当什么都不改时,程序的输出

第一个字符的ascii码是0x4f,减去0x41就是0xe,

  11:	c7 45 e9 4f 58 59 44 	movl   $0x4459584f,-0x17(%ebp)18:	c7 45 ed 4b 50 56 47 	movl   $0x4756504b,-0x13(%ebp)1f:	66 c7 45 f1 46 5a    	movw   $0x5a46,-0xf(%ebp)25:	c6 45 f3 00          	movb   $0x0,-0xd(%ebp)29:	c7 45 e4 00 00 00 00 	movl   $0x0,-0x1c(%ebp)
跟phase3一模一样,局部变量字符串放在起始位置为-0x17(%ebp)处

跳到这里,那么第一个打印的字符的ascii码就是3f,即一个问号("?"),对照输出结果,的确是。以此类推,后续9个字符也是如此。

  bc:	c6 45 e3 3f          	movb   $0x3f,-0x1d(%ebp)——————————ec0:	eb 41                	jmp    103 <do_phase+0x103>

那么只需要修改phase4.o的text节,将跳转之后的语句改为我们学号的ascii码即可。例如第一个字符那里就把3f改为30(如果学号第一位是0的话)。

完成。

后记

阶段四几乎跟阶段三一模一样。十分简单。

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

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

相关文章

el-table实现动态表头

1.1el-table渲染 <el-tableref"refreshTable":data"tableData"highlight-current-row><el-table-columnfixedwidth"170px"label"测点"align"center"prop"测站名称"/><el-table-column label"…

浅谈安科瑞可编程电测仪表在老挝某项目的应用

摘要&#xff1a;本文介绍了安科瑞多功能电能表在老挝某项目的应用。AMC系列交流多功能仪表是一款专门为电力系统、工矿企业、公用事业和智能建筑用于电力监控而设计的智能电表。 Abstract&#xff1a;This article introduces the application of the multi-function energy …

深度学习今年来经典模型优缺点总结,包括卷积、循环卷积、Transformer、LSTM、GANs等

文章目录 1、卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;CNN&#xff09;1.1 优点1.2 缺点1.3 应用场景1.4 网络图 2、循环神经网络&#xff08;Recurrent Neural Networks&#xff0c;RNNs&#xff09;2.1 优点2.2 缺点2.3 应用场景2.4 网络图 3、长短…

L1-010:比较大小

题目描述 本题要求将输入的任意3个整数从小到大输出。 输入格式: 输入在一行中给出3个整数&#xff0c;其间以空格分隔。 输出格式: 在一行中将3个整数从小到大输出&#xff0c;其间以“->”相连。 输入样例: 4 2 8输出样例: 2->4->8 程序代码 #include<stdio.h&…

基于YOLOv8深度学习的安全帽目标检测系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

Git——使用Git进行程序开发

主要介绍个人开发提交记录的主要流程&#xff0c;包括以下内容&#xff1a; 索引- 提交的暂存区。查看工作的状态和内部变更。如何读取用于描述变更的已扩展统一diff格式。支持查询和交互的提交&#xff0c;修改提交。创建、显示和选择&#xff08;切换&#xff09;分支。切换…

婴儿专用洗衣机有必要买吗?宝宝洗衣机洗衣服

我们都知道刚出生的宝宝抵抗力较弱&#xff0c;很容易因为细菌感染然后生病&#xff0c;宝宝接触最多的就是衣服&#xff0c;我们在手洗的过程很难把衣服上的细菌清洗掉&#xff0c;而使用我们传统的洗衣机很容易造成细菌的第二次感染&#xff0c;很容易将宝宝的抵抗力弄得越来…

如何通过linux调用企业微信发送告警消息

一、前期准备 1、企业微信具备管理企业权限。 2、服务器有公网IP或者可以将本机端口通过net映射到公网。 二、通过脚本向企业微信发送消息 1、创建sh脚本用来发送消息。 vim 2.sh 注意&#xff1a;脚本中xxxx信息需要在企业微信管理后台获取。 #!/bin/bash # 设置企业…

2023年计网408

第33题 33.在下图所示的分组交换网络中&#xff0c;主机H1和H2通过路由器互连&#xff0c;2段链路的带宽均为100Mbps、 时延带宽积(即单向传播时延带宽)均为1000bits。若 H1向 H2发送1个大小为 1MB的文件&#xff0c;分组长度为1000B&#xff0c;则从H1开始发送时刻起到H2收到…

代码随想录刷题题Day2

刷题的第二天&#xff0c;希望自己能够不断坚持下去&#xff0c;迎来蜕变。&#x1f600;&#x1f600;&#x1f600; 刷题语言&#xff1a;C / Python Day2 任务 977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵 II 1 有序数组的平方&#xff08;重点&#xff1a;双指针…

将项目放到gitee上

参考 将IDEA中的项目上传到Gitee仓库中_哔哩哔哩_bilibili 如果cmd运行ssh不行的话&#xff0c;要换成git bash 如果初始化后的命令用不了&#xff0c;直接用idea项放右键&#xff0c;用git工具操作

XXL-Job详解(二):安装部署

目录 前言环境下载项目调度中心部署执行器部署 前言 看该文章之前&#xff0c;最好看一下之前的文章&#xff0c;比较方便我们理解 XXL-Job详解&#xff08;一&#xff09;&#xff1a;组件架构 环境 Maven3 Jdk1.8 Mysql5.7 下载项目 源码仓库地址链接: https://github.…

前端对浏览器的理解

浏览器的主要构成 用户界面 &#xff0d; 包括地址栏、后退/前进按钮、书签目录等&#xff0c;也就是你所看到的除了用来显示你所请求页面的主窗口之外的其他部分。 浏览器引擎 &#xff0d; 用来查询及操作渲染引擎的接口。 渲染引擎 &#xff0d; 用来显示请求的内容&#…

某60区块链安全之薅羊毛攻击实战一学习记录

区块链安全 文章目录 区块链安全薅羊毛攻击实战一实验目的实验环境实验工具实验原理实验内容薅羊毛攻击实战一 实验步骤EXP利用 薅羊毛攻击实战一 实验目的 学会使用python3的web3模块 学会分析以太坊智能合约薅羊毛攻击漏洞 找到合约漏洞进行分析并形成利用 实验环境 Ubun…

JVM类加载与运行时数据区

目录 一、类加载器 jvm类的加载过程 第一阶段&#xff1a;加载 第二阶段&#xff1a;链接阶段 第三阶段&#xff1a;初始化阶段&#xff1a; 双亲委派机制 沙箱安全机制 运行时数据区 栈-Xss1m 堆 TLAB 逃逸分析 方法区 常量池中有什么 StringTable为什么要调整位…

VS Code C++可视化调试配置Natvis,查看Qt、STL变量内容

VS Code C可视化调试配置Natvis 使用GlobalVisualizersDirectory Windows下 C:\Users\YourName\.vscode\extensions\ms-vscode.cpptools-1.18.5-win32-x64\debugAdapters\vsdbg\bin\Visualizers\Linux下 ~\.vscode\extensions\ms-vscode.cpptools-1.18.5-win32-x64\debugAd…

Spring Cloud 原理(第一节)

一、百度百科 Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发&#xff0c;如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等&#xff0c;都可以用Spring Boot的开发风格做到一键启动和部署。Spri…

实验五 C语言函数程序设计习题 (使用函数计算两点间的距离,请编写函数fun,使用函数输出字符矩阵,使用函数求最大公约数和最小公倍数)

1. 使用函数计算两点间的距离&#xff1a;给定平面任意两点坐标(x1,y1)和(x2,y2)&#xff0c;求这两点之间的距离(保留2位)小数。要求定义和调用dist(x1,y1,x2,y2)计算两点间的距离。坐标中两点坐标之间的距离公式如下&#xff1a; #include <stdio.h> #include <math…

1.ORB-SLAM3中如何保存多地图、关键帧、地图点到二进制文件中

1 保存多地图 1.1 为什么保存(视觉)地图 因为我们要去做导航&#xff0c;导航需要先验地图。因此需要保存地图供导航使用&#xff0c;下面来为大家讲解如何保存多地图。 1.2 保存多地图的主函数SaveAtlas 2051 mStrSaveAtlasToFile是配置文件中传递的参数&#xff1a; 这里我们…

ssh远程连接阿里云CentOS:修改为密码登录

文章目录 控制台添加密钥下载Xshell修改密码连接重启服务&#xff1a;重复Xshell使用密码登录 控制台添加密钥 会下载一个pem文件 下载Xshell 新建 通过public key登录 修改密码连接 passwd root然后输入你想要设置的密码两遍 cd /etc/ssh/ vi sshd_config将PasswordAuth…