2017-2018-1 20155303 《信息安全系统设计基础》第五周学习总结
本周学习内容:①第八章 异常控制流(总结博客:进程与fork()、wait()、exec函数组);②第三章 程序的机器级表示
————————CONTENTS————————
教材知识点总结
- 具备程序机器级表示的知识是十分重要的。例如,程序遭受攻击(使得恶意软件侵扰系统)的许多方式中,都涉及程序存储运行时控制信息的方式的细节。许多攻击利用了程序系统中的漏洞重写信息,从而获得了系统的控制权。
- ISA(指令集体系结构)定义了处理器状态指令的格式,以及每条指令对状态的影响。
- 使用
gcc -Og -c mstore.c
命令编译并汇编代码,产生目标代码文件mstore.o。它是二进制格式的,所以无法直接查看。在Linux系统中,带“-d”命令行标志的程序OBJDUMP可以查看机器代码文件中的内容:
每一行都是一条指令,左边是十六进制字节值,右边是等价的汇编语言。
- 使用
gcc -Og -S mstore.c
生成文件mstore.s,查看其内容:
其中,所有以“.”开头的行都是指导汇编器和链接器工作的伪指令。分析时可以不予考虑。
- 一个x86-64的CPU包含一组16个存储64位的通用目的寄存器。这些寄存器用来存储整数数据和指针。下图展示了这16个寄存器:
- 不同的寻址模式如下图所示。其由四个部分组成:一个立即数偏移Imm,一个基址寄存器rb,一个变址寄存器ri,和一个比例因子s。s必须是1、2、4或8。
-
MOV类由四条指令组成:movb,movw,movl和movq。主要区别在于他们操作的数据大小不同,分别是1、2、4和8字节。
-
pushq指令的功能是把数据压入到栈上,而popq指令是弹出数据。这些指令都只有一个操作数——压入的数据源和弹出的数据目的。
教材学习中的问题和解决过程
- 『问题一』:
课本P113在编译代码时,使用了-Og选项:
gcc -Og -o prog p1.c p2.c
其中的-Og
是什么含义呢?
- 『问题一解决』:
-On(n=0,1,2,3,也可以是其它单词)是gcc为了一般人方便而做的设定,根据n值大小包含预设标准由低到高的一些优化选项,均为-fxxx(xxx为优化项),但注意,即使是最高优化选项-O3,也不是包含所有的-f选项,这只是为大多数人的使用方便而预设的。
Using the GNU Compiler Collection (GCC) 对于 -Og
选项的解释是:
Optimize debugging experience. -Og enables optimizations that do not interfere with debugging. It should be the optimization level of choice for the standard edit-compile-debug cycle, offering a reasonable level of optimization while maintaining fast compilation and a good debugging experience.
也就是说,-Og
标识会精心挑选部分与-g选项不冲突的优化选项,提供合理的优化水平,同时产生较好的可调试信息和较高的对语言标准的遵循程度。
- 『问题二』:
课本P129介绍了leaq作为加载有效地址指令,实际上是movq的变形。那么leaq与movq的用法有什么不同?
- 『问题二解决』:
课本中提到,leaq的指令形式是从内存读数据到寄存器,但实际上它根本就没有引用内存。它的第一个操作数看上去是一个内存引用,但该指令并不是从指定的位置读入数据,而是将有效地址写入到目的操作数。
由此看来:
LEA指令的功能是取偏移地址,例如LEA AX,[1000H],作用是将源操作数[1000H]的偏移地址1000H送至AX;
MOV指令的功能是传送数据,例如MOV AX,[1000H],作用是将1000H作为偏移地址,寻址找到内存单元,将该内存单元中的数据送至AX。
代码调试中的问题和解决过程
- 『问题一』:
以P116的程序为例,分析学习机器代码。
- 『问题一解决』:
使用objdump -d mstore.o
命令进行反汇编:
再使用objdump -d prog
命令反汇编prog文件(prog文件是由main.c和mstore.c文件生成)
可以看出,prog反汇编之后的代码序列包含mstore.o反汇编之后的代码序列。查看文件大小:
prog文件大小为8768字节,因为它不仅包含了两个过程的代码,还包含了用来启动和终止程序的代码,以及用来与操作系统交互的代码。
- 『问题二』:
注意这段汇编代码:xorq %rdx,%rdx
在产生这段汇编代码的C代码中,并没有出现EXCLUSIVE-OR操作。那么,①这条指令有什么效果呢?②还可以用什么其他更直观的指令替代它?③这两种不同的实现有什么区别呢?
- 『问题二解决』:
①这个指令用来将寄存器%rdx设置为0,其原理是:对于任意的x,x与其本身异或的值都为0。对应于C语言中的语句:x=0。
②还可以使用:movq $0,%rdx命令将其置0。
③汇编和反汇编这段代码,发现xorq版本只需要3个字节,而movq版本需要7个字节。
代码托管
上周错题及分析
1、Linux中,目标文件XXX.o中的代码和数据节是从地址0开始的。(√)
『解析』:课本P466提到:
编译器和汇编器生成从地址0开始的代码和数据节。
2、链接器的重要性在于可以支持(C)A.静态库 B.动态库 C.分离编译 D.调试
『解析』:课本P464提到:
链接器在软件开发中扮演着一个重要的角色,因为他们使得分离编译成为可能。
返回目录
结对及互评
- 我的搭档:20155213
- 本周结对学习内容:
本周进行了第一次实验,实验着重让我们进一步熟悉Linux开发环境的配置和使用,同时了解TFTP和NFS的作用,并使用NFS方式挂载文件系统,在Linux中编译程序,并将生成的可执行文件挂载到arm开发板上,从而完成程序在开发板上的运行。
我们小组在实验过程中遇到了很多问题,比如arm开发板、主机与虚拟机三者互ping无法连通;由于未配置/etc/exports而导致无法挂载等等。但是在小组成员慢慢摸索的过程中,问题逐一被解决,接下来的任务得以高效完成。
希望小组成员能够再接再厉,默契配合,同时互相积极学习对方在思考问题等方面的优点,取长补短,在合作的过程中实现win-win。
学习感悟和思考
- 本周的学习内容非常丰富:除了掌握老师上课传授的知识之外,还完成了本学期第一次实验,同时在课下拓展学习了关于“进程”和“系统调用”的相关知识,着重学习了fork()、wait()、exec函数组,并根据自己的理解编写了一个类似于shell的终端。最后学习了教材第三章的内容。
- 但非常遗憾的是,由于自身对时间把控不到位,再加上第三章学习任务比较重,截至目前我并没有完成第三章的全部学习内容,而只学到了第五节。在我看来,第三章是基础且重要的一章,这些知识将帮助我们理解常见的代码安全漏洞(例如缓冲区溢出),以及了解程序员、编译器和操作系统可以采取的减轻这些威胁的措施。对于信息安全专业的我们来说,更显得尤为重要。所以在接下来的一周我会继续补充学习第三章的内容,并在实践中巩固前五节的知识,以求对程序的机器级表示有全面深入而具体的理解。
- 这周将大部分的时间安排在了竞赛项目的收尾工作上,另外还利用课余时间与老师一起完成了一些辅助教学的任务。虽说投入了不少精力,但我觉得这是一件蛮有意义的事情,做中学,教中学,反而能更好更快地提升自我。之后我会合理分配时间,今日事今日毕,紧跟老师的节奏,尽力把自己该做的事情都做好。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 20篇 | 400小时 | |
第一周 | 50/50 | 1/1 | 8/8 | 了解计算机系统、静态链接与动态链接 |
第三周 | 451/501 | 2/3 | 27/35 | 深入学习计算机算术运算的特性 |
第四周 | 503 / 1004 | 1/4 | 20/55 | 掌握程序崩溃处理、Linux系统编程等知识,利用所学知识优化myod,并实现head和tail命令 |
第五周 | 315 / 1319 | 3/7 | 29/84 | 掌握“进程”的概念,并学习应用相关函数;了解程序如何在机器上表示 |