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

相关文章

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

Detectorn2预训练模型复现:数据准备、训练命令、日志分析与输出目录

Detectorn2预训练模型复现:数据准备、训练命令、日志分析与输出目录 在深度学习项目中,目标检测是一项重要的任务。本文将详细介绍如何使用Detectron2进行目标检测模型的复现训练,涵盖训练数据准备、训练命令、训练日志分析、训练指标以及训练输出目录的各个文件及其作用。特别地,我们将演示在训练过程中出现中断后,如何使用 resume 功能继续训练,并将我们复现的模型与Model Zoo中的

第六章习题11.输出以下图形

🌏个人博客:尹蓝锐的博客 希望文章能够给到初学的你一些启发~ 如果觉得文章对你有帮助的话,点赞 + 关注+ 收藏支持一下笔者吧~ 1、题目要求: 输出以下图形

LibSVM学习(五)——分界线的输出

对于学习SVM人来说,要判断SVM效果,以图形的方式输出的分解线是最直观的。LibSVM自带了一个可视化的程序svm-toy,用来输出类之间的分界线。他是先把样本文件载入,然后进行训练,通过对每个像素点的坐标进行判断,看属于哪一类,就附上那类的颜色,从而使类与类之间形成分割线。我们这一节不讨论svm-toy怎么使用,因为这个是“傻瓜”式的,没什么好讨论的。这一节我们主要探讨怎么结合训练结果文件

下载/保存/读取 文件,并转成流输出

最近对文件的操作又熟悉了下;现在记载下来:学习在于 坚持!!!不以细小而不为。 实现的是:文件的下载、文件的保存到SD卡、文件的读取输出String 类型、最后是文件转换成流输出;一整套够用了; 重点: 1:   操作网络要记得开线程; 2:更新网络获取的数据 切记用Handler机制; 3:注意代码的可读性(这里面只是保存到SD卡,在项目中切记要对SD卡的有无做判断,然后再获取路径!)