csapp-linklab之第3阶段“输出学号”实验报告(强弱符号)

题目

新建一个phase3_patch.o,使其与main.o和phase3.o链接后,运行输出自己的学号:

$ gcc -o linkbomb main.o phase3.o phase3_patch.o

$ ./linkbomb

$学号

提示

利用符号解析中的强弱符号规则。(COOKIE字符串未初始化,可以利用强弱符号,在phase3_patch.c中定义一个初始化的COOKIE字符串。)

解决

先链接main.o 与phase3.o(linux> gcc main.o phase3.o linux> objdump -d a.out )以便看do_phase里做了什么。这时就需要使用在bomb lab中的“逆向工程”技能,猜这个函数在干嘛。

080484dd <do_phase>:
 80484dd:	55                   	push   %ebp
 80484de:	89 e5                	mov    %esp,%ebp
 80484e0:	83 ec 28             	sub    $0x28,%esp
 80484e3:	65 a1 14 00 00 00    	mov    %gs:0x14,%eax
 80484e9:	89 45 f4             	mov    %eax,-0xc(%ebp)
 80484ec:	31 c0                	xor    %eax,%eax
 80484ee:	c7 45 e9 67 6f 71 69 	movl   $0x69716f67,-0x17(%ebp)
 80484f5:	c7 45 ed 76 68 6a 77 	movl   $0x776a6876,-0x13(%ebp)
 80484fc:	66 c7 45 f1 78 63    	movw   $0x6378,-0xf(%ebp)
 8048502:	c6 45 f3 00          	movb   $0x0,-0xd(%ebp)
 8048506:	c7 45 e4 00 00 00 00 	movl   $0x0,-0x1c(%ebp)
 804850d:	eb 28                	jmp    8048537 <do_phase+0x5a>
 804850f:	8d 55 e9             	lea    -0x17(%ebp),%edx
 8048512:	8b 45 e4             	mov    -0x1c(%ebp),%eax
 8048515:	01 d0                	add    %edx,%eax
 8048517:	0f b6 00             	movzbl (%eax),%eax
 804851a:	0f b6 c0             	movzbl %al,%eax
 804851d:	0f b6 80 60 a0 04 08 	movzbl 0x804a060(%eax),%eax
 8048524:	0f be c0             	movsbl %al,%eax
 8048527:	83 ec 0c             	sub    $0xc,%esp
 804852a:	50                   	push   %eax
 804852b:	e8 60 fe ff ff       	call   8048390 <putchar@plt>
 8048530:	83 c4 10             	add    $0x10,%esp
 8048533:	83 45 e4 01          	addl   $0x1,-0x1c(%ebp)
 8048537:	8b 45 e4             	mov    -0x1c(%ebp),%eax
 804853a:	83 f8 09             	cmp    $0x9,%eax
 804853d:	76 d0                	jbe    804850f <do_phase+0x32>
 804853f:	83 ec 0c             	sub    $0xc,%esp
 8048542:	6a 0a                	push   $0xa
 8048544:	e8 47 fe ff ff       	call   8048390 <putchar@plt>
 8048549:	83 c4 10             	add    $0x10,%esp
 804854c:	90                   	nop
 804854d:	8b 45 f4             	mov    -0xc(%ebp),%eax
 8048550:	65 33 05 14 00 00 00 	xor    %gs:0x14,%eax
 8048557:	74 05                	je     804855e <do_phase+0x81>
 8048559:	e8 f2 fd ff ff       	call   8048350 <__stack_chk_fail@plt>
 804855e:	c9                   	leave  
 804855f:	c3                   	ret    

以下是逐句解释: 

080484dd <do_phase>:
 80484dd:	55                   	push   %ebp
 80484de:	89 e5                	mov    %esp,%ebp
前两行,函数调用的惯常操作,基址寄存器存sp

 80484e0:	83 ec 28             	sub    $0x28,%esp
栈扩展0x28字节

 80484e3:	65 a1 14 00 00 00    	mov    %gs:0x14,%eax
 80484e9:	89 45 f4             	mov    %eax,-0xc(%ebp)
