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

相关文章

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,大家好,我是小珑也要变强(也是小珑),我是易编程·终身成长社群的一名“创始团队·嘉宾”

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出 在数字化时代,文本到语音(Text-to-Speech, TTS)技术已成为人机交互的关键桥梁,无论是为视障人士提供辅助阅读,还是为智能助手注入声音的灵魂,TTS 技术都扮演着至关重要的角色。从最初的拼接式方法到参数化技术,再到现今的深度学习解决方案,TTS 技术经历了一段长足的进步。这篇文章将带您穿越时

笔记整理—内核!启动!—kernel部分(2)从汇编阶段到start_kernel

kernel起始与ENTRY(stext),和uboot一样,都是从汇编阶段开始的,因为对于kernel而言,还没进行栈的维护,所以无法使用c语言。_HEAD定义了后面代码属于段名为.head .text的段。         内核起始部分代码被解压代码调用,前面关于uboot的文章中有提到过(eg:zImage)。uboot启动是无条件的,只要代码的位置对,上电就工作,kern

如何将一个文件里不包含某个字符的行输出到另一个文件?

第一种: grep -v 'string' filename > newfilenamegrep -v 'string' filename >> newfilename 第二种: sed -n '/string/!'p filename > newfilenamesed -n '/string/!'p filename >> newfilename