华科_计算机系统实验报告

合集下载

华科-计算机网络实验报告-javasocket编程-网络组建实验

华科-计算机网络实验报告-javasocket编程-网络组建实验

课程实验报告课程名称:专业班级:计算机科学与技术1003班学号:姓名:鲁辰指导教师:报告日期:计算机科学与技术学院目录1实验二 Socket 编程(E-Mail)................... 错误!未定义书签。

实验目的....................................... 错误!未定义书签。

实验要求....................................... 错误!未定义书签。

实验内容....................................... 错误!未定义书签。

实验过程....................................... 错误!未定义书签。

需求分析................................... 错误!未定义书签。

界面....................................... 错误!未定义书签。

写信....................................... 错误!未定义书签。

收信....................................... 错误!未定义书签。

实验体会....................................... 错误!未定义书签。

2 实验2 网络组建与实施............................. 错误!未定义书签。

实验目的....................................... 错误!未定义书签。

实验环境、要求................................. 错误!未定义书签。

实验实验环境............................... 错误!未定义书签。

实验要求.................................... 错误!未定义书签。

华科操作系统实验

华科操作系统实验

华科操作系统实验 Corporation standardization office #QS8QHH-HHGX8Q8-GNHHJ8课程实验报告课程名称:操作系统课程设计专业班级:学号:姓名:指导教师:报告日期:计算机科学与技术学院目录实验1:进程并发实验1.1 实验概述通过本次进程并发实验,让同学更加熟悉和理解Linux编程环境。

1.2 实验内容本次实验的内容主要分为两个任务:1.编写一个C程序,用read、write等系统调用实现文件拷贝功能。

命令形式:copy <源文件名> <目标文件名>2. 编写一个C程序,使用图形编程库 (QT/GTK)分窗口显示三个并发进程的运行(一个窗口实时显示当前系统时间,一个窗口循环显示0到9,一个窗口做1到1000的累加求和,刷新周期均为1秒)。

1.3 实验设计任务1:实验1的第一个阶段需要实现一个简单的C语言程序,首先需要有一个复制的源文件,同时需要创建一个存放复制内容的复制文件,文件复制传输的中间站可以设置一个缓冲数组,此次试验设计了一个大小为10个字节的数组。

打开复制源文件,返回一个INT标识,使用readbuf()函数,每次读取10个字节的内容,将内容存放到缓冲区数组,使用writebuf()函数将缓冲区的10个字节写到复制文件中,重复上述过程直到将整个复制过程完成。

任务2:实验的第二个阶段是实现进程的同步,实现的工具是QT。

主要实现3个进程的同步,3个进程分别为:实时显示系统时间、循环显示0-9、显示1-1000的累加和。

以上程序的刷新时间设置为1秒钟。

使用的是c++编程语言。

为了实现3个进程。

需要为这3个进程分别创建3个不同的类,这3个不用的类具有不同的成员函数,使用成员函数来实现进程的所代表的具体细节。

为了实现进程的结果能实时更新,需要调用connect()函数,该函数的功能是每当其中的timer每次发生变化时,就回调用该类的成员函数,也就是进程的具体实现,从而实时显示进程的细节内容。

操作系统实验报告--华科

操作系统实验报告--华科

实验一哲学家就餐问题一、实验目的1、熟练使用VC++6.0编译环境,调试并正确运行程序。

2、理解哲学家就餐问题中出现的问题,进而掌握死锁的必要条件。

3、理解源程序中产生和防止死锁的算法,及相关窗口操作。

4、熟悉哲学家就餐问题流程。

5、在VC++6.0环境下编译哲学家就餐问题演示程序,考虑其他解决死锁方法.二、实验原理1、问题描述有五个哲学家围坐在一圆桌旁,桌中央有一盘通心粉,每人面前有一只空盘子,每两人之间放一只筷子。

每个哲学家的行为是思考,感到饥饿,然后吃通心粉。

为了吃通心粉,每个哲学家必须拿到两只筷子,并且每个人只能直接从自己的左边或右边去取筷子。