金丝雀

 80484ec:	31 c0                	xor    %eax,%eax
ax清零

 80484ee:	c7 45 e9 67 6f 71 69 	movl   $0x69716f67,-0x17(%ebp)
 80484f5:	c7 45 ed 76 68 6a 77 	movl   $0x776a6876,-0x13(%ebp)
 80484fc:	66 c7 45 f1 78 63    	movw   $0x6378,-0xf(%ebp)
 8048502:	c6 45 f3 00          	movb   $0x0,-0xd(%ebp)
往栈里放一个字符串(局部变量)
————————————————————————————————
地址:bp-17  bp-13  bp-f  bp-d
内容:goqi   vhjw   xc    \0
————————————————————————————————

 8048506:	c7 45 e4 00 00 00 00 	movl   $0x0,-0x1c(%ebp)
-0x1c(%ebp)处赋为0(局部变量)

 804850d:	eb 28                	jmp    8048537 <do_phase+0x5a>

 804850f:	8d 55 e9             	lea    -0x17(%ebp),%edx
 8048512:	8b 45 e4             	mov    -0x1c(%ebp),%eax
ax = i

 8048515:	01 d0                	add    %edx,%eax
ax = bp-0x17+i(取上面那个字符串的第i个字符的地址)

 8048517:	0f b6 00             	movzbl (%eax),%eax
取第i个字符

 804851a:	0f b6 c0             	movzbl %al,%eax
不知道

 804851d:	0f b6 80 60 a0 04 08 	movzbl 0x804a060(%eax),%eax
取绝对地址为(0x804a060+ax)处的东西存到ax里

 8048524:	0f be c0             	movsbl %al,%eax
不知道

 8048527:	83 ec 0c             	sub    $0xc,%esp
栈变大12字节

 804852a:	50                   	push   %eax
栈变大4字节

 804852b:	e8 60 fe ff ff       	call   8048390 <putchar@plt>
打出ax里的东西,以ascii码对应字符的方式

 8048530:	83 c4 10             	add    $0x10,%esp
栈变小16字节

 8048533:	83 45 e4 01          	addl   $0x1,-0x1c(%ebp)
 8048537:	8b 45 e4             	mov    -0x1c(%ebp),%eax
看出-0x1c(%ebp)处的局部变量存的是循环变量,每次自增1

 804853a:	83 f8 09             	cmp    $0x9,%eax
循环10次

 804853d:	76 d0                	jbe    804850f <do_phase+0x32>
 804853f:	83 ec 0c             	sub    $0xc,%esp
栈变大12字节

 8048542:	6a 0a                	push   $0xa
 8048544:	e8 47 fe ff ff       	call   8048390 <putchar@plt>
此时ax为十进制10,打印10刚好是一个换行符(\n),完美

 8048549:	83 c4 10             	add    $0x10,%esp
 804854c:	90                   	nop

以下是金丝雀的检查
 804854d:	8b 45 f4             	mov    -0xc(%ebp),%eax
 8048550:	65 33 05 14 00 00 00 	xor    %gs:0x14,%eax
 8048557:	74 05                	je     804855e <do_phase+0x81>
 8048559:	e8 f2 fd ff ff       	call   8048350 <__stack_chk_fail@plt>
 804855e:	c9                   	leave  
 804855f:	c3                   	ret    

所以绝对地址0x804a060处有用,readelf -s a.out 打印符号表

看来这个lOXXBDHjiI就是COOKIE字符串(我一开始还以为COOKIE字符串的变量名就叫COOKIE =_=)

————————————————————————————————
地址:bp-17  bp-13  bp-f  bp-d
内容:goqi   vhjw   xc    \0
————————————————————————————————

位置分别是103 111 113 105 118 104 106 119 120 99

假设学号是0123456789,在phase3_patch.c文件中,写入

char lOXXBDHjiI [256] = "666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666966605366666162666647866666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666";

成功

后记

