2017-2018-1 学号 《信息安全系统设计基础》第6周课堂测试补交

2017-2018-1 学号 《信息安全系统设计基础》第6周课堂测试补交

第六周课上测试补交

测试3

  1. 编写一个程序 “week0603学号.c",运行下面代码:
    1 short int v = -学号后四位
    2 unsigned short uv = (unsigned short) v
    3 printf("v = %d, uv = %u\n ", v, uv);

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

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

要进行gdb测试,首先要把调试信息加到可执行文件中,然后对gdbtest进行gdb调试

【图片】【】【】【】1071578-20171029230105101-999972332.jpg

输入“l”显示文件中的内容,然后设置断点,输入变量进行输出

【图片】【】【】【】

测试5

1 通过输入gcc -S -o main.s main.c 将下面c程序”week0603学号.c“编译成汇编代码
int g(int x){
return x+3;
}
int f(int x){
int i = 学号后两位;
return g(x)+i;
}
int main(void){
return f(8)+1;
}

  1. 参考http://www.cnblogs.com/lxm20145215----/p/5982554.html,使用gdb跟踪汇编代码,在纸上画出f中每一条语句引起的eip(rip),ebp(rbp),esp(rsb),eax(rax)的值和栈的变化情况。提交照片,要有学号信息。

先把题目中的代码编译,在进入gdb调试
1071578-20171029230217414-950972063.jpg

1071578-20171029230224945-1708438023.jpg

最后得到计算结果

1071578-20171029230250226-752121396.jpg

ch02课下作业

完成教材p97 2.96 2.97,要有完备的测试
1071578-20171029230313586-21767530.jpg

#include <stdio.h>
#include <limits.h>
typedef unsigned float_bits;

int float_f2i(float_bits f)
{
    unsigned sign=f>>31;
    unsigned exp = (f>>23)&0xff;
    unsigned frac = f&0x7fffff;

    if(exp == 0)
        return 0;
    if(exp == 0xff)
        return 0x80000000;
    unsigned m = frac+0x800000;
    int e =exp-127;
    if(e<0)
        return 0;
    else if(e>31)
        return 0x80000000;
    else if(e<23)
        m>>(23-e);
    else
        m<<(e-23);
    return sign<<31|m;
}

int main()
{
    int i;
    unsigned u;
    float f;
    for(u=0;u<=10;u++)
    {
        f=*((float*)&u);
        i=float_f2i(u);
        if((int)f == i)
            printf("%u ok\n",u);
        else
        {
            printf("error");
            return -1;
        }
    }
}

运行
1071578-20171029230612351-146061146.jpg

#include<stdio.h>
#include<limits.h>

typedef unsigned float_bits;
float_bits float_i2f(int i)
{
    unsigned u=(unsigned)i;
    if(!u)
        return 0u;
    unsigned sign=u>>31;
    unsigned exp,frac,f;
    if(sign)
        u=(~u)+1;
    unsigned j,leftmost_one;
    for(j=0;j<32;j++)
    {
        leftmost_one=u&(0x80000000>>j);
        if(leftmost_one)
            break;
    }
    exp=158u-j;
    f=u<<j<<1;
    unsigned last_bit=(f&0x200)>>9;
    unsigned truncation=f&0x1ff;
    if(truncation<0x100)
        frac=f>>9;
    else if(truncation>0x100)
        frac=(f>>9)+1;
    else
    {
        if(last_bit)
            frac=(f>>9)+1;
        else
            frac=f>>9;
    }
    if(frac>>23)
    {
        ++exp;
        frac=0;
    }
    return (sign<<31)|(exp<<23)|frac;
}
int main()
{
    int i;
    unsigned r;
    float f,fr;
    for(i=INT_MIN;i<INT_MAX;i++)
    {
        r=float_i2f(i);
        fr=*((float*)&r);
        f=(float)i;
        if(fr==f)
            printf("%d:ok\n",i);
        else
        {
            printf("%d: %f %f error\n",i,f,fr);
            return -1;
        }
    }
}

运行
1071578-20171029231208867-1548558449.jpg

缓冲区溢出漏洞实验

还没做完,做完我再来修改照片部落格

转载于:https://www.cnblogs.com/lnaswxc/p/7751803.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值