2、分配方式方式一(不会进入死锁)仅当一个哲学家左右两边的筷子都可用时,才允许他拿筷子。

这样要么一次占有两只筷子(所有线程需要的资源)进行下一步的吃通心粉,然后释放所有的资源;要么不占用资源,这样就不可能产生死锁了。

方式二(会进入死锁)当筷子(资源)可用时,先分配左边的筷子,等待一会后再分配右边的筷子,由于这个过程中,左边的筷子一直没有释放,就有可能产生死锁了。

3、程序运行说明程序运行过程中会弹出一个MessageBox提示操作者操作:1)第一个对话框用于选择运行模式a.选择yes 表示采用的是运行的防止死锁的方式,这样的话整个程序可以一直运行下去,不会产生死锁。

b.选择no 表示运行产生死锁的方式会弹出第二个对话框。

2)第二个对话框用于选择运行时,线程运行的时间a. 选择res 线程时间比较短,很快就可以死锁b.选择no 线程时间跟选择yes 时候的时间差不多,产生死锁的时间稍微长一点。

三、实验过程及分析1、伪代码:1) 不发生死锁的方式(要么一下占用两支筷子,要么不占用)var mutexleftchopstick,mutexrightchopstick;beging:resting;waiting;p(mutexleftchopstick); //先改变左手筷子信号量p(mutexrightchopstick); //马上改变右手筷子信号量GetResource(leftchopstick,rightchopstick);eating;v(mutexleftchopstick);v(mutexrightchopstick);end2) 发生死锁的方式(一旦可以占用筷子,就马上占用)var mutexleftchopstick,mutexrightchopstick;beging:resting;waiting;p(mutexleftchopstick); //改变左手筷子信号量GetResource(leftchopstick); //获取左手筷子p(mutexrightchopstick); //改变右手筷子信号量GetResource(rightchopstick); //获取右手筷子eating;v(mutexleftchopstick);v(mutexrightchopstick);end2、代码分析:1)不发生死锁的方式:先确定两只筷子均没被占用才获取筷子,这样就打破了死锁的必要条件。

华中科技大学计算机原理实验报告

华中科技大学计算机原理实验报告

电气学科大类《计算机原理与应用实验》课程实验报告电气与电子工程学院级姓名:学号:专业班号:日期:2014年1月7日实验成绩:评阅人:实验评分表目录实验评分表错误!未指定书签。

实验一:软件安装与使用错误!未指定书签。

一、实验目的错误!未指定书签。

二、实验设备错误!未指定书签。

三、实验任务错误!未指定书签。

四、实验原理错误!未指定书签。

五、实验内容错误!未指定书签。

六、实验过程及结果错误!未指定书签。

七、实验感想八、参考文献实验二:汇编语言实例讲解与程序编写一、实验目的二、实验设备三、实验任务四、实验原理五、实验内容六、实验过程及结果七、实验感想八、参考文献实验三:基于软件的最小系统硬件设计一、实验目的二、实验设备三、实验任务四、实验原理五、实验内容六、实验过程及结果七、实验感想八、参考文献实验四:基于最小系统的汇编程序设计一、实验目的错误!未指定书签。

二、实验设备错误!未指定书签。

三、实验任务错误!未指定书签。

四、实验原理错误!未指定书签。

五、实验内容六、实验过程及结果七、实验感想八、参考文献实验五:并行接口实验(演示实验)一、实验目的二、实验设备三、实验任务四、实验原理五、实验内容六、实验过程及结果七、实验感想八、参考文献实验六:工频测频接口电路设计与实现一、实验目的二、实验设备三、实验任务四、实验原理五、实验内容六、实验过程及结果七、实验感想八、参考文献实验一:软件安装与使用一、实验目的通过本实验学习软件的安装与使用。

二、实验设备微机一台,仿真软件三、实验任务.安装仿真软件。

.利用仿真软件编程。

四、实验原理仿真软件就是在下的一种仿真软件,它可以仿真模拟的程序运行,并且可以直观地观察寄存器的变化情况。

