2017-2018-1 学号 《信息安全系统设计基础》第6周课堂测试补交
第六周课上测试补交
测试3
编写一个程序 “week0603学号.c",运行下面代码:
1 short int v = -学号后四位
2 unsigned short uv = (unsigned short) v
3 printf("v = %d, uv = %u\n ", v, uv);在第三行设置断点用gdb调试,用p /x v; p /x uv 查看变量的值,提交调试结果截图,要全屏,要包含自己的学号信息
3 分析p /x v; p /x uv 与程序运行结果的不同和联系
要进行gdb测试,首先要把调试信息加到可执行文件中,然后对gdbtest进行gdb调试
【图片】【】【】【】
输入“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;
}
- 参考http://www.cnblogs.com/lxm20145215----/p/5982554.html,使用gdb跟踪汇编代码,在纸上画出f中每一条语句引起的eip(rip),ebp(rbp),esp(rsb),eax(rax)的值和栈的变化情况。提交照片,要有学号信息。
先把题目中的代码编译,在进入gdb调试
最后得到计算结果
ch02课下作业
完成教材p97 2.96 2.97,要有完备的测试
#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;
}
}
}
运行
#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;
}
}
}
运行
缓冲区溢出漏洞实验
还没做完,做完我再来修改照片部落格