课程实验报告课程名称:计算机系统基础专业班级:学号:姓名:指导教师:报告日期: 2016年 5月 24 日计算机科学与技术学院目录实验1: ................................. 错误!未定义书签。
实验2: ................................. 错误!未定义书签。
实验3: ................................. 错误!未定义书签。
实验总结................................. 错误!未定义书签。
实验1:数据表示实验概述本实验的目的是更好地熟悉和掌握计算机中整数和浮点数的二进制编码表示。
实验中,你需要解开一系列编程“难题”——使用有限类型和数量的运算操作实现一组给定功能的函数,在此过程中你将加深对数据二进制编码表示的了解。
实验语言:c; 实验环境: linux实验内容需要完成中下列函数功能,具体分为三大类:位操作、补码运算和浮点数操作。
实验设计源码如下:/** lsbZero - set 0 to the least significant bit of x* Example: lsbZero(0x) = 0x* Legal ops: ! ~ & ^ | + << >>* Max ops: 5* Rating: 1*/int lsbZero(int x) {* Examples: mult3div2(11) = 16* mult3div2(-9) = -13* mult3div2(24) = -2(overflow)* Legal ops: ! ~ & ^ | + << >>* Max ops: 12* Rating: 2*/int mult3div2(int x) {* You may assume -TMax <= x <= TMax* Legal ops: ! ~ & ^ | + << >>* Max ops: 10* Rating: 4*/int absVal(int x) {* Both the argument and result are passed as unsigned int's, 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/unsigned operations incl. ||, &&. also if, while* Max ops: 10* Rating: 2*/unsigned float_abs(unsigned uf) {int x=uf&(~(1<<31));if(x>0x7f800000){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 is 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 * 0xu.* Legal ops: Any integer/unsigned operations incl. ||, &&. also if, while* Max ops: 30* Rating: 4*/int float_f2i(unsigned uf) {unsigned num=0x;int x=(uf&0x007fffff)^0x00800000;int order=0;order=(uf&0x7f800000)>>23;if(order>158){return num;}if(order<127) return 0;else if(((uf>>31)&1)==1){if(order>150){return ~(x<<(order-150))+1;}else return ~(x>>(150-order))+1;else{if(order>150) return x<<(order-150);else return x>>(150-order);}}实验过程编写源码,运行btest,得出实验结果。
实验结果可见13个函数全部正确。
实验小结此次实验主要考查的是对数据的处理,对此需要掌握数据在机器中的表示,运用合理的位运算来实现相应的功能。
实验2: Binary Bombs实验概述本实验中,你要使用课程所学知识拆除一个“binary bombs”来增强对程序的机器级表示、汇编语言、调试器和逆向工程等方面原理与技能的掌握。
一个“binary bombs”(二进制炸弹,下文将简称为炸弹)是一个Linux 可执行C程序,包含了6个阶段(phase1~phase6)。
炸弹运行的每个阶段要求你输入一个特定的字符串,若你的输入符合程序预期的输入,该阶段的炸弹就被“拆除”,否则炸弹“爆炸”并打印输出 "BOOM"字样。
实验的目标是拆除尽可能多的炸弹层次。
每个炸弹阶段考察了机器级语言程序的一个不同方面,难度逐级递增:* 阶段1:字符串比较* 阶段2:循环* 阶段3:条件/分支* 阶段4:递归调用和栈* 阶段5:指针* 阶段6:链表/指针/结构另外还有一个隐藏阶段,但只有当你在第4阶段的解之后附加一特定字符串后才会出现。
为了完成二进制炸弹拆除任务,你需要使用gdb调试器和objdump来反汇编炸弹的可执行文件,并单步跟踪调试每一阶段的机器代码,从中理解每一汇编语言代码的行为或作用,进而设法“推断”出拆除炸弹所需的目标字符串。
这可能需要你在每一阶段的开始代码前和引爆炸弹的函数前设置断点,以便于调试。
实验语言:C语言实验环境:linux实验内容反汇编bomb,得到汇编代码,根据汇编代码完成拆炸弹任务。
阶段1 字符串比较1.任务描述:找到与输入的字符串进行比较的存储的字符串的首地址,进而得到存储的字符串,得到结果。
2.实验设计:根据反汇编代码一步一步分析,具体见实验过程。
3.实验过程:将bomb反汇编输出到文件中,在反汇编代码中查找phase_1的位置:从上面的语句可以看出<strings_not_equal>所需要的两个变量是存在于%ebp 所指的堆栈存储单元里,在main函数中:得知%eax里存储的是调用read_line()函数后返回的结果,就是输入的字符串,所以得知和用户输入字符串比较的字符串的存储地址为0x804a204,可用gdb查看这个地址存储的数据内容:翻译过后的结果为The future will be better tomorrow. 4.实验结果:可见结果正确。
阶段2 循环1.任务描述:完成炸弹2的拆除2.实验设计:观察分析phase_2代码,使用gdb调试分析结果3.实验过程:找到phase_2代码:由read_six_numbers知是要输入6个数字,观察:可知输入的第一个和第二个必须依次为0,1观察这两个循环可知只有当输入的数为前两个数之和时才不会bomb,故得到序列0,1,1,2,3,54.实验结果:输入上述序列后得:可知结果正确。
阶段3 条件/分支1.任务描述:完成炸弹3的拆除2.实验设计:观察分析phase_3代码,使用gdb调试分析结果3.实验过程:找到phase_3代码如下:08048c0a <phase_3>:8048c0a: 83 ec 3c sub $0x3c,%esp8048c0d: 8d 44 24 2c lea 0x2c(%esp),%eax8048c11: 89 44 24 10 mov %eax,0x10(%esp)8048c15: 8d 44 24 27 lea 0x27(%esp),%eax8048c19: 89 44 24 0c mov %eax,0xc(%esp)8048c1d: 8d 44 24 28 lea 0x28(%esp),%eax8048c21: 89 44 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 <phase_3+0x139>…8048d43: e8 8d 04 00 00 call 80491d5 <explode_bomb>可见输入的第一个数一定小于78048c4e: 8b 44 24 28 mov 0x28(%esp),%eax8048c52: ff 24 85 60 a2 04 08 jmp *0x804a260(,%eax,4)假设输入的第一个数为0,即(%eax)=0,所以:8048c59: b8 76 00 00 00 mov $0x76,%eax8048c5e: 81 7c 24 2c 04 01 00 cmpl $0x104,0x2c(%esp)所以第二个字符ascll码为0x76,即字符'v'而第三个数为0x104,即2604.实验结果:从实验结果来看结果正确,拆弹成功。
阶段4 递归调用和栈1.任务描述:拆除炸弹42.实验设计:观察分析phase_4代码,使用gdb调试分析结果3.实验过程:用x/sb 0x804a3cf 来查询有几个输入以及输入的类型,如下所示:由此可见输入是两个整数。