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

2023-11-30 21:20

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

这篇关于csapp-linklab之第3阶段“输出学号”实验报告(强弱符号)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/438594

相关文章

在Linux中改变echo输出颜色的实现方法

《在Linux中改变echo输出颜色的实现方法》在Linux系统的命令行环境下,为了使输出信息更加清晰、突出,便于用户快速识别和区分不同类型的信息,常常需要改变echo命令的输出颜色,所以本文给大家介... 目python录在linux中改变echo输出颜色的方法技术背景实现步骤使用ANSI转义码使用tpu

使用Java将实体类转换为JSON并输出到控制台的完整过程

《使用Java将实体类转换为JSON并输出到控制台的完整过程》在软件开发的过程中,Java是一种广泛使用的编程语言,而在众多应用中,数据的传输和存储经常需要使用JSON格式,用Java将实体类转换为J... 在软件开发的过程中,Java是一种广泛使用的编程语言,而在众多应用中,数据的传输和存储经常需要使用j

MySQL中的两阶段提交详解(2PC)

《MySQL中的两阶段提交详解(2PC)》:本文主要介绍MySQL中的两阶段提交(2PC),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录引言两阶段提交过程sync_binlog配置innodb_flush_log_at_trx_commit配置总结引言在Inn

python多种数据类型输出为Excel文件

《python多种数据类型输出为Excel文件》本文主要介绍了将Python中的列表、元组、字典和集合等数据类型输出到Excel文件中,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一.列表List二.字典dict三.集合set四.元组tuplepython中的列表、元组、字典

Spring AI集成DeepSeek实现流式输出的操作方法

《SpringAI集成DeepSeek实现流式输出的操作方法》本文介绍了如何在SpringBoot中使用Sse(Server-SentEvents)技术实现流式输出,后端使用SpringMVC中的S... 目录一、后端代码二、前端代码三、运行项目小天有话说题外话参考资料前面一篇文章我们实现了《Spring

Rust格式化输出方式总结

《Rust格式化输出方式总结》Rust提供了强大的格式化输出功能,通过std::fmt模块和相关的宏来实现,主要的输出宏包括println!和format!,它们支持多种格式化占位符,如{}、{:?}... 目录Rust格式化输出方式基本的格式化输出格式化占位符Format 特性总结Rust格式化输出方式

使用TomCat,service输出台出现乱码的解决

《使用TomCat,service输出台出现乱码的解决》本文介绍了解决Tomcat服务输出台中文乱码问题的两种方法,第一种方法是修改`logging.properties`文件中的`prefix`和`... 目录使用TomCat,service输出台出现乱码问题1解决方案问题2解决方案总结使用TomCat,

C++中实现调试日志输出

《C++中实现调试日志输出》在C++编程中,调试日志对于定位问题和优化代码至关重要,本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳,希望对大家有所帮助... 目录1. 使用 #ifdef _DEBUG 宏2. 加入时间戳:精确到毫秒3.Windows 和 MFC 中的调试日志方法MFC

Python使用Colorama库美化终端输出的操作示例

《Python使用Colorama库美化终端输出的操作示例》在开发命令行工具或调试程序时,我们可能会希望通过颜色来区分重要信息,比如警告、错误、提示等,而Colorama是一个简单易用的Python库... 目录python Colorama 库详解:终端输出美化的神器1. Colorama 是什么?2.

顺序表之创建,判满,插入,输出

文章目录 🍊自我介绍🍊创建一个空的顺序表,为结构体在堆区分配空间🍊插入数据🍊输出数据🍊判断顺序表是否满了,满了返回值1,否则返回0🍊main函数 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~ 🍊自我介绍   Hello,大家好,我是小珑也要变强(也是小珑),我是易编程·终身成长社群的一名“创始团队·嘉宾”