结合了一个先进的原始编辑器、组译器、反组译器、具除错功能的软件模拟工具(虚拟),还有一个循序渐进的指导工具。

这对刚开始学组合语言的人会是一个很有用的工具。

它会在模拟器中一步一步的编译程序码并执行,视觉化的工作环境让它更容易使用。

计算机系统实验报告

计算机系统实验报告

计算机系统实验报告计算机系统实验报告一、引言计算机系统是现代社会不可或缺的一部分,它的发展与应用深刻地影响着我们的生活。

为了更好地理解和掌握计算机系统的工作原理,我们进行了一系列的实验。

本报告将对这些实验进行总结和分析,以便更好地理解计算机系统的运行机制。

二、实验目的本次实验的主要目的是通过实际操作和观察,加深对计算机系统各个组成部分的理解。

具体实验内容包括CPU的运行原理、内存管理、进程调度等。

三、实验过程与结果1. CPU的运行原理在本次实验中,我们通过模拟CPU的运行过程,深入了解了指令的执行过程。

我们使用了一系列指令,包括算术运算、逻辑运算、条件判断等。

通过观察指令的执行结果,我们可以清楚地看到CPU对指令的解码、执行和结果输出过程。

2. 内存管理内存管理是计算机系统中非常重要的一部分,它负责管理计算机的内存资源。

在本次实验中,我们学习了内存的分配与回收算法。

通过实际操作,我们了解了最先适应算法、最佳适应算法等不同的内存分配策略,并对它们的优缺点进行了比较和分析。

3. 进程调度进程调度是操作系统中的一个重要功能,它负责决定哪个进程先执行,哪个进程后执行。

在本次实验中,我们模拟了多个进程的运行,并通过实验操作观察了不同的调度算法对系统性能的影响。

我们了解了先来先服务算法、短作业优先算法、时间片轮转算法等不同的调度算法,并对它们的优劣进行了探讨。

四、实验结果分析通过以上实验,我们对计算机系统的各个组成部分有了更深入的了解。

我们发现,CPU的运行原理决定了计算机的运算速度和效率,内存管理直接影响了计算机的稳定性和资源利用率,而进程调度则决定了系统的响应速度和用户体验。

因此,合理的CPU设计、高效的内存管理和优秀的进程调度算法是保证计算机系统高效运行的关键。

五、实验总结通过本次实验,我们不仅加深了对计算机系统的理论知识的理解,还通过实际操作和观察,更加直观地感受到了计算机系统的工作原理。

我们了解了CPU的运行过程、内存管理的重要性以及进程调度的作用。

华科操作系统实验

华科操作系统实验

课程实验报告课程名称:操作系统课程设计专业班级:学号:姓名:指导教师:报告日期:计算机科学与技术学院目录实验1:进程并发实验 (1)实验概述 (1)实验内容 (1)实验设计 (1)实验过程 (2)实验结果 (6)实验小结 (7)实验2:添加系统功能调用 (8)实验概述 (8)实验内容 (8)阶段1 添加源代码 (8)阶段2 连接新的系统功能调用 (9)阶段3 重建内核 (10)阶段4 修改grub文件 (13)实验小结 (14)实验3:添加设备驱动程序 (15)实验概述 (15)实验内容 (15)阶段1 编写设备驱动程序 (15)阶段2 编译设备驱动模块 (16)阶段3 加载设备驱动模块 (17)阶段4 生成设备文件 (18)阶段5 编写应用程序测试 (18)实验小结 (19)实验总结 (20)实验1:进程并发实验实验概述通过本次进程并发实验,让同学更加熟悉和理解Linux编程环境。

实验内容本次实验的内容主要分为两个任务:1.编写一个C程序,用read、write等系统调用实现文件拷贝功能。

命令形式:copy <源文件名> <目标文件名>2.编写一个C程序,使用图形编程库 (QT/GTK)分窗口显示三个并发进程的运行(一个窗口实时显示当前系统时间,一个窗口循环显示0到9,一个窗口做1到1000的累加求和,刷新周期均为1秒)。

