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 |