本例看出如果学号全是一样的数字(比如0000000000)你只需要把lOXXBDHjiI字符串赋为256个0即可,根本不用考虑究竟是哪个位置被打印(幸运号的福利)

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

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

相关文章

【CANN训练营】ROS2系统及使用介绍

ROS2系统及使用介绍 ROS2介绍及特点介绍 ROS2简介 要说ROS2&#xff0c;那就不得不提起ROS&#xff0c;ROS就是机器人操作系统英文全称(Robot Operating System)&#xff0c;但ROS本身并不是一个操作系统&#xff0c;而是可以安装在现在已有的操作系统上(Linux、Windows、Ma…

上门预约洗衣洗鞋管理软件小程序开发;

闪站侠洗衣洗鞋店管理软件 为洗衣洗鞋店、干洗店提供加盟、直营连锁管理&#xff1b; 实现门店上门收衣>开单拍照>清洗护理>工厂洗涤>订阅信息进度通知>会员取衣>报表统计等服务流程。实现上门收衣服务&#xff0c;数据实时同步门店&#xff0c;提高店铺形象…

风控交易系统跟单系统资管软件都有哪些功能特点?

资管分仓软件的主要功能就是母账户可以添加子账号&#xff0c;并且设置出入金&#xff0c;手续费、保证金、风控等功能&#xff0c;同时监控端更可以直观的看子账户的交易情况直接折线图展示更加直观&#xff0c;在监控端的最高权限可以直接一键平仓子账户&#xff08;如果子账…

2024年天津中德应用技术大学专升本专业课报名及考试时间通知

天津中德应用技术大学2024年高职升本科专业课报名确认及考试通知 按照市高招办《2024年天津市高职升本科招生实施办法》&#xff08;津招办高发〔2023〕14号&#xff09;文件要求&#xff0c;天津中德应用技术大学制定了2024年高职升本科专业课考试报名、确认及考试实施方案&a…

国内的几款强大的AI智能—AI语言模型

R5Ai智能助手是一款由百度研发的文心一言&#xff0c;它支持gpt4 / gpt-3.5 / claude&#xff0c;也支持AI绘画&#xff0c;每天提供十次免费使用机会&#xff0c;无需魔法。该智能助手具有以下优点&#xff1a;会画画&#xff0c;没有使用次数限制&#xff0c;可以在界面上找到…

绘制颜色矩的直方图

# 代码5-2 绘制颜色矩的直方图 def color_moments(img, trans_hsvFalse):if trans_hsv True:img cv2.cvtColor(img, cv2.COLOR_BGR2HSV)# 颜色分割f, s, t cv2.split(img)# 创建特征存放列表color_feature []# 一阶f_mean np.mean(f)s_mean np.mean(s)t_mean np.mean(t)…

聊聊刻意练习-构建心理表征

这是鼎叔的第八十一篇原创文章。行业大牛和刚毕业的小白&#xff0c;都可以进来聊聊。 欢迎关注本专栏和微信公众号《敏捷测试转型》&#xff0c;星标收藏&#xff0c;大量原创思考文章陆续推出。本人新书《无测试组织-测试团队的敏捷转型》已出版&#xff08;机械工业出版社&…

使用Linux docker方式快速安装Plik并结合内网穿透实现公网访问

文章目录 1. Docker部署Plik2. 本地访问Plik3. Linux安装Cpolar4. 配置Plik公网地址5. 远程访问Plik6. 固定Plik公网地址7. 固定地址访问Plik 本文介绍如何使用Linux docker方式快速安装Plik并且结合Cpolar内网穿透工具实现远程访问&#xff0c;实现随时随地在任意设备上传或者…

Python面向对象②:属性与方法【侯小啾python领航班系列(二十)】

Python面向对象:属性与方法【侯小啾python领航班系列(二十)】 大家好,我是博主侯小啾, 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ�…

Golang使用Swagger文档教程

Golang开发效率是杠杠滴&#xff0c;简单几行代码就可完成一个可用的服务&#xff0c;如下代码&#xff1a; 采用Gin作为web framework采用Gorm作为持久化ORM采用Swagger作为OpenAPI文档管理工具 package mainimport ("encoding/csv""fmt""os"…

