20144303 《信息安全系统设计基础》第五周学习总结

20144303 《信息安全系统设计基础》第五周学习总结

教材学习内容总结

寻址方式经历:

  • DOS时代的平坦模式,不区分用户空间和内核空间,很不安全。
  • 8060的分段模式
  • IA32的带保护模式的平坦模式

代码编译:

  • 编译产生汇编代码:gcc –s xxx.c 得到.s文件
  • 编译产生目标代码文件:gcc -o1 xxx.c 得到.o文件

  • 反汇编命令:objdump –d xxx

  • 直接编译64位处理器得到32代码的命令:gcc –m32 -S xxx.c

二进制文件可以用od 命令查看,也可以用gdb的x命令查看。

有些输出内容过多,我们可以使用 more或less命令结合管道查看,也可以使用输出重定向来查看
od code.o | more
od code.o > code.txt

操作数的三种类型

  • 立即数:常数值,表示为$c标准表示的整数
  • 寄存器:表示某个寄存器的内容
  • 存储器:根据计算出来的地址访问某个存储器位置

栈的特点

  • 遵循“后进先出”的原则
  • push压栈,pop出栈
  • 栈顶:总是从这端插入和删除元素
  • 栈顶元素的地址是最低的
  • 栈指针%esp保存着栈顶元素的地址

四组操作

  • 加载有效地址:将有效地址写入目的操作数,目的操作数必须是寄存器
  • 一元操作:只有一个操作数,既是源又是目的
  • 二元操作:源操作数是第一个,可以是立即数、寄存器、存储器,目的操作数是第二个,可以是寄存器、存储器,但两个不能同时为存储器
  • 移位:第一个是移位量,用单个字节编码且只允许0-31位的移位,可以是立即数或者放在单字节寄存器%cl中(算术右移SAR,填上符号位/逻辑右移SHR,填上0)目的操作数可以是一个寄存器或存储器

条件码

  • CF:进位标志
  • ZF:零标志
  • SF:符号标志
  • OF:溢出标志

jump指令

  • 直接跳转:后面跟标号作为跳转目标
  • 间接跳转:*后面跟一个操作数指示符

call指令

  • call指令有一个目标,即指明被调用过程起始的指令地址。
  • call指令的效果是将返回地址入栈。并跳转到被调用过程的起始处。

ret指令

  • ret指从栈中弹出地址,并跳转到这个位置。
  • ret指令返回到call指令后的那条指令。

gdb

使用流程

  • 进入GDB  #gdb test
  • test是要调试的程序,由gcc test.c -g -o test生成。进入后提示符变为(gdb)
  • 查看源码  (gdb) l
  • 设置断点  (gdb) b 6
  • 这样会在运行到源码第6行时停止,可以查看变量的值、堆栈情况等;这个行号是gdb的行号。
  • 查看断点处情况  (gdb) info b
  • 可以键入"info b"来查看断点处情况,可以设置多个断点;
  • 运行代码  (gdb) r
  • 显示变量值  (gdb) p n
  • 在程序暂停时,键入"p 变量名"(print)即可;
  • 在程序暂停时,键入"p 变量名"(print)即可;
  • 单步运行  (gdb) n
  • 程序继续运行  (gdb) c
  • 退出GDB  (gdb) q

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

这周学习教材内容时,遇到了一些比较难以区分的指令和定义,在此加以比较。

Mov movs movz的区别:

将源操作数的值复制到目的操作数中时(不涉及数据大小的转换),用mov

将一个较小的源数据复制到一个较大的数据位置时,用movs或者movz:

当数据是有符号数的时候,用movs

当数据是无符号数的时候,用movz

Leal mov指令:

mov是将数据从源操作传到目的操作数中

lea是将源操作数的地址传到目的操作数中

一个是数据,一个是地址

比如:D1 dw 0x0000

汇编以后可能变成:

地址 值

0x9000 00

0x9001 00

那么lea SI,D1,SI的值是0x9000而不是0000,要用mov就是0000了

算数右移和逻辑右移 (SAR K,D SHR K,D):

逻辑右移:左边统一加0

算术右移:左边加原数符号位上的数:

eg:1010101010,其中[]位是添加的数字

逻辑右移一位:[0]101010101

算数右移一位:[1]101010101

(此外,逻辑左移=算术左移,右边都加0)

CMP 和SUB

sub S,D 是D-S结果送回D中,即目的操作数中

而cmp S,D也是相减但结果不送回目的操作数中,一般用作比较数大小时用

本周代码托管截图

链接:https://git.oschina.net/20144303sys/work

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

本周主要学习的是第三章的内容,与之前学的汇编语言有很大的联系。这章有很多类似的定义和指令,看起来内容很多,十分的复杂,但我发现把相似的知识拿来比较,总结他们的相同的和不同点以及各自的用法,可以更快的理解掌握,这样的学习方法可以提高学习效率,以后要多运用。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 0/0 1/1 20/20
第二周 300/300 1/2 20/40
第三周 300/600 1/3 20/60
第五周 200/800 1/4 20/80

参考资料

posted @ 2016-10-16 23:05  20144303石宇森  阅读(179)  评论(2编辑  收藏  举报