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.hqwc.cn/news/234544.html

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

相关文章

基于微博的信息热度评价与预测分析

摘 要 微博已成为时下非常热门的社交媒体平台&#xff0c;是一个庞大的关于信息分享和话题交流的平台&#xff0c;在人们线上社交活动中发挥着不可替代的作用&#xff0c;由于网络信息鱼龙混杂&#xff0c;所以本文通过了解微博的热度机制进而研究微博热度和预测微博的热门程度…

esp32-s3部署yolox_nano进行目标检测

ESP32-S3部署yolox_nano进行目标检测 一、生成模型部署项目01 环境02 配置TVM包03 模型量化3.1预处理3.2 量化 04 生成项目 二、烧录程序 手上的是ESP32-S3-WROOM-1 N8R8芯片&#xff0c;整个链路跑通了&#xff0c;但是识别速度太慢了&#xff0c;20秒一张图&#xff0c;所以暂…

深入了解Java8新特性-日期时间API之ChronoUnit、ChronoField

阅读建议 嗨&#xff0c;伙计&#xff01;刷到这篇文章咱们就是有缘人&#xff0c;在阅读这篇文章前我有一些建议&#xff1a; 本篇文章大概3000多字&#xff0c;预计阅读时间长需要5分钟。本篇文章的实战性、理论性较强&#xff0c;是一篇质量分数较高的技术干货文章&#x…

Python (十六) 错误和异常

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

【李肯C语言小册.必读】为什么有这份专栏?解决什么问题?有哪些价值?是否值得订阅?

文末有惊喜...... 一、李肯的自我介绍 【昵称】架构师李肯 【坐标】深圳 【职业】主业中厂物联网架构师&#xff0c;副业技术自媒体 【个人标签】 专注于嵌入式物联网超10年的系统架构师 国产操作系统RT-Thread技术社区专家、2022年度优秀布道师 CSDN深圳城市开发者社区主…

软件测试简历怎么写?可以参考这份简历

个人简历 基本信息 姓名&#xff1a;名字 性别&#xff1a;男 年龄&#xff1a;25 学历&#xff1a;本科 联系电话&#xff1a…

滚珠丝杆在各种自动化设备中的作用

滚珠丝杆因其具有高精度、高刚度和长寿命等特性&#xff0c;成为许多设备中的重要组成部分&#xff0c;在许多行业中都有广泛的应用&#xff0c;接下来我们看看滚珠丝杆的具体应用有哪些&#xff1f; 1、打孔机&#xff1a;提供精确的导向&#xff0c;使打孔机的滑块能够沿固定…

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

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

阿里云服务器部署node和npm

目录 1.链接服务器2.找到node 下载地址3获取链接地址4下载到linux5.解压6.重命名 解压后的文件7.配置环境变量7.1复制当前的bin目录7.2vim /etc/profile7.3在按下ESC按键 8.重启环境变量9.输入node10.npm配置加速镜像 1.链接服务器 2.找到node 下载地址 https://nodejs.org/d…

【WP】Geek Challenge 2023 web 部分wp

EzHttp http协议基础题 unsign 简单反序列化题 n00b_Upload 很简单的文件上传&#xff0c;上传1.php&#xff0c;抓包&#xff0c;发现php内容被过滤了&#xff0c;改为<? eval($_POST[‘a’]);?>&#xff0c;上传成功&#xff0c;命令执行读取就好了 easy_php …

商家门店小程序怎么做?门店小程序的优势和好处

生活服务类商家在当前数字化时代&#xff0c;越来越认识到门店小程序的重要性。门店小程序不仅为商家提供了一个在线展示的窗口&#xff0c;更为其打造了一个与消费者直接互动的平台。有了门店小程序&#xff0c;商家可以更加便捷地管理商品信息、订单流程&#xff0c;同时还能…

基于YOLOv8的道路缺陷检测:自研模块 MSAM 注意力 PK CBAM注意力,实现暴力涨点

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文自研创新改进&#xff1a;MSAM&#xff08;CBAM升级版&#xff09;&#xff1a;通道注意力具备多尺度性能&#xff0c;多分支深度卷积更好的提取多尺度特征&#xff0c;最后高效结合空间注意力 1&#xff09;作为注意力MSAM使用&am…