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

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 掌握“进程”的概念,并学习应用相关函数;了解程序如何在机器上表示

返回目录


参考资料

posted @ 2017-10-22 21:54  0x14b7狄  阅读(426)  评论(1编辑  收藏  举报