2017-2018-1 20155306 《信息安全系统设计基础》第3周学习总结

2017-2018-1 20155306 《信息安全系统设计基础》第3周学习总结

教材学习内容总结

第二章 信息的表示和处理

p20: 三种数字:无符号数、有符号数(2进制补码)、浮点数,信息安全系同学从逆向角度考虑为什么会产生漏洞

无符号数:表示大于或者等于0的数字。

有符号数/补码:补码表示有符号整数的最常见的方式,可表示为正或为负的数字。

浮点数:是表示实数的科学计数法的以2为基数的版本。

至于出现漏洞的原因,应该是因为整数和浮点数处理数字表示有限性的方式不同。整数是表示一个较小的范围,是准确的。浮点数是编码一个较大的数值范围,是近似的。

p22: 进制转换,注意拿二进制作中间结果就好转了
之前的课程讲过,就是将非二进制的数值转化为二进制,再将已转化的二进制数值转化为其他进制。二进制作为桥梁进行进制转换。

p26: 字节顺序是网络编程的基础,记住小端是“高对高、低对低”,大端与之相反就可以了。

首先要明确:一个w位整数,位表示为[Xw-1,Xw-2,……,X0]那么Xw-1就是最高有效位,X0是最低有效位。其次,高对高、低对低,即小端法的低位地址对应低有效字节,大端法低位地址对应高有效字节。

p28: 代码执行一下

p32: 能区分逻辑运算(结果是1或0)和位运算(结果是位向量),所有逻辑运算都可以用与、或、非表达(最大式、最小式),而与或非可以用“与非”或“或非”表达,所以,只要一个与非门,就可以完成所有的逻辑运算。

逻辑运算:所有的非零参数都是TRUE,参数0是FALSE。

位运算:真为1,假为0.

p38: 掩码是位运算的重要应用,对特定位可以置一,可以清零

掩码是一个位模式,表示从一个字中选出的位的集合。通过位级运算可以清零或置一。

p39: 补码的利用寄存器的长度是固定的特性简化数学运算。想想钟表,12-1 等价于 12 + 11,利用补码可以把数学运算统一成加法,只要一个加法器就可以实现所有的数学运算。

  • 将字的最高有效位解释为负权,最高有效位为符号位
  • 补码编码具有唯一性
  • 补码的范围不对称:|TMin|=|TMax|+1

p44: 注意C语言中有符号数和无符号数的转换规则,位向量不变。想想第一章说的 信息就是“位+上下文”

  • 处理同样字长有符号数和无符号数之间的互相转换的一般规则是:数据可能会变,但是位模式不变。

  • 在C语言中,显示的强制转换,隐式转换(一种类型的表达式被赋给另一种类型的表达式)
    -注意:要创建一个无符号常量,必须加上后缀字符 U 或 u 。

  • 补充:补码的运算法则:

[X+Y]补 = [X]补 + [Y]补;

[X-Y]补 = [X]补 - [Y]补 = [X]补 + [-Y]补

p54: 0扩展和符号扩展

  • 零扩展:在无符号数的开头添0。

  • 符号扩展:在补码数字的表示中添加最高有效位值

  • 当把注意:short转换成usigned时,首先转换大小,再完成从有符号数到无符号数的转换。

**p54: 如何让整数运算溢出?如何避免? **

有符号数到无符号数的隐式强制类型转化容易导致这种错误,并且很难发现。正如例子,同样的数据,一个地方是有符号数,一个地方是无符号数,数据的不匹配导致安全漏洞。

p67: 关于整数运算的最后思考

整数运算实际是一种模运算形式。表示数字的有限字长限制了可能的取值范围,结果可能溢出。补码表示提供了一种既能表示正数也能表示负数的灵活方法,同时使用了与执行无符号算术相同的位级实现。

p83: 浮点数运算的不精确性与舍入

  • IEEE浮点标准用V=(-1)^s* M *2^E的形式表示一个数。

  • 因为表示方法限制了浮点数的范围和精度,所以只能近似的表示实数运算,因此用舍入的办法,找到最匹配的值。

  • 向偶数舍入方式:将数字向上或者向下舍入,即最后结果是偶数

  • 向零舍入方式:把正数向下舍入,把负数向上舍入,即结果更靠近0

    向下舍入方式:把正数负数都向下舍入,结果更小

    向上舍入方式:把正数负数都向上舍入,结果更大

p78: IEEE浮点标准,float/double类型

单精度浮点格式,s、exp、frac字段分别为1位、k=8、n=23,32位表示

双精度浮点格式,s、exp、frac字段分别为1位、k=11、n=52,64位表示

p86: 整数与浮点数转换规则

int转换成float:数字不会溢出,但是可能被舍入。

int/float转换成double:能保留精确数值。

double转换成float:值可能被溢出,由于精确度较小,还可能被舍入。

float/double转换成int:值将会向零舍入。

p80:家庭作业可以选做,协调好每题最多两人一组做,一星题目一人加一分,二星加二分,三星加三分,四星加四分

题目:**2.59编写一个C表达式,他可以生成一个字,由x的最低有效字节和y中剩下的字节组成。

首先,解决第一个问题(最低有效字节如何截取):

通过位级运算中的掩码运算:掩码0xFF表示一个字的最低字节,那么位级运算x&0xFF得到x的最低有效字节得到的值,其他字节被置0;
同理,y剩余的字节也用同样的方式截取。

其次,如何编写代码:

代码的思路相对简单一点,如下:

声明三个变量x,y,z;

输入要被截取的字x,y;

通过掩码和字的与运算,得到最低有效字节以及剩余字节;

通过或运算,合并字节z,得到结果。

运行结果如下:

教材学习中的问题和解决过程

  • 问题一:对于“只要一个与非门,就可以完成所有的逻辑运算”,看完之后觉得很熟悉,但是想不起啦要怎么组合才能实现所有基本运算。

  • 解决:自己推导和上网百度已解决,如下图:

  • 问题二:对于“整数与浮点数表示同一个数字的关系”,没太明白是什么意思?

  • 解决:未解决,希望老师上课能明确讲一下。目前只理解到一个数若为整数,那它一定可以用浮点数来表示。

代码调试中的问题和解决过程

  • 问题1
    在使用命令 gcc -m32 main.c 时,出现如下错误,无法识别;但是 gcc -m64 main.c 正确,相当于gcc main.c 。

  • 问题2
    在运行书上关于符号扩展的代码时,要注意自行把代码补全 ,一定要加main函数,否则编译出错。运行成功结果如下:

    发现符号扩展的十六进制数和书上的顺序恰好相反,这说明我使用的系统用的是小端模式!

代码托管

(statistics.sh脚本的运行结果截图)

其他(感悟、思考等,可选)

感觉这一周课本知识还是很多的,跟着老师给的指导一点点看书,感觉比自己盲目看更有效果,感觉自己是有重点的在看。但由于老师的指导是第二版的教材和现在的第三版的课本页码上有些出入,导致看的时候有的地方云里雾里,打算找学长学姐借一本书,这样应该会更方便一点~

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 20/20 1/2 10/15 第一章
第三周 20/20 1/2 21/36 第二章

尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

参考:软件工程软件的估计为什么这么难软件工程 估计方法

参考资料

原文地址:https://www.cnblogs.com/0831j/p/7674568.html