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

news2024/9/22 17:25:02

题目

新建一个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即可,根本不用考虑究竟是哪个位置被打印(幸运号的福利)

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

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

相关文章

单片机AVR单片机病房控制系统设计+源程序

一、系统方案 设计一个可容8张床位的病房呼叫系统。要求每个床位都有一个按钮&#xff0c;当患者需要呼叫护士时&#xff0c;按下按钮&#xff0c;此时护士值班室内的呼叫系统板上显示该患者的床位号&#xff0c;并蜂鸣器报警。当护士按下“响应”键时&#xff0c;结束当前呼叫…

【无标题】读transformer

这里写目录标题 transformerabstractconclusionintroductionbackground注意力机制mlptransformer和RNN传递序列信息embedding之后维度越大的向量归一化后其单个值就越小&#xff0c;乘个根号512position encoding加入时序信息 transformer abstract 编码器和解码器的架构 处理…

强化学习中的Q学习

Q学习&#xff08;Q-Learning&#xff09;是强化学习中的一种基于值的学习方法&#xff0c;用于在有限马尔可夫决策过程&#xff08;MDP&#xff09;中学习最优的动作策略。Q学习主要用于离散状态和离散动作的问题。 以下是Q学习的基本概念和步骤&#xff1a; Q-Value&#xf…

程序员也需要养生——程序员睡不好,重视一下你的情绪吧

程序员也需要养生——程序员睡不好&#xff0c;重视一下你的情绪吧 睡眠是一个复杂的系统工程&#xff0c;可以促进生长发育&#xff0c;修复受损的组织。促进大脑细胞的修复等等。在情绪的失调会影响到我们的睡眠状况。 一、心情差&#xff0c;压力大&#xff0c;睡不好跟这…

XXL-Job详解(一):组件架构

目录 XXL-Job特性系统组成架构图调度模块剖析任务 “运行模式” 剖析执行器 XXL-Job XXL-JOB是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线&#xff0c;开箱即用。 特性 1、简单&#…

【驱动】串口驱动分析(二)-tty core

前言 tty这个名称源于电传打字节的简称&#xff0c;在linux表示各种终端&#xff0c;终端通常都跟硬件相对应。比如对应于输入设备键盘鼠标&#xff0c;输出设备显示器的控制终端和串口终端。也有对应于不存在设备的pty驱动。在如此众多的终端模型之中&#xff0c;linux是怎么…

信贷专员简历模板

这份简历内容&#xff0c;以信贷专员招聘需求为背景&#xff0c;我们制作了1份全面、专业且具有参考价值的简历案例&#xff0c;大家可以灵活借鉴。 信贷专员简历在线编辑下载&#xff1a;百度幻主简历 求职意向 求职类型&#xff1a;全职 意向岗位&#xff1a;信贷专员 …

Linux:docker的数据管理(6)

数据管理操作*方便查看容器内产生的数据 *多容器间实现数据共享 两种管理方式数据卷 数据卷容器 1.数据卷 数据卷是一个供容器使用的特殊目录&#xff0c;位于容器中&#xff0c;可将宿主机的目录挂载到数据卷上&#xff0c;对数据卷的修改操作立刻可见&#xff0c;并且更新数…

基于SpringBoot的在线视频教育平台的设计与实现

摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于在线视频教育平台当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了在线视频教育平台&#xff0c;它彻底改变了过…

Django二转Day03 04

0 cbv执行流程&#xff0c;self问题 path(index/, Myview.as_view()),Myview.as_view() 实例化后返回 变成return Myview.dispatch(request, *args, **kwargs)但是视图函数Myview中没有 dispatch 方法 所以去 父类View中寻找return View.dispatch(request, *args, **kwargs)调用…

动手学深度学习(六)---权重衰退

文章目录 一、理论知识二、代码实现【相关总结】 主要解决过拟合 一、理论知识 1、使用均方范数作为硬性限制&#xff08;不常用&#xff09; 通过限制参数值的选择范围来控制模型容量 通常不限制偏移b 小的意味着更强的正则项 使用均方范数作为柔性限制 对于每个都可以找到使…

Zabbix“专家坐诊”第213期问答汇总

问题一 Q&#xff1a;Zabbix报错&#xff1a;Zabbix server is not running :the information displayed may not be current&#xff0c;是什么问题呢&#xff1f; A&#xff1a; 1、数据库软件问题导致导入的zabbix数据库不完整2、zabbix Server配置问题3、zabbix-server没…

【C++】类和对象——const修饰成员函数和取地址操作符重载

在上篇博客中&#xff0c;我们已经对于日期类有了较为全面的实现&#xff0c;但是&#xff0c;还有一个问题&#xff0c;比如说&#xff0c;我给一个const修饰的日期类的对象 这个对象是不能调用我们上篇博客写的函数的&#xff0c;因为&d1是const Date*类型的&#xff…

【合集】MQ消息队列——Message Queue消息队列的合集文章 RabbitMQ入门到使用

前言 RabbitMQ作为一款常用的消息中间件&#xff0c;在微服务项目中得到大量应用&#xff0c;其本身是微服务中的重点和难点。本篇博客是Message Queue相关的学习博客文章的合集篇&#xff0c;目前主要是RabbitMQ入门到使用文章&#xff0c;后续会扩展其他MQ。 目录 前言一、R…

C++ ini配置文件的简单读取使用

ini文件就是简单的section 下面有对应的键值对 std::map<std::string, std::map<std::string, std::string>>MyIni::readIniFile() {std::ifstream file(filename);if (!file.is_open()) {std::cerr << "Error: Unable to open file " << …

Java多线程核心技术一-基础篇synchronzied同步方法

1 概述 关键字synchronzied保障了原子性、可见性和有序性。 非线程安全问题会在多个线程对同一个对象中的同一个实例变量进行并发访问时发生&#xff0c;产生的后果就是“脏读”&#xff0c;也就是读取到的数据其实是被更改过的。而线程安全是指获取的实例变量的值是经过同步处…

年终好价节买什么好?这些数码好物闭眼入

大家是不是都没听说过好价节&#xff1f;直截了当地说&#xff0c;这其实就是原先的双十二购物狂欢节&#xff0c;只不过给它起了个新名字。不过&#xff0c;今年毕竟是首次改名&#xff0c;因此淘宝年终好价节的各种优惠&#xff0c;仍然是我们值得期待的&#xff01;作为年前…

2023.11.29 深度学习框架理解

2023.11.29 深度学习框架理解 对深度学习框架进行复习&#xff0c;选最简单的“三好学生”问题的四个变化&#xff0c;简要总结其具体思路。 深度学习一开始就是为分类问题研究的&#xff0c;因此其框架的设计都是基于分类的问题&#xff0c;虽然现在也已经演变为可以执行多种…

Java中的JMX的使用

文章目录 1. 定义和存在的意义2. 架构2.1 Instrumentation2.2 JMX Agent2.3 Remote Management 3. 启动和连接3.1 注册MBean3.2 有两个方式启动JMX Agent3.3 Remote Management(客户端) 4. MBeanServerConnection使用4.1 列出所有的MBean4.2 列出所有的Domain4.3 MBean计数4.4 …

Python (十六) 错误和异常

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&…