ImageVerifierCode 换一换
格式:DOCX , 页数:24 ,大小:1.36MB ,
资源ID:9451318      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9451318.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(计算机系统基础II实验报告.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

计算机系统基础II实验报告.docx

1、计算机系统基础II实验报告学生实验报告册(理工类)课程名称:0 专业班级:10学生学号: 160 学生姓名: 所属院部:计指导教师: 20182019学年 第 1 学期 实验报告书写要求实验报告原则上要求学生手写,要求书写工整。若因课程特点需打印的,要遵照以下字体、字号、间距等的具体要求。纸张一律采用A4的纸张。实验报告书写说明实验报告中一至四项内容为必填项,包括实验目的和要求;实验仪器和设备;实验内容与过程;实验结果与分析。各院部可根据学科特点和实验具体要求增加项目。填写注意事项(1)细致观察,及时、准确、如实记录。(2)准确说明,层次清晰。(3)尽量采用专用术语来说明事物。(4)外文、符号

2、、公式要准确,应使用统一规定的名词和符号。(5)应独立完成实验报告的书写,严禁抄袭、复印,一经发现,以零分论处。实验报告批改说明实验报告的批改要及时、认真、仔细,一律用红色笔批改。实验报告的批改成绩采用百分制,具体评分标准由各院部自行制定。实验报告装订要求实验批改完毕后,任课老师将每门课程的每个实验项目的实验报告以自然班为单位、按学号升序排列,装订成册,并附上一份该门课程的实验大纲。实验项目名称: 缓冲区溢出攻击基础篇 实验学时: 4 同组学生姓名: 无 实验地点: 1116 实验日期: 11.26、12.3 实验成绩: 批改教师: 批改时间: 一、实验目的和要求1、初步了解IA-32函数调用

3、规则和栈结构。2、基本掌握gcc、gdb以及objdump等工具的运用。二、实验仪器和设备硬件环境:IA-32软件环境:Linux ubuntu14.04,C语言,gcc,gdb三、实验内容与过程1、实验内容对一个可执行程序“bufbomb”实施一系列缓冲区溢出攻击(buffer overflow attacks),也就是设法通过造成缓冲区溢出来改变可执行程序的运行内存映像,继而执行一些原来程序中没有的行为。对目标可执行程序BUFBOMB分别完成5个难度递增的缓冲区溢出攻击。5个难度级分别命名为Candle(level 0)、Sparkler(level 1)、Firecracker(leve

4、l 2)、Dynamite(level 3)和Nitroglycerin(level 4),其中Candle级最简单而Nitroglycerin级最困难。(本次实验完成前三个难度级别的攻击,即Candle、Sparkler和Firecracker)2、实验步骤1)下载实验数据。实验数据包括三个可执行文件,即bufbomb、makecookie和hex2raw。2)仔细阅读附录1中的文档,充分深入地了解实验数据、实验环境以及实验工具的使用方法。3)利用gdb以及objbump工具分析相应的程序代码、内存映像以及相应函数的栈结构。4)如有必要,编写对应的指令,用gcc将其变换为机器代码。5)精心设

5、计一些字符串存入一个文本文件(solution.txt)中,然后按如下命令输入给bufbomb,有意造成缓冲区溢出,并使得屏幕上能显示出“NICE JOB!”。unix cat solution.txt | ./hex2raw | ./bufbomb -u 四、实验结果与分析本次实验利用getbuf()方程不检查读取string长度的漏洞破坏该方程的返回地址从而达到对主程序造成破坏的目的。从getbuf() 的汇编代码我们可以看到:位于 地址处代码为预读的string在stack创建了0x28(也就是40)个Byte 的空间。具体位置可以通过gdb在下一行设置breakpoint 查找 %ea

6、x 的值得到,如下所示:通过gdb调试得到,getbuf()申请的40字节缓冲区首地址为。Level0:Smoke在bufbomb的反汇编源代码中找到smoke函数,记下它的起始地址:攻击字符串的功能是用来覆盖getbuf函数内的数组buf(缓冲区),进而溢出并覆盖ebp和ebp上面的返回地址,所以攻击字符串的大小应该是0x28+4+4=48个字节。并且其最后4个字节应是smoke函数的地址,正好覆盖ebp上方的正常返回地址。这样再从getbuf返回时,取出的根据攻击字符串设置的地址,就可实现控制转移。总共48个字节,并且前面44个字节可以为任意值,对程序的执行没有任何影响,只要最后四个字节正

7、确地设置为smoke的起始地址即可,对应内存写入28 8c 04 08(小端格式)。栈帧示意图如下图所示。可以将上述攻击字符串写在攻击字符串文件中,命名为123.txt,之后通过hex2raw处理过滤掉所有的注释,还原成没有任何冗余数据的攻击字符串原始数据而代入bufbomb中使用。通过Linux终端执行:显示结果如下:Level1:Fizzlevel1 和 level0 大同小异,唯一的区别是本次要求跳入函数 fizz(int) 且该函数有一个参数(要求用所给cookie作argument)。我们知道在执行完ret指令后栈顶指针 %esp 会自动增加4以还原栈帧。通过查找fizz()得知:f