实验设计任务1:实验1的第一个阶段需要实现一个简单的C语言程序,首先需要有一个复制的源文件,同时需要创建一个存放复制内容的复制文件,文件复制传输的中间站可以设置一个缓冲数组,此次试验设计了一个大小为10个字节的数组。

打开复制源文件,返回一个INT标识,使用readbuf()函数,每次读取10个字节的内容,将内容存放到缓冲区数组,使用writebuf()函数将缓冲区的10个字节写到复制文件中,重复上述过程直到将整个复制过程完成。

任务2:实验的第二个阶段是实现进程的同步,实现的工具是QT。

华科并行实验报告

华科并行实验报告

一、实验模块计算机科学与技术二、实验标题并行计算实验三、实验目的1. 了解并行计算的基本概念和原理;2. 掌握并行编程的基本方法;3. 通过实验加深对并行计算的理解。

四、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 并行计算平台:OpenMP五、实验步骤1. 准备实验环境首先,在计算机上安装OpenMP库,并配置环境变量。

2. 编写并行计算程序编写一个简单的并行计算程序,实现以下功能:(1)计算斐波那契数列的第n项;(2)计算素数的个数;(3)计算矩阵乘法。

以下为斐波那契数列的并行计算程序示例:```cpp#include <omp.h>#include <iostream>using namespace std;int main() {int n = 30;int fib[31] = {0};fib[0] = 0;fib[1] = 1;#pragma omp parallel forfor (int i = 2; i <= n; i++) {fib[i] = fib[i - 1] + fib[i - 2];}cout << "斐波那契数列的第" << n << "项为:" << fib[n] << endl; return 0;}```3. 编译程序使用g++编译器编译程序,并添加OpenMP库支持。

```bashg++ -fopenmp -o fib fib.cpp```4. 运行程序在命令行中运行编译后的程序,观察结果。

5. 分析结果通过对比串行计算和并行计算的结果,分析并行计算的优势。

六、实验过程1. 准备实验环境,安装OpenMP库并配置环境变量;2. 编写并行计算程序,实现斐波那契数列的并行计算;3. 编译程序,并添加OpenMP库支持;4. 运行程序,观察结果;5. 分析结果,对比串行计算和并行计算的性能。

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

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

课程实验报告课程名称:计算机系统基础专业班级:学号:姓名:指导教师:报告日期:2016年5月24 日计算机科学与技术学院目录实验1: (2)实验2: (9)实验3: (22)实验总结 (30)实验1:数据表示1.1 实验概述本实验的目的是更好地熟悉和掌握计算机中整数和浮点数的二进制编码表示。

实验中,你需要解开一系列编程“难题”——使用有限类型和数量的运算操作实现一组给定功能的函数,在此过程中你将加深对数据二进制编码表示的了解。

实验语言:c; 实验环境: linux1.2 实验内容需要完成bits.c 中下列函数功能,具体分为三大类:位操作、补码运算和浮点数操作。

