• 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 ", 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("	");
       printf("位级表示:%f
    ",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,之后按步骤进行可以成功

  • 相关阅读:
    [leetcode] 48. 旋转图像(Java)(模拟)
    [leetcode] 47. 全排列 II
    [leetcode] 46. 全排列(Java)
    [leetcode] 45. 跳跃游戏 II(Java)(动态规划)
    [leetcode] 875. 爱吃香蕉的珂珂(周赛)
    [leetcode] 874. 行走机器人模拟(周赛)
    《数据结构与算法分析:C语言描述》复习——第八章“并查集”——并查集
    《数据结构与算法分析:C语言描述》复习——第六章“排序”——基数排序
    《数据结构与算法分析:C语言描述》复习——第六章“排序”——桶排序
    《数据结构与算法分析:C语言描述》复习——第六章“排序”——快速排序
  • 原文地址:https://www.cnblogs.com/fengxingck/p/7750856.html
Copyright © 2020-2023  润新知