电脑监控软件的监控方式有哪些

电脑监控软件是一种用于监视和控制计算机操作的工具&#xff0c;通常用于企业或个人对计算机的使用情况进行监控和管理。本文将探讨电脑监控软件的监控方式及其存在的问题。 首先&#xff0c;电脑监控软件的监控方式主要包括以下几种&#xff1a; 1、屏幕监控&#xff1a;这种…

4382系列数字荧光示波器

4382系列数字荧光示波器 简述&#xff1a; 4382系列手持式数字荧光示波器具有8个产品型号&#xff0c;带宽200MHz、350MHz、500MHz、1GHz&#xff0c;最高采样率5GSa/s&#xff0c;最大存储深度60kpts/CH&#xff0c;最快波形捕获率10万个波形/秒&#xff0c;独创的Any Acquire…

【程序员 | 交流】程序员情商修炼指南系列 (沟通是有效合作一大利器)

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

无需编程,绿云PMS如何优化用户运营—API连接、集成、广告推广

无需编程的优化艺术&#xff1a;绿云PMS如何改善用户运营 随着科技的进步&#xff0c;企业面临着持续的数字化转型压力。在这个过程中&#xff0c;如何在不增加技术负担的前提下改善用户运营成为一大挑战。杭州绿云软件股份有限公司通过其创新的绿云PMS系统&#xff0c;为企业…

vue 用Nginx实现负载均衡

Nginx负载均衡的作用(相当于客户端的请求是发到Nginx上的&#xff0c;然后由Nginx决定到底调用哪台服务器): 在 .net core 中的具体实现步骤 1.在nginx官网上下载安装包&#xff0c;推荐稳定版&#xff1b; 建议1.18版本 2.下载完成后&#xff0c;到所在目录执行 nginx绿色图…

基于PLC的电梯控制系统(论文+源码)

1.系统设计 电梯采用了PLC控制方式&#xff0c;通过对PLC进行逻辑程序设计&#xff0c;电梯不仅在控制水平上得到了质的提升&#xff0c;同时在安全性上也得到了大大提高。控制系统在构造上实现了简洁化&#xff0c;不仅优化了硬件接线方便了线路施工&#xff0c;同时对控制要…

【每日OJ —— 101. 对称二叉树】

每日OJ —— 101. 对称二叉树 1.题目&#xff1a;101. 对称二叉树2.解法2.1.算法讲解2.2.代码实现2.3.提交通过展示 1.题目&#xff1a;101. 对称二叉树 2.解法 2.1.算法讲解 1.该题是判断二叉树是否对称&#xff0c;关键在于&#xff0c;左子树等于右子树&#xff0c;而所给的…

Make sure that using this pseudorandom number generator is safe here.

问题类型&#xff1a;安全热点 安全问题级别&#xff1a;MEDIUM 一、问题代码 工具类Package&#xff1a; Java commons-lang3 库 RandomUtils 随机数工具类 import org.apache.commons.lang3.RandomUtils; 用法&#xff1a; RandomUtils.nextInt(0, 999999999) //生成 0…

SpringBoot的配置加载优先级

目录 一、背景分析 二、学习资源 三、具体使用 四、一些小技巧 方式一 方式二 一、背景分析 SpringBoot项目在打包之后&#xff0c;其配置文件就在jar包内&#xff0c;如果没有<配置文件优先级>这个机制&#xff0c;那么项目打成jar包之后&#xff0c;如果启动项目…

Qt配置OpenCV(MSVC编译)

目录 1.准备工具 1.1 Qt&#xff1a;5.14.2 64位 1.2 Opencv&#xff1a;4.6.0 1.3 Visual Studio 2017 2. QtMSVC开发环境搭建 3. 配置环境变量 3.1 Opencv环境变量配置 4. Qt 代码测试 1.准备工具 1.1 Qt&#xff1a;5.14.2 64位 1.2 Opencv&#xff1a;4.6.0 官…