20155212 2017-2018-1 《信息安全系统设计》第5周学习总结

20155212 2017-2018-1 《信息安全系统设计》第5周学习总结

教材学习内容总结

Chapter 3

  • 学习机器代码的好处
    • 能够理解编译器的优化能力,并分析代码中隐含的低效率
    • 高级语言提供的抽象层会隐藏我们想要了解的程序的运行时行为。
    • 了解关于系统程序中的漏洞重写信息被利用而产生的攻击出现原因,以及如何防御,均需要具备程序机器级表示的知识。
  • 摩尔定律:芯片上的晶体官数量每年都会翻一番。对计算机技术的其他方面,也有类似的呈指数增长的情况出现。
  • 编译c代码时,-Og告诉编译器使用会生成符合原始C代码整体结构的代码的优化等级。
  • 使用较高级别优化产生的代码会严重变形,甚至难以理解。实际上,从得到的程序的性能考虑,较高级别的优化(e.g.-O1-O2)被认为是较好的选择。
  • 机器代码:
    • 目标代码
    • 可执行代码
  • 计算机系统使用了多种不同形式的抽象,利用更简单的抽象模型来隐藏实现的细节。
  • 机器级编程的两种重要抽象:
    • 指令集体系结构或指令集架构(ISA)定义机器级程序的格式和行为。它定义了处理器状态、指令的格式,以及每条指令对状态的影响。
      • 指令集并不存储于CPU中,应该这样说:CPU本身是指令集(结构)的一个实现/实例
      • 一个ISA可能包含多个指令集
    • 机器级程序使用的内存地址是虚拟地址,提供的内存模型看上去是一个非常大的字节数组。
  • 机器代码中通常对C语言程序员隐藏的处理器状态:
    • 程序计数器(PC)给出将要执行的下一条指令在内存中的地址。
    • 整数寄存器文件包含16个命名位置。
    • 条件码寄存器保存着最近执行的算术或逻辑指令的状态信息。
    • 一组向量寄存器可以存放一个或多个整数或浮点数值。
  • 机器级代码只是简单地将内存看成一个很大的、按字节寻址的数组。
    • C语言中的聚合数据类型:一组连续的字节表示
    • 标量数据类型:不区分有无符号整数、各种类型的指针、指针和整数。
  • 程序内存包含:
    • 程序的可执行机器代码
    • 操作系统需要的一些信息
    • 管理过程调用和返回的运行时栈
    • 用户分配的内存块
  • 在任意给定的时刻,只有有限的一部分虚拟地址被认为是合法的。
  • Linux系统中objdump -d xxx.o反汇编
  • 所有以"."开头的行都是指导汇编器和链接器工作的伪指令
  • 访问机器的低级特性方法:
    • 用汇编编写整个函数,链接时同C的函数链接起来
    • 利用GCC支持,直接在C程序中嵌入汇编代码
  • 数据传送指令有四个变种:movb传送字节、movw传送字、movl传送双字、movq传送四字。
  • 汇编代码也使用后缀'l'来表示4字节整数和8字节双精度浮点数。二者之所以不矛盾使用为使用的是一组完全不同的指令和寄存器。
  • 指令可以对16个寄存器的低位字节中存放的不同大小的数据进行操作
  • 操作数:立即数、寄存器、内存引用。
  • 数据传送指令:MOV类。
  • 源操作数指定一个立即数,目的操作数指定一个位置。
  • cltq指令只作用于寄存器%eax和%rax
  • 局部变量通常是保存在寄存中,而不是内存中。访问寄存器比访问内存要快得多。
  • 当强制类型转换既涉及大小有涉及C语言中的符号变化时,操作应该先改变大小。
  • 栈指针%rsp保存着栈顶元素的地址。
  • 压栈:先移动指针,再存储数据。出栈:先读数据,再上移指针。
  • 栈和程序代码以及其他形式的程序数据都是放在统一内存中,所以程序可以用标准的内存寻址方法访问栈内的任意位置。
  • ADD:addbwlq
  • leap:将有效地址写入到目的操作数。目的操作数必须是一个寄存器。该指令能执行加法和有限形式的乘法。
  • 一元操作:只有一个操作数,既是源又是目的
  • 二元操作:第二个操作数既是源又是目的。。第一个操作数可以是立即数、寄存器或是内存位置。第二个操作数可以是寄存器或是内存位置。
  • 移位操作:先给出移位量(立即数或单字节寄存器%cl中),然后给出的是要移位的数。目的操作数可以是一个寄存器或是一个内存位置。
    • 左移指令:SAL和SHL,左移右补零
    • 右移指令:SAR算术移位(补上符号位),SHR逻辑移位(补0)
  • 条件码

