20155301《信息安全系统设计基础》第六周学习总结

课上作业和课下作业

课上作业

第六周课上测试-2-ch02

任务要求

  1. 调用附图代码,编写一个程序 “week0602学号.c",用show_int(), show_float()打印一下你的4位学号,参考教材P33打印出匹配的位序列。

  2. 提交运行结果截图,要全屏,要包含自己的学号信息

  3. 参考教材p82,给出出匹配的位序列的推导过程

解决方式

1.书上是打印出int,float的16进制的数字,然后16进制的数字转化成2进制的数,两种2进制的数字有一部分是匹配的。

2.我自己的理解刚开始是错的,我将start[i]转变成2进制数然后存到一个数组里面,改变了函数的参数由

void show_bytes(byte_pointer start,size_t len)

变成了

void show_bytes(byte_pointer start,size_t len,int x[])

数组x用来保存2进制数,但是运行之后发现不对,之后发现start[i]应该是10进制的,我利用程序是将16进制的变成2进制的,所以错了。发现了错误以后不知道该怎么改正,因为%.2x是打印出的16进制数,实际上在内存里并没有这个显示出来的16进制数保存,就不知道该怎么解决这个问题。

第六周课上测试-3-ch02

任务要求

  1. 编写一个程序 “week0603学号.c",运行下面代码:

1    short int v = -学号后四位

2   unsigned short uv = (unsigned short) v

3  printf("v = %d,  uv = %u\n ", v, uv);

  1. 在第三行设置断点用gdb调试,用p /x v; p /x uv 查看变量的值,提交调试结果截图,要全屏,要包含自己的学号信息

3 分析p /x v; p /x uv 与程序运行结果的不同和联系

解决方式

强制转换类型的结果保持位值不便,只是改变了解释这些位的方式

课下作业

ch02 课下作业1

任务要求

  1. 补充完成课上测试(不能只有截图,要有分析,问题解决过程,新学到的知识点)
  2. 完成教材 p97 2.96 2.97,要有完备的测试
  3. 发一篇相关内容的博客, 提交博客链接

解决方式2.96

1.关于什么是NaN上网查了一下,是Not a Number,其中有很多种,比如0.0/0.0或者负数开平方之类的。在我的程序里测试的是0.0/0.0。
2.如何判断一个数是否是NaN需要利用到一个函数和一个头文件<math.h>。函数是

int fpclassify(x):它用来查看浮点数x的情况,fpclassify可以用任何浮点数表达式作为参数,fpclassify的返回值有以下几种情况。

1.FP_NAN:x是一个“not a number”。

2.FP_INFINITE: x是正、负无穷。

3.FP_SUBNORMAL:x太小,以至于不能用浮点数的规格化形式表示。

4.FP_NORMAL: x是一个正常的浮点数(不是以上结果中的任何一种)。

解决方式2.97

在这题中我编写了几个辅助函数。

一个是阶乘的函数int RepMul(int a,int n)计算an

int RepMul(int a,int n)
{
    int i,sum=1;
    if(n==0)
        return 1;
    else
    {
        for(i=1;i<=n;i++)
        {
            sum=sum*a;
        }
        return sum;
    }
}

一个是void shuzu(int a[])这个函数将数组a[]每次加一,遇到就2进位,用来便利232个浮点数。

void shuzu(int a[])
{
    int flag=2,i,temp;
    for(i=31;;i--)
    {
            temp=a[i];
            if(i!=31)
            a[i]=(a[i]+flag)%2;
            else a[i]=(a[i]+1)%2;
            if(temp+1==2)
            flag=1;
            else flag=0;
            if(i<0||flag==0)
                break;
    }
}

一个是float xiaoshu(int n),用来计算小数部分的值。

float xiaoshu(int n)
{
    float flag=1.0;
    int i;
    for(i=0;i<n;i++)
    {
        flag=flag/2;
    }
    return flag;
}

一个是void f(int a[]),用来实现232个32为的浮点数对应点float数值

void f(int a[])
{
   int i,flag;
   float sum=0.0,sum1=0.0,sum2=0.0;
   for(i=0;i<32;i++)
   {
       a[i]=0;
   }
   while(1){
        flag=1;
   for(i=8;i>=1;i--)
   {
       sum1=sum1+(float)(a[i]*RepMul(2,i-8));
   }
   for(i=31;i>=9;i--)
   {
       sum2=sum2+(float)(a[i]*xiaoshu(i-8));
   }
   sum=sum1+sum2;
   for(i=0;i<32;i++)
   {
       printf("%d",a[i]);
   }
   printf("\t");
   printf("位级表示:%f\n",sum);
   shuzu(a);
   for(i=0;i<32;i++)
   {
       if(a[i]!=1)
       {
           flag=0;
           break;
       }
   }
   if(flag==1)
    break;
   }
}

image

ch02 课下作业2


之后在自己的虚拟机里按步骤进行之后同样无法进行,并且虚拟机在之后就无法启动了,其他同学也是在自己虚拟机里弄得,也出现了同样的问题,最后都只能新建一个虚拟机。
在第二次完成时无视了这个错误,按照步骤进行,与实验楼里面的教程不同的是计算shellcode的数值这一步骤,实验楼是0xffffd1b0,而我是0xffffd020,加上100之后得到0xffffd084,之后按步骤进行可以成功

posted @ 2017-10-29 19:40  滕树晨  阅读(200)  评论(0编辑  收藏  举报