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   %ebp80484de:	89 e5                	mov    %esp,%ebp80484e0:	83 ec 28             	sub    $0x28,%esp80484e3:	65 a1 14 00 00 00    	mov    %gs:0x14,%eax80484e9:	89 45 f4             	mov    %eax,-0xc(%ebp)80484ec:	31 c0                	xor    %eax,%eax80484ee:	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),%edx8048512:	8b 45 e4             	mov    -0x1c(%ebp),%eax8048515:	01 d0                	add    %edx,%eax8048517:	0f b6 00             	movzbl (%eax),%eax804851a:	0f b6 c0             	movzbl %al,%eax804851d:	0f b6 80 60 a0 04 08 	movzbl 0x804a060(%eax),%eax8048524:	0f be c0             	movsbl %al,%eax8048527:	83 ec 0c             	sub    $0xc,%esp804852a:	50                   	push   %eax804852b:	e8 60 fe ff ff       	call   8048390 <putchar@plt>8048530:	83 c4 10             	add    $0x10,%esp8048533:	83 45 e4 01          	addl   $0x1,-0x1c(%ebp)8048537:	8b 45 e4             	mov    -0x1c(%ebp),%eax804853a:	83 f8 09             	cmp    $0x9,%eax804853d:	76 d0                	jbe    804850f <do_phase+0x32>804853f:	83 ec 0c             	sub    $0xc,%esp8048542:	6a 0a                	push   $0xa8048544:	e8 47 fe ff ff       	call   8048390 <putchar@plt>8048549:	83 c4 10             	add    $0x10,%esp804854c:	90                   	nop804854d:	8b 45 f4             	mov    -0xc(%ebp),%eax8048550:	65 33 05 14 00 00 00 	xor    %gs:0x14,%eax8048557:	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   %ebp80484de:	89 e5                	mov    %esp,%ebp
前两行,函数调用的惯常操作,基址寄存器存sp80484e0:	83 ec 28             	sub    $0x28,%esp
栈扩展0x28字节80484e3:	65 a1 14 00 00 00    	mov    %gs:0x14,%eax80484e9:	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),%edx8048512:	8b 45 e4             	mov    -0x1c(%ebp),%eax
ax = i8048515:	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)处的局部变量存的是循环变量,每次自增1804853a:	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   $0xa8048544:	e8 47 fe ff ff       	call   8048390 <putchar@plt>
此时ax为十进制10,打印10刚好是一个换行符(\n),完美8048549:	83 c4 10             	add    $0x10,%esp804854c:	90                   	nop以下是金丝雀的检查804854d:	8b 45 f4             	mov    -0xc(%ebp),%eax8048550:	65 33 05 14 00 00 00 	xor    %gs:0x14,%eax8048557:	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即可,根本不用考虑究竟是哪个位置被打印(幸运号的福利)

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

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

相关文章

编写算法,对n个关键字取整数值的记录序列进行整理。以使所有关键字为负值的记录排在关键字为非负值的记录之前

编写算法&#xff0c;对n个关键字取整数值的记录序列进行整理。以使所有关键字为负值的记录排在关键字为非负值的记录之前&#xff0c;要求&#xff1a; &#xff08;1&#xff09;采用顺序存储结构&#xff0c;至少使用一个记录的辅助存储空间 &#xff08;2&#xff09;算法的…

Echarts大屏可视化_04 横向柱状图模块的引入和开发

模块的引入 1.寻找官方示例引入 ECharts官方实例入口 2.引入示例 ECharts 示例 可从这里直接进入 标题、提示信息、图例都不需要所以直接删掉 <div class"column"><div class"panel bar2"><h2>柱状图-技能掌握</h2><div cla…

直线上最多的点数

题目链接 直线上最多的点数 题目描述 注意点 points 中的所有点 互不相同points[i].length 2 解答思路 一条直线的函数为f(x)axb&#xff0c;两个点决定一条直线&#xff0c;也就是决定了f(x)中斜率a和截距b的值&#xff0c;所以考虑使用一个哈希表存储直线中的a和b并记录…

Springboot如何快速生成分页展示以及统计条数

这是表结构&#xff1a; 前置知识&#xff1a; 分页查询公式&#xff08;&#xff09;&#xff1a; -- 推导一个公式 -- select * from emp -- order by empno -- limit 每页显示记录数 * (第几页-1)&#xff0c;每页显示记录数 统计条数公式&#xff1a; select count…

Python基础语法之学习字符串快速格式化

Python基础语法之学习字符串快速格式化 一、代码二、效果 一、代码 # 通过f"{占位}"控制字符串快速格式化,不做精度控制 name "张三" age 13 money 12.5 text f"姓名是{name},年龄是{age},钱是{money}" print(text)二、效果 每一天都是一个…

MySQL处理并发访问和高负载的关键技术和策略

我深知在数据库管理中处理并发访问和高负载的重要性。在这篇文章中&#xff0c;我将探讨MySQL处理并发访问和高负载的关键技术和策略&#xff0c;以帮助读者更好地优化数据库性能。 图片来源&#xff1a;MySQL处理并发访问和高负载的关键技术和策略 MySQL数据库在处理并发访问…