8、izz()函数的起始地址为。由栈帧图示可知,ebp存放了调用者的旧ebp(saved %ebp),其上一位置ebp+4存放了调用者的返回地址,所以参数的地址应该为ebp+8的位置,我们只需要将自己的cookie放置在该位置即可。栈帧示意图如下图所示。构造攻击文件456.txt其中,为fizz函数起始地址,0x49bd5724为自己的cookie,通过参数传递给fizz。最后结果如下:Level2:bangLevel2中除了需要跳转至目标函数bang() 地址为:我们还需要执行一些自行设计的指令,该任务需要将global_value 的值改成我们的cookie,通过objdump -D 反汇编可

9、以看到:global_value的地址是, 目前该位置的初始值为 0 ;cookie的地址是, 目前该位置的值初始为 0,程序运行后会变为cookie的值。在程序运行时将global_value的值设置为cookie的值。构造自定义攻击指令bang.s:先将global_value地址用movl指令变cookie(0x0804d100前不加$表示地址),然后将bang()函数写给esp,在执行ret指令时,程序自动跳入bang()函数。指令gcc -m32 -c bang.s将assembly code写成machine code -bang.o,再用objdump -d bang.o读取ma

10、chine code如下:将指令代码抄入攻击文件,除此之外我们还需找input string存放的位置作为第一次ret 指令的目标位置, 经过gdb调试分析getbuf()申请的40字节缓冲区首地址为。栈帧示意图如下:构造攻击字符串789.txt如下:最后执行测试结果如下:五、实验思考题和实验心得。1、思考题1. 请绘制出函数getbuf栈结构的示意图。2、实验心得本次实验整体难度不大,基本上可以找到他们的共同点:几个级别实现的攻击都是使得程序跳转到不同于正常返回地址的其他函数中,进而结束整个程序的运行。只要理解了一个懂得它的原理,开头做出来了,便可以顺藤摸瓜进行下面的实验。本次实验难点就在不

11、同级别的函数它的攻击指令也不尽相同,需要仔细的弄懂原理,通过这次实验,我对函数调用的实现过程有了深刻的理解。对gfb、objdump等命令的调用,我对Linux 32位系统中函数调用规则和栈结构的理解更加深刻了。实验项目名称: 缓冲区溢出攻击提高篇 实验学时: 4 同组学生姓名: 无 实验地点: 1116 实验日期: 12.10、12.17 实验成绩: 批改教师: 批改时间: 一、实验目的和要求1、加深对IA-32函数调用规则和栈结构的具体理解。 2、熟练掌握gcc、gdb以及objdump等工具的运用。二、实验仪器和设备硬件环境:IA-32软件环境:Linux ubuntu14.04,C语言

12、,gcc,gdb三、实验过程1、实验内容对一个可执行程序“bufbomb”实施一系列缓冲区溢出攻击(buffer overflow attacks),也就是设法通过造成缓冲区溢出来改变可执行程序的运行内存映像,继而执行一些原来程序中没有的行为。实验中你需要对目标可执行程序BUFBOMB分别完成5个难度递增的缓冲区溢出攻击。5个难度级分别命名为Candle(level 0)、Sparkler(level 1)、Firecracker(level 2)、Dynamite(level 3)和Nitroglycerin(level 4),其中Candle级最简单而Nitroglycerin级最困难。(

13、本次实验完成第四个和第五个难度级别的攻击,即Dynamite和Nitroglycerin。)2、实验步骤1)下载实验数据。实验数据包括三个可执行文件,即bufbomb、makecookie和hex2raw。2)仔细阅读附录2中的文档,充分深入地了解实验数据、实验环境以及实验工具的使用方法。3)利用gdb以及objbump工具分析相应的程序代码、内存映像以及相应函数的栈结构。4)编写对应的指令,用gcc将其变换为机器代码。5)精心设计一些字符串存入一个文本文件(solution.txt)中,然后按如下命令输入给bufbomb,有意造成缓冲区溢出,并使得屏幕上能显示出“NICE JOB!”。uni

14、x cat solution.txt | ./hex2raw | ./bufbomb -u 四、实验结果与分析Level3:bomb在本任务中getbuf() 结束后回到test()原本的位置(即call getbuf后的下一行),并将你的cookie作为getbuf()的返回值传给test()。为了使攻击更加具有迷惑性希望旧 ebp被复原,确保原程序不会因为外部攻击而出错崩溃,也就是退出攻击后要保证栈空间还原。要还原栈帧,必须知道在调用getbuf()之前的原始ebp的值,这里使用gdb调试来获取,可以在(准备进入getbuf函数)设置断点,然后查看进入getbuf之前的%ebp寄存器值,这

15、里得到的旧的ebp的值为,如下:构造攻击指令bomb.s如下:通过movl指令将cookie值传给%eax以返回给test(),然后使得程序跳转到test()中call getbuf下一条指令正常返回,但是并不在这里处理ebp寄存器问题,而是通过在攻击字符串里面设置ebp寄存器使得其还原为旧ebp。对其进行编译,然后反汇编得到机器码:栈帧示意图如下:构造攻击字符串101112.txt如下:最后执行测试结果如下:Level4:nitro本级要使用./bufbomb的-n参数,bufbomb不会再像从前哪样调用test(),而是调用testn(),testn()又调getbufn()。本级的任务是