1.3 实验设计源码如下:/** 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右移一位再左移一位实现把最低有效位置0x = x>>1;x = x<<1;return x;}/** byteNot - bit-inversion to byte n from word x* Bytes numbered from 0 (LSB) to 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 = n<<3;y = y<<n;x = (x^y);return x;}/** byteXor - compare the nth byte of x and y, if it is same, return 0, if not, return 1* example: byteXor(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和1n = n<<3;x = x>>n;y = y>>n;x = x&(0xff);y = y&(0xff);return !!(x^y);}/** logicalAnd - x && y* Legal ops: ! ~ & ^ | + << >>* Max ops: 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 assume 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 = ~(((1<<31)>>31)<<n);x = ((x>>(32+(~n+1)))&z)+(x<<n);return x;}/** parityCheck - returns 1 if x contains an odd number of 1's* Examples: parityCheck(5) = 0, parityCheck(7) = 1* Legal ops: ! ~ & ^ | + << >>* Max ops: 20* Rating: 4*/int parityCheck(int x) {//每次将数的低半数位与高半数位比较,再把y右移31位,最后把y转化为逻辑的0和1int y;y = x<<16;y = y^x;y = y^(y<<8);y = y^(y<<4);y = y^(y<<2);y = y^(y<<1);y = y>>31;return !(!y);}/** mul2OK - Determine if can compute 2*x without 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 = ((x>>31)&0x1)^((x>>30)&0x1);return m^0x1;}/** mult3div2 - multiplies by 3/2 rounding toward 0,* Should exactly duplicate effect of 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时还要+1int y = (x<<1)+x;y = (y>>1)+(((y>>31)&1)&(((y<<31)>>31)&1));return 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 = (x>>31)&1;int n = (y>>31)&1;x = (m^n)&(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+1int y = x>>31;x = (y&(~x+1))+((~y)&x);return x;}/** float_abs - Return bit-level equivalent of absolute value of f for * floating point argument f.* 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 * 0x80000000u.* Legal ops: Any integer/unsigned operations incl. ||, &&. also if, while* Max ops: 30* Rating: 4*/int float_f2i(unsigned uf) {unsigned num=0x80000000;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);}}1.4 实验过程编写源码,运行btest,得出实验结果。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程实验报告课程名称:计算机系统基础专业班级:学号:姓名:指导教师:报告日期:年月日计算机科学与技术学院目录实验1: (1)实验2: (7)实验3: (24)实验总结 (34)实验1:数据表示1.1 实验概述实验目的:更好地熟悉和掌握计算机中整数和浮点数的二进制编码表示。

实验目标:加深对数据二进制编码表示的了解。

实验要求:使用有限类型和数量的运算操作实现一组给定功能的函数。

实验语言:c。

实验环境:linux1.2 实验内容需要完成bits.c中下列函数功能,具体分为三大类:位操作、补码运算和浮点数操作。

1)位操作表1列出了bits.c中一组操作和测试位组的函数。

其中,“级别”栏指出各函数的难度等级(对应于该函数的实验分值),“功能”栏给出函数应实现的输出(即功能),“约束条件”栏指出你的函数实现必须满足的编码规则(具体请查看bits.c中相应函数注释),“最多操作符数量”指出你的函数实现中允许使用的操作符的最大数量。

你也可参考tests.c中对应的测试函数来了解所需实现的功能,但是注意这些测试函数并不满足目标函数必须遵循的编码约束条件,只能用做关于目标函数正确行为的参考。

表1 位操作题目列表2)补码运算表2列出了bits.c中一组使用整数的补码表示的函数。

可参考bits.c中注释说明和tests.c中对应的测试函数了解其更多具体信息。

表2 补码运算题目列表3)浮点数操作表3列出了bits.c中一组浮点数二进制表示的操作函数。

可参考bits.c中注释说明和tests.c中对应的测试函数了解其更多具体信息。

注意float_abs的输入参数和返回结果(以及float_f2i函数的输入参数)均为unsigned int类型,但应作为单精度浮点数解释其32 bit二进制表示对应的值。

表3 浮点数操作题目列表表示,当输入参数是NaN 时,返回NaN 号整型操作,包括||,&&以及if,while控制结构4 float_f2i 返回浮点数‘f’的强制整型转换“(int)f”表示仅能使用任何整型/无符号整型操作,包括||,&&以及if,while控制结构301.3 实验设计根据题目要求,选择合适的操作符来编写代码。

具体设计参考实验过程中的代码注释。

1.4 实验过程阅读相应的函数要求,利用合适的操作符编写代码。

如下:1.lsbZero函数:图1.12.byteNot函数:图1.23.byteXor函数:图1.34.logicalAnd函数:图1.45.logicalOr函数:图1.5 6.rotateLeft函数:图1.6 7.parityCheck函数:图1.7 8.mul2OK函数:图1.8 9.mult3div2函数:图1.9 10.subOK函数:图1.10 11.absVal函数:图1.1112.float_abs函数:图1.1213.float_f2i函数:图1.131.5实验结果1.使用dlc检查函数实现代码是否符合实验要求的编码规则。