iptables防火墙之SNAT与DNAT

1. SNAT SNAT 应用环境:局域网主机共享单个公网IP地址接入Internet (私有IP不能在Internet中正常路由) SNAT原理:源地址转换&#xff0c;根据指定条件修改数据包的源IP地址&#xff0c;通常被叫做源映射。 数据包从内网发送到公网时&#xff0c;SNAT会把数据包的源IP由私网IP…

python技术栈之单元测试中mock的使用

什么是mock&#xff1f; mock测试就是在测试过程中&#xff0c;对于某些不容易构造或者不容易获取的对象&#xff0c;用一个虚拟的对象来创建以便测试的测试方法。 mock的作用 特别是开发过程中上下游未完成的工序导致当前无法测试&#xff0c;需要虚拟某些特定对象以便测试…

基于Java SSM框架+Vue实现垃圾分类网站系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架Vue实现垃圾分类网站系统演示 摘要 本论文主要论述了如何使用JAVA语言开发一个垃圾分类网站 &#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述…

Python快速实现BMI(身体质量指数)计算器(窗口界面形式)

BMI是身体质量指数&#xff08;Body Mass Index&#xff09;的缩写&#xff0c;是一种衡量人体肥胖程度的指标。它是根据人的身高和体重计算得出的&#xff0c;公式为&#xff1a; BMI 体重&#xff08;kg&#xff09;/ 身高^2&#xff08;m&#xff09; 其中&#xff0c;体…

【UE】透视效果

效果 步骤 1. 新建一个空白工程 2. 添加一个第三人称游戏和初学者内容包到内容浏览器 3. 新建一个材质&#xff0c;这里命名为“M_Perspective” 打开“M_Perspective”&#xff0c;设置材质域为后期处理 添加三个“SceneTexture”节点&#xff0c;场景纹理ID选项分别设置为“…

【同济大学主办】第七届先进算法与控制工程国际学术会议(ICAACE 2024)

第七届先进算法与控制工程国际学术会议&#xff08;ICAACE 2024&#xff09; 2024 7th International Conference on Advanced Algorithms and Control Engineering 第七届先进算法与控制工程国际学术会议&#xff08;ICAACE 2024&#xff09;定于2024年1月26-28日在中国上…

python中的enumerate函数

enumerate函数是Python内置builtins模块中的一个函数&#xff0c;用于将一个可迭代对象转换为一个索引-元素对的枚举对象&#xff0c;从而方便地同时获得索引和元素&#xff0c;并在循环迭代中使用。 enumerate函数的语法格式为&#xff1a;enumerate(iterable, start0) itera…

软件开发流程:基础源代码与实战详解

一、引言 在当今的信息时代&#xff0c;软件开发已成为推动社会进步和发展的重要力量&#xff0c;从智能手机应用程序到复杂的企业级系统&#xff0c;软件开发在我们的日常生活和工作中发挥着越来越重要的作用。 然而&#xff0c;对于初学者来说&#xff0c;了解软件开发流程…

【设计模式】03:单例模式

单例模式 OVERVIOW 单例模式1.单例模式实现2.饿汉与懒汉&#xff08;1&#xff09;饿汉模式&#xff08;2&#xff09;懒汉模式 3.懒汉线程安全1&#xff08;1&#xff09;引入互斥锁&#xff08;2&#xff09;引入双重检查锁定&#xff08;3&#xff09;引入原子变量 4.懒汉线…

Jmeter接口自动化测试断言之Json断言

json断言可以让我们很快的定位到响应数据中的某一字段&#xff0c;当然前提是响应数据是json格式的&#xff0c;所以如果响应数据为json格式的话&#xff0c;使用json断言还是相当方便的。 还是以之前的接口举例 Url: https://data.cma.cn/weatherGis/web/weather/weatherFcst…

2023/11/30JAVAweb学习

数组json形式 想切换实现类,只需要只在你需要的类上添加 Component 如果在同一层,可以更改扫描范围,但是不推荐这种方法 注入时存在多个同类型bean解决方式

一些好用的12款前端小插件

1. cropper.js Cropper.js 2.0 是一系列用于图像裁剪的 Web 组件。 官网地址&#xff1a;https://fengyuanchen.github.io/cropperjs/v2/zh/ 2. Vditor Vditor是一款浏览器端的 Markdown 编辑器&#xff0c;支持所见即所得、即时渲染&#xff08;类似 Typora&#xff09;和分…

JavaEE——简单认识CSS

文章目录 一、简单了解什么是 CSS二、CSS 选择器1.标签选择器2.类选择器3.ID 选择器4.后代选择器5.子选择器6.伪类选择器 三、字体属性1.设置字体家族2.设置字体大小3.设置字体粗细4.文字倾斜 四、文本属性1.文本对齐2.文本装饰3.文本缩进4.背景设置 五、圆角矩形六、CSS 盒子模…

【编码艺术:掌握String类函数接口的妙用指南】

【本节目标】 1. 为什么要学习string类 2. 标准库中的string类 1. 为什么要学习string类 1.1 C语言中的字符串 C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0c; 但是这些库函数与…