16、使getbufn返回cookie给testn()。bufbomb会连续要我们输入5次字符串,每次都调用getbufn(),每次的栈地址都不一样。(1)用汇编指令 nop (机械代码:90)填充我们的Input string。这样一来在一定范围内无论在哪里进入我们的攻击程序执行指令最终都会滑到我们的攻击方程;(2)虽然ebp的值每次变化,无法直接赋值,但是在getbufn()程序中 ebp和esp值差是一定的通过gdp查找我们可以查到这样的关系,比如我这里是相差0x28;(3)通过空input运行主程序发现五次input string的存储位置在0x55682df8 到0x55682e48之间,

17、因此如果我们将第一次ret address 定为最高的0x55682e48那么就可以保证五次运行执行命令都不会在运行攻击程序之前遇到除nop(90)之外的其他指令。bufbomb在5次调用testn()和getbufn()的过程中,两个函数的栈是连续的,在testn()汇编代码开头有可知%esp=%ebp-4-0x24,即 %ebp = %esp + 0x28。其中,getbufn执行ret前的leave指令已经正确地恢复%esp(leave等价于 mov %ebp,%esp; pop %ebp,我们的字符串无法覆盖%ebp,%esp寄存器,%esp是从寄存器%ebp里来的。构造攻击指令nit

18、ro.s如下:对其进行编译,然后反汇编得到机器码:使用gdb调试发现5次getburn循环里面,缓冲区首地址情况如下:构造攻击字符串131415.txt如下:.最后执行测试结果如下:五、实验心得在此次实验中,主要完成了第3、第4等级的缓冲区溢出攻击。前一个实验中的几个级别实现的攻击都是使得程序跳转到不同于正常返回地址的其他函数中,进而结束整个程序的运行,这样的攻击方法我们在学习了以后已经能理解它的原理。然而,更高明的缓冲区溢出攻击除执行攻击代码来改变程序的寄存器或内存中的值外,仍然使得程序能够返回到原来的调用函数继续执行,这种攻击方式就不同于正常的想法了,有些难理解了。尤其是最后攻击指令填充的

19、90,很好奇为什么是90,后来通过请教老师才知道90是nop指令的机械代码。通过objdump、gdb命令的使用,我对Linux 32位系统中的函数调用和栈的结构理解更深了。实验项目名称: 存储保护 实验学时: 4 同组学生姓名: 无 实验地点: 1116 实验日期: 12.24、12.29 实验成绩: 批改教师: 批改时间: 一、实验目的和要求通过实际程序的执行结果,了解程序执行时访问违例的检测和处理过程。二、实验仪器和设备硬件环境:IA-32软件环境:Linux ubuntu14.04,C语言,gcc,gdb三、实验过程1、实验内容执行以下程序,通过gdb调试找到发生异常的指令以及发生访问

20、违例的存储单元地址。主要程序段如下:int sum(int a , unsigned len) int i,sum = 0; for (i = 0; i = len1; i+) sum += ai; return sum;2、实验步骤1)使用len=0调用sum函数,分别给出在Windows和Linux系统中的执行结果。2)在Linux系统中,用gdb调试工具,通过设置正确的断点、显示通用寄存器的内容等手段,确定发生异常的指令,并指出发生的是什么异常,以及发生访问违例的存储单元地址。3)分析从CPU检测到异常到屏幕中出现“Segment fault”的整个过程中,CPU和操作系统各做了哪些事情

21、?四、实验结果与分析Windows系统中,该程序无法运行。如图:Linux系统中,该程序运行如下:提示:段错误(核心已转储)查了一下资料,总结了以下几个方面的原因:1.内存访问出错:这类问题的典型代表就是数组越界。2.非法内存访问:出现这类问题主要是程序试图访问内核段内存而产生的错误。3.栈溢出:Linux默认给一个进程分配的栈空间大小为8M。c+申请变量时,new操作申请的变量在堆中,其他变量一般在存储在栈中。进行GDB调试:查表找到如下图所示地址73f和6d9的位置,eax和esp 所在的栈发生溢出。main函数反汇编代码:sum函数反汇编代码:运行结果分析:函数栈帧结构示意图如下:五、实验心得本次实验与前两次实验不同,前两次实验大同小异,但是本次实验需要通过实际程序的执行结果,了解程序执行时访问违例的检测和处理过程。通过反汇编代码一步一步了解运行的情况,通过栈帧示意图,可以直观地看出sum函数被调用过程中的执行情况。虽然能够做出正确的实验结果,但是还是感觉云里雾里的,以后我会多学习这方面的知识,能够独立思考除一个实验的解决方法,而不是一味的模仿借鉴。通过这次实验,感觉自己对于计算机系统基础的知识储备还不够,以后会多加学习这些底层的东西。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1