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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

华中科技大学计算机系统基础实验报告.docx

1、华中科技大学计算机系统基础实验报告课 程 实 验 报 告课程名称: 计算机系统基础 专业班级: 学 号: 姓 名: 指导教师: 报告日期: 2016年 5月 24 日 计算机科学与技术学院 实验1: 数据表示 1.1 实验概述 本实验的目的是更好地熟悉和掌握计算机中整数和浮点数的二进制编码表示。实验中,你需要解开一系列编程“难题”使用有限类型和数量的运算操作实现一组给定功能的函数,在此过程中你将加深对数据二进制编码表示的了解。实验语言:c; 实验环境: linux1.2 实验内容 需要完成 bits.c 中下列函数功能,具体分为三大类:位操作、补码运算和浮点数操作。1.3 实验设计 源码如下:

2、/* * lsbZero - set 0 to the least significant bit of x * Example: lsbZero(0x87654321) = 0x87654320 * Legal ops: ! & | + * Max ops: 5 * Rating: 1 */int lsbZero(int x) /x右移一位再左移一位实现把最低有效位置0 x = x1; x = x1; return x;/* * byteNot - bit-inversion to byte n from word x * Bytes numbered from 0 (LSB) to 3 (

3、MSB) * Examples: getByteNot(0x12345678,1) = 0x1234A978 * Legal ops: ! & | + * Max ops: 6 * Rating: 2 */int byteNot(int x, int n) /x第n个字节每位都和1异或实现取反 int y = 0xff; n = n3; y = yn; x = (xy); return x;/* * byteXor - compare the nth byte of x and y, if it is same, return 0, if not, return 1 * example: by

4、teXor(0x12345678, 0x87654321, 1) = 1 * byteXor(0x12345678, 0x87344321, 2) = 0 * Legal ops: ! & | + * Max ops: 20 * Rating: 2 */int byteXor(int x, int y, int n) /把x和y的第n个字节取出来异或,再转换为逻辑的0和1 n = nn; y = yn; x = x&(0xff); y = y&(0xff); return !(xy);/* * logicalAnd - x & y * Legal ops: ! & | + * Max ops:

5、 20 * Rating: 3 */int logicalAnd(int x, int y) /把x和y分别转化为逻辑的0和1,再相与 x = (!(!x)&(!(!y); return x;/* * logicalOr - x | y * Legal ops: ! & | + * Max ops: 20 * Rating: 3 */int logicalOr(int x, int y) /把x和y分别转化为逻辑的0和1,再相或 x = (!(!x)|(!(!y); return x;/* * rotateLeft - Rotate x to the left by n * Can assum

6、e that 0 = n = 31 * Examples: rotateLeft(0x87654321,4) = 0x76543218 * Legal ops: & | + ! * Max ops: 25 * Rating: 3 */int rotateLeft(int x, int n) /先构造低n位为1,高(32-n)位为0的数z,x左移n位后的数加上x右移(32-n)位的数&z即可 int z; z = (131)(32+(n+1)&z)+(xn); return x;/* * parityCheck - returns 1 if x contains an odd number of

7、 1s * Examples: parityCheck(5) = 0, parityCheck(7) = 1 * Legal ops: ! & | + * Max ops: 20 * Rating: 4 */int parityCheck(int x) /每次将数的低半数位与高半数位比较,再把y右移31位,最后把y转化为逻辑的0和1 int y; y = x16; y = yx; y = y(y8); y = y(y4); y = y(y2); y = y(y31; return !(!y);/* * mul2OK - Determine if can compute 2*x without

8、overflow * Examples: mul2OK(0x30000000) = 1 * mul2OK(0x40000000) = 0 * * Legal ops: & | + * Max ops: 20 * Rating: 2 */int mul2OK(int x) /把x第31位和30位分别和1做按位与,再异或,再和1异或 int m; m = (x31)&0x1)(x30)&0x1); return m0x1;/* * mult3div2 - multiplies by 3/2 rounding toward 0, * Should exactly duplicate effect o

9、f C expression (x*3/2), * including overflow behavior. * Examples: mult3div2(11) = 16 * mult3div2(-9) = -13 * mult3div2(1073741824) = -536870912(overflow) * Legal ops: ! & | + * Max ops: 12 * Rating: 2 */int mult3div2(int x) /左移一位再+x即x*3,右移一位的时候,当y的最高位和最低位都为0时还要+1 int y = (x1)+(y31)&1)&(y31)&1); ret

10、urn y;/* * subOK - Determine if can compute x-y without overflow * Example: subOK(0x80000000,0x80000000) = 1, * subOK(0x80000000,0x70000000) = 0, * Legal ops: ! & | + * Max ops: 20 * Rating: 3 */int subOK(int x, int y) /x的最高有效位和y的最高有效位不同且x和(x-y)的最高位不同才能判断溢出 int m = (x31)&1; int n = (y31)&1; x = (mn)

11、&(m(x+(y+1)31)&1); return (!x);/* * absVal - absolute value of x * Example: absVal(-1) = 1. * You may assume -TMax = x = TMax * Legal ops: ! & | + * Max ops: 10 * Rating: 4 */int absVal(int x) /x最高位为0时就是x,最高位为1时是x+1 int y = x31; x = (y&(x+1)+(y)&x); return x;/* * float_abs - Return bit-level equival

12、ent of absolute value of f for * floating point argument f. * Both the argument and result are passed as unsigned ints, but * they are to be interpreted as the bit-level representations of * single-precision floating point values. * When argument is NaN, return argument. * Legal ops: Any integer/uns

13、igned operations incl. |, &. also if, while * Max ops: 10 * Rating: 2 */unsigned float_abs(unsigned uf) int x=uf&(10x7f800000) return uf; else return x;/* * float_f2i - Return bit-level equivalent of expression (int) f * for floating point argument f. * Argument is passed as unsigned int, but * it i

14、s to be interpreted as the bit-level representation of a * single-precision floating point value. * Anything out of range (including NaN and infinity) should return * 0x80000000u. * Legal ops: Any integer/unsigned operations incl. |, &. also if, while * Max ops: 30 * Rating: 4 */int float_f2i(unsign

15、ed uf) unsigned num=0x80000000; int x=(uf&0x007fffff)0x00800000; int order=0; order=(uf&0x7f800000)23; if(order158) return num; if(order31)&1)=1) if(order150) return (x(150-order)+1; else if(order150) return x(150-order); 1.4 实验过程编写源码,运行btest,得出实验结果。1.5实验结果 可见13个函数全部正确。1.6实验小结 此次实验主要考查的是对数据的处理,对此需要掌

16、握数据在机器中的表示,运用合理的位运算来实现相应的功能。实验2: Binary Bombs 2.1 实验概述本实验中,你要使用课程所学知识拆除一个“binary bombs”来增强对程序的机器级表示、汇编语言、调试器和逆向工程等方面原理与技能的掌握。一个“binary bombs”(二进制炸弹,下文将简称为炸弹)是一个Linux可执行C程序,包含了6个阶段(phase1phase6)。炸弹运行的每个阶段要求你输入一个特定的字符串,若你的输入符合程序预期的输入,该阶段的炸弹就被“拆除”,否则炸弹“爆炸”并打印输出 BOOM!字样。实验的目标是拆除尽可能多的炸弹层次。每个炸弹阶段考察了机器级语言程

17、序的一个不同方面,难度逐级递增:* 阶段1:字符串比较* 阶段2:循环* 阶段3:条件/分支* 阶段4:递归调用和栈* 阶段5:指针* 阶段6:链表/指针/结构另外还有一个隐藏阶段,但只有当你在第4阶段的解之后附加一特定字符串后才会出现。 为了完成二进制炸弹拆除任务,你需要使用gdb调试器和objdump来反汇编炸弹的可执行文件,并单步跟踪调试每一阶段的机器代码,从中理解每一汇编语言代码的行为或作用,进而设法“推断”出拆除炸弹所需的目标字符串。这可能需要你在每一阶段的开始代码前和引爆炸弹的函数前设置断点,以便于调试。实验语言:C语言实验环境:linux2.2 实验内容反汇编bomb,得到汇编代

18、码,根据汇编代码完成拆炸弹任务。2.2.1 阶段1 字符串比较1.任务描述:找到与输入的字符串进行比较的存储的字符串的首地址,进而得到存储的字符串,得到结果。2.实验设计:根据反汇编代码一步一步分析,具体见实验过程。3.实验过程:将bomb反汇编输出到asm.txt文件中,在反汇编代码中查找phase_1的位置:从上面的语句可以看出所需要的两个变量是存在于%ebp所指的堆栈存储单元里,在main函数中:得知%eax里存储的是调用read_line()函数后返回的结果,就是输入的字符串,所以得知和用户输入字符串比较的字符串的存储地址为0x804a204,可用gdb查看这个地址存储的数据内容:翻译

19、过后的结果为The future will be better tomorrow.4.实验结果:可见结果正确。2.2.2 阶段2 循环1.任务描述:完成炸弹2的拆除 2.实验设计:观察分析phase_2代码,使用gdb调试分析结果3.实验过程:找到phase_2代码:由read_six_numbers知是要输入6个数字,观察:可知输入的第一个和第二个必须依次为0,1观察这两个循环可知只有当输入的数为前两个数之和时才不会bomb,故得到序列0,1,1,2,3,54.实验结果:输入上述序列后得:可知结果正确。2.2.3 阶段3 条件/分支1.任务描述:完成炸弹3的拆除 2.实验设计:观察分析pha

20、se_3代码,使用gdb调试分析结果3.实验过程:找到phase_3代码如下:08048c0a : 8048c0a: 83 ec 3c sub $0x3c,%esp 8048c0d: 8d 44 24 2c lea 0x2c(%esp),%eax 8048c11: 89 44 24 10 mov %eax,0x10(%esp) 8048c15: 8d 44 24 27 lea 0x27(%esp),%eax 8048c19: 89 44 24 0c mov %eax,0xc(%esp) 8048c1d: 8d 44 24 28 lea 0x28(%esp),%eax 8048c21: 89 4

21、4 24 08 mov %eax,0x8(%esp) 8048c25: c7 44 24 04 4e a2 04 movl $0x804a24e,0x4(%esp)由此行代码查看输入内容:可知输入的依次是数字、字符、数字 8048c43: 83 7c 24 28 07 cmpl $0x7,0x28(%esp) 8048c48: 0f 87 f5 00 00 00 ja 8048d43 8048d43: e8 8d 04 00 00 call 80491d5 可见输入的第一个数一定小于7 8048c4e: 8b 44 24 28 mov 0x28(%esp),%eax 8048c52: ff 2

22、4 85 60 a2 04 08 jmp *0x804a260(,%eax,4)假设输入的第一个数为0,即(%eax)=0,所以: 8048c59: b8 76 00 00 00 mov $0x76,%eax 8048c5e: 81 7c 24 2c 04 01 00 cmpl $0x104,0x2c(%esp)所以第二个字符ascll码为0x76,即字符v而第三个数为0x104,即2604.实验结果:从实验结果来看结果正确,拆弹成功。2.2.4 阶段4 递归调用和栈1.任务描述:拆除炸弹4 2.实验设计:观察分析phase_4代码,使用gdb调试分析结果3.实验过程:用x/sb 0x804a

23、3cf 来查询有几个输入以及输入的类型,如下所示:由此可见输入是两个整数。再由phase_4中:知道func4第二个参数值为1f,即37再仔细研究func4函数,发现其实现了递归调用:08048d5c : 8048d5c: 56 push %esi 8048d5d: 53 push %ebx 8048d5e: 83 ec 14 sub $0x14,%esp 8048d61: 8b 54 24 20 mov 0x20(%esp),%edx /ebx是传递的参数/ 8048d65: 8b 44 24 24 mov 0x24(%esp),%eax 8048d69: 8b 74 24 28 mov 0

24、x28(%esp),%esi 8048d6d: 89 f1 mov %esi,%ecx 8048d6f: 29 c1 sub %eax,%ecx 8048d71: 89 cb mov %ecx,%ebx 8048d73: c1 eb 1f shr $0x1f,%ebx / ebx 右移31位 / 8048d76: 01 d9 add %ebx,%ecx 8048d78: d1 f9 sar %ecx 8048d7a: 8d 1c 01 lea (%ecx,%eax,1),%ebx 8048d7d: 39 d3 cmp %edx,%ebx 8048d7f: 7e 17 jle 8048d98 8

25、048d81: 8d 4b ff lea -0x1(%ebx),%ecx 8048d84: 89 4c 24 08 mov %ecx,0x8(%esp) 8048d88: 89 44 24 04 mov %eax,0x4(%esp) 8048d8c: 89 14 24 mov %edx,(%esp) 8048d8f: e8 c8 ff ff ff call 8048d5c 8048d94: 01 d8 add %ebx,%eax 8048d96: eb 1b jmp 8048db3 8048d98: 89 d8 mov %ebx,%eax 8048d9a: 39 d3 cmp %edx,%eb

26、x 8048d9c: 7d 15 jge 8048db3 8048d9e: 89 74 24 08 mov %esi,0x8(%esp) 8048da2: 8d 43 01 lea 0x1(%ebx),%eax 8048da5: 89 44 24 04 mov %eax,0x4(%esp) 8048da9: 89 14 24 mov %edx,(%esp) 8048dac: e8 ab ff ff ff call 8048d5c 8048db1: 01 d8 add %ebx,%eax 8048db3: 83 c4 14 add $0x14,%esp 8048db6: 5b pop %ebx

27、8048db7: 5e pop %esi 8048db8: c3 ret 下面就来剖析func4,这个函数在确定栈之后,首先取出来传递给它的参数,依次放在eax,edx,esi.中,从一个jle和一个jge可以看出,这个递归函数跳出的条件根据func4的第二个参数和第二个参数进过种种运算的结果等于第一个参数即可。注意在递归过程中第一个参数是不变的,最后返回值是经过运算后的ebx加上第一个参数。当时做实验时推出了具体的表达式,未记录下来,只记录了最后得出fun(11)=31。运行结果如下:由此可见,phase_4拆除成功!4.实验结果:给出阶段x的实验结果和必要的结果分析2.2.5 阶段5 ph

28、ase_51.任务描述:拆除一个关于指针的炸弹。2.实验设计: 此阶段实验与指针相关,又根据静态调试跟踪可知,需借助gdb的动态调试跟踪来查找相关地址中存放的数据的值,进而分析出最终的拆弹密码。3.实验过程: 首先观察代码,分析代码时发现有多个跳转指令,具体为x15时,bomb;x=1时,取x低4位;使用gdb调试发现,要输入的是两个%d数。由后面的步骤知输入第一个数为初始数组下标,第二个数为循环15次累加求的和。再接着: 8048e70: 8b 04 85 80 a2 04 08 mov 0x804a280(,%eax,4),%eax,这句就是从(0x804a280+eax*4)里面拿数据出来,加到eax上。因为eax只能是0F的数,所以0x804a260 这个地址里面存的应该是一个数据大小为16的数组,用gdb看,得到:观察到果然是一个数组,然后下面就是把5个输入对应ascll码的低4位转换的十进制数对应的数值一个一个的转化为这个数组,得到累加值ecx。观察循环部分:由此知当退出循环的条件是取出的数ea

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

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