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,一经查实,立即删除!

相关文章

分治法之二分查找

思路: 确定查找范围&#xff1a;开始时&#xff0c;将整个有序数组作为查找范围。比较中间元素&#xff1a;计算查找范围的中间元素的索引 mid&#xff0c;并将其与目标值进行比较。 如果中间元素等于目标值&#xff0c;则查找成功&#xff0c;返回中间元素的索引。如果中间元素…

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"…

Android 横竖屏切换 窗口全屏

Android 横竖屏切换 窗口全屏 窗口设置为全屏 废话不多说直接上代码 首先在AndroidManifest的Activity下设置screenOrientation和configChanges - android:configChanges"orientation|screenSize"- android:screenOrientation"fullSensor"一个是设置屏幕取…

SpringBoot入门教程

Spring Boot 是由Spring框架团队推出的一款用来简化Spring应用程序创建和开发过程的框架&#xff0c;它基于Spring框架&#xff0c;使用约定优于配置&#xff0c;大大简化了Spring应用程序的配置和开发过程。在很多企业中&#xff0c;Spring Boot 已经被广泛应用&#xff0c;成…

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

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

Arrays.asList(T... a)导致的事故

&#x1f4da;项目场景: 修改数据时&#xff0c;允许将非必填字段清空。 ⛔问题描述: 由于使用的是Mybatis-Plus&#xff0c;只能使用LambdaUpdateWrapper或UpdateWrapper通过set(column,val)来将字段清空&#xff1b;因为字段太多导致大量set放在一个方法&#xff0c;不符合…

深度学习今年来经典模型优缺点总结,包括卷积、循环卷积、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;分支。切换…

面试:如何故意减慢网站速度?

面试问题&#xff1a;假设你为你的客户建立了一个网站。但他没有定期支付费用。现在你想放慢他的网站速度&#xff0c;但又不想让他立即发现。你会怎么做&#xff1f; 我&#xff1a;用较慢的算法和其他与编码相关的选项替换代码中使用的算法。 面试问题&#xff1a;问在这种情…

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

我们都知道刚出生的宝宝抵抗力较弱&#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收到…

MySQL 学习笔记(刷题篇)

SQL进阶挑战 聚合分组查询 SQL123 select tag, difficulty, round((sum(score) - max(score) - min(score) ) / (count(score) - 2) ,1) as clip_avg_score from examination_info as ei, exam_record as er where ei.exam_id er.exam_id and ei.tag SQL and ei.diffi…

代码随想录刷题题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; 用来显示请求的内容&#…

中国丙烯基弹性体PBE市场调研与预测报告(2023版)

内容简介&#xff1a; 丙烯基弹性体&#xff08;PBE&#xff09;是以丙烯为主要原料&#xff0c;加入少量乙烯&#xff08;或α-烯烃&#xff09;单体经溶液聚合而得到的以无定形区域为主的低结晶聚合物。与传统的乙丙橡胶不同&#xff0c;PBE的乙烯含量通常低于20%&#xff0…