条件码 | 含义
---|---
CF | 进位标志
ZF | 零标志
SF | 符号标志
OF | 溢出标志

  • leaq命令不改变任何条件码
  • 逻辑操作,进位标志和溢出标志会设置成0。
  • 移位操作,进位标志将设置为最后一个被移出的位,溢出标志设置为0。
  • INC和DEC指令会设置溢出和零标志,但是不会改变进位标志。
  • CMP和TEST两类指令只设置条件码而不改变任何其他寄存器。
  • 条件码常见的使用方法:
    • 根据条件码的某种组合,将一个字节设置为0或者1(SET指令,后缀表示不同的条件而不是操作数大小)
    • 可以条件跳转到程序的某个其他的部分
    • 可以有条件地传送数据
  • cmpq b, a:a:b
  • 除了jmp是无条件跳转,其他跳转指令都是有条件的。
  • 跳转指令最常用的编码是PC相对的。将目标指令的地址与紧跟在跳转指令后面那条指令的地址之间的差作为编码。
  • 实现条件操作
    • 使用控制的条件
    • 使用数据的条件
  • 调用、执行、返回需要用到的机制
    • 传递控制
    • 传递数据
    • 分配和释放内存
  • 使用栈数据结构提供的后进先出的内存管理原则
  • 局部数据存储在本地数据:
    • 寄存器不足够存放所有的本地数据
    • 对一个局部变量使用地址运算符
    • 某些局部变量是数组或结构
  • 寄存器是唯一被所有过程共享的资源。
  • %rbx、%rbp和%r12~%r15被划分为被调用者保存寄存器。
  • 除了栈指针%rsp,都被分类为调用者保存寄存器。
  • 缓冲区溢出
    • 存储的返回地址的值被破坏,ret指令会导致程序跳转到一个完全意想不到的位置
    • 让程序执行它本来不愿意执行的函数。(攻击代码)
      -对抗缓冲区溢出攻击
    • 栈随机化
    • 栈破坏检测
    • 限制可执行代码区域

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

  • 目标代码和可执行代码的区别是什么?
    • 目标代码包含所有指令的二进制表示,但是还没有填入全局值的地址。而可执行代码是处理器执行的代码格式。
  • 什么是ISA?
    • 一个处理器支持的指令和指令的字节级编码就是这个处理器的ISA,包括很多个部分:
      • 指令集
      • 指令集编码
      • 基本数据类型
      • 一组编程规范
      • 寄存器
      • 寻址模式
      • 存储体系
      • 异常事件处理
      • 中断
      • 外部I/O
        不同的处理器家族,例如Intel IA32、IBM/Freescale PowerPC和ARM,都有不同的ISA。
  • movqmovsq有什么区别?
    • movabsq是新增的指令,用来将一个64位的值直接存到一个64位寄存器中。movq不能直接传送64bit,而是间接完成的。
  • 使用控制的条件操作和使用数据的条件操作哪个性能更好?
    • 处理器通过流水线来获得高性能,流水线是重叠连续指令的步骤。处理器采用非常精密的分支预测逻辑来猜测每条跳转指令是否执行。错误预测会招致很严重的惩罚,导致程序性能严重下降。控制流不依赖数据,使得处理器容易保持流水线是满的。根据现代处理器的运行方式来看,条件数据传送性能更好。

代码托管

其他

学习进度条

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

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

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

  • 计划学习时间:20小时

  • 实际学习时间:21小时

(有空多看看现代软件工程 课件
软件工程师能力自我评价表
)

参考资料

原文地址:https://www.cnblogs.com/dky20155212/p/7712664.html