a)首先./dlc bits.c直接检测是否有错误。

如图1.14所示:图1.14由图知,输出Compilation Successful(1 warning),故bits.c文件编写无误符合要求。

b)然后用-e选项调用dlc,观察操作符数。

如图1.15所示:图1.152.使用 btest 检查函数实现代码的功能正确性。

a)首先使用make编译生成btest可执行程序,如图1.16所示:图1.16b)然后调用 btest 命令检查 bits.c中所有函数的功能正确性。

如图1.17所示:图1.17由图知,得分全拿到了,故bits.c文件中函数功能都实现了。

1.6实验小结这次实验让我更好地熟悉和掌握计算机中整数和浮点数的二进制编码表示。

尤其是加深对数据二进制编码表示的了解。

通过使用有限类型和数量的运算操作实现一组给定功能的函数来提高了我对数据表示方面的C语言编程能力。

总之这次实验的过程整体还是很愉快的,耗时不是很长但是收获很大!实验2:拆弹实验2.1 实验概述实验目的:增强对程序的机器级表示、汇编语言、调试器和逆向工程等方面原理与技能的掌握。

实验目标:需要拆除尽可能多的炸弹。

实验要求:使用gdb调试器和objdump来反汇编炸弹的可执行文件,并单步跟踪调试每一阶段的机器代码,从中理解每一汇编语言代码的行为或作用,进而设法“推断”出拆除炸弹所需的目标字符串。

实验语言:c。

实验环境:linux2.2 实验内容一个“binary bombs”(二进制炸弹,下文将简称为炸弹)是一个Linux可执行C程序,包含了6个阶段(phase1~phase6)。

炸弹运行的每个阶段要求你输入一个特定的字符串,若你的输入符合程序预期的输入,该阶段的炸弹就被“拆除”,否则炸弹“爆炸”并打印输出 "BOOM"字样。

实验的目标是拆除尽可能多的炸弹层次。

每个炸弹阶段考察了机器级语言程序的一个不同方面,难度逐级递增:* 阶段1:字符串比较* 阶段2:循环* 阶段3:条件/分支* 阶段4:递归调用和栈* 阶段5:指针* 阶段6:链表/指针/结构另外还有一个隐藏阶段,但只有当你在第4阶段的解之后附加一特定字符串后才会出现。

为了完成二进制炸弹拆除任务,你需要使用gdb调试器和objdump来反汇编炸弹的可执行文件,并单步跟踪调试每一阶段的机器代码,从中理解每一汇编语言代码的行为或作用,进而设法“推断”出拆除炸弹所需的目标字符串。

这可能需要你在每一阶段的开始代码前和引爆炸弹的函数前设置断点,以便于调试。

2.2.1 阶段1 字符串比较1.任务描述:通过phase_1的反汇编代码找出要输入的字符串。

2.实验设计:利用gdb结合断点来动态地分析。

3.实验过程:观察phase_1的反汇编代码,如图2.1.1所示:图2.1.1发现在调用strings_not_equal对比字符串之前,有一个地址送入了堆栈,大胆猜测该地址就是正确字符串的首址,于是在phase_1处下个断点,运行至此处后,用x命令查看字符串。

如图2.1.2所示:图2.1.2故猜测“Border relations with Canada have never been better.”就是所需字符串。

重新执行该程序,直接输入该字符串,观察结果。

如图2.1.3所示:图2.1.34.实验结果:如图2.1.3所示,阶段一拆弹成功!阶段一很简单,当初的找出字符串首地址就可以了,没有什么大的难点。

2.2.2 阶段2 循环1.任务描述:通过phase_2的反汇编代码推断第二阶段要输入的数据2.实验设计:利用gdb结合断点来动态地分析3.实验过程:观察phase_1的前一部分反汇编代码,如图2.2.1所示:图2.2.1发现输入的应该是六个数字,而且要求[esp+0x18]必须大于等于0才行,于是测试输入“0 1 2 3 4 5”,观察这些数字在调用read_six_numbers后是如何存放在栈中的,如图2.2.2所示:图2.2.2观察到执行read_six_numbers后,输入的数字依次存放在esp+0x18、esp+0x1c、esp+0x20、esp+0x24、esp+0x28、esp+0x2c中,故对输入的数字首先就要有第一个数不能小于0。

继续观察phase_2的后一部分反汇编代码,如图2.2.3所示:图2.2.3能容易发现这是一个循环,首先将ebx赋值为1,然后比较[esp+ebx*4+0x14]加上ebx与[esp+ebx*4+0x18]是否相等,相等就ebx加一继续执行,直到ebx 等于6后退出。

然后来分析应该输入的值。

第一个数只要大于等于0就可以。

不妨就输入0。

他将会被保存在esp+0x18处。

所以ebx等于1时,有[esp+ebx*4+0x18]=[esp+0x1c]=[esp+ebx*4+0x14]+ebx=[esp+0x18]+1。

故第二个输入的数字应该为0+1=1。

同理分析可得后面的数依次为3、6、10、15。

故这六个数依次为0、1、3、6、10、15。

重新执行该程序,直接输入“0 1 3 6 10 15”,观察结果。

如图2.2.4所示:图2.2.44.实验结果:如图2.2.4所示,阶段二拆弹成功!阶段二涉及到了小的循环,慢慢的依次执行很同意就能发现规律,也不是很难。

2.2.3 阶段3 条件/分支1.任务描述:通过phase_3的反汇编代码推断第三阶段要输入的数据2.实验设计:利用gdb结合断点来动态地分析3.实验过程:观察phase_3的前一部分反汇编代码,如图2.3.1所示:图2.3.1发现输入的应该要求__isoc99_sscanf@plt的返回值大于1,于是观察调用__isoc99_sscanf@plt时格式字符串的值,在0x8048c23处下断点然后进入函数单步调试,并测试输入“0 1 2 3 4”,如图2.3.2所示:图2.3.2观察到格式字符串为“%d %d”,故只需输入两个数字即可。

同phase_2操作可以发现输入的数字依次存放在esp+0x18、esp+0x1c中。

继续观察phase_3的后一部分反汇编代码,如图2.3.3所示:图2.3.3可以显然的发现一个数字要求不能比0x7大,然后就会将第一个数字送入eax中,然后跳转至[eax*4+0x804a1c0]处执行,显然是个分支程序。

重新调试程序输入“1 100”,观察执行到0x8048c86处eax的值,即第二个数应该的值。

如图2.3.4所示:图2.3.4故第二个数为61。

重新执行该程序,直接输入“1 61”,观察结果。

如图2.3.5所示:图2.3.54.实验结果:如图2.3.5所示,阶段三拆弹成功!阶段三用到了分支,由于没有必要弄懂整个分支的功能,只要选择其中的某一路就可以了,所以解决起来也不是很难,单步执行下去就能很快的找到第二个输入的正确值。

2.2.4 阶段4 递归调用和栈1.任务描述:通过phase_4以及func4的反汇编代码推断第四阶段要输入的数据2.实验设计:利用gdb结合断点来动态地分析3.实验过程:观察phase_4的前一部分反汇编代码,如图2.4.1所示:图2.4.1发现输入的应该要求__isoc99_sscanf@plt的返回值等于2,于是同阶段三一样测试观察调用__isoc99_sscanf@plt时格式字符串的值,发现为仍然为“%d %d”,而且[esp+0x18]要求小于等于0xe。

如图2.4.2所示:图2.4.2继续观察phase_4的后一部分反汇编代码,如图2.4.3所示:图2.4.3可以不难发现依次将输入的第一个数,以及0x0和0xe作为参数传给func4,要求返回值为0xf而且输入的第二个数与0xf相等才不会爆炸。

相关文档
最新文档