20145321 《信息安全系统设计基础》第5周学习总结
20145321 《信息安全系统设计基础》第5周学习总结
教材内容总结
X86寻址的三个时代:
1、DOS时代的平坦模式,不区分用户空间和内核空间,很不安全;
2、8086的分段模式;
3、IA32的带保护模式的平坦模式。
程序编码
- 编译器产生汇编代码: gcc –s xxx.c 得到.s文件
编译产生目标代码文件:gcc -O1 xxx.c 得到.o文件
反汇编命令:objdump –d xxx
直接编译64位处理器得到32代码的命令:gcc –S –o xxx.s xxx.c -m32
- ISA:指令集结构ISA是机器级程序的格式和行为,定义了处理器状态、指令的格式,以及每条指令对状态的影响
- 二进制文件可以用od 命令查看,也可以用gdb的x命令查看。
- 有些输出内容过多,我们可以使用 more或less命令结合管道查看,也可以使用输出重定向来查看。
od code.o | more
od code.o > code.txt
gcc -S 产生的汇编中可以把 以”.“开始的语句都删除了再阅读
访问信息
- 操作数的三种类型:立即数、寄存器、存储器;
- MOV指令:将原操作数的值复制到目的操作数中(不能够从存储器传送到存储器)
- MOV相当于C语言的赋值”=“,注意ATT格式中的方向, 另外注意不能从内存地址直接MOV到另一个内存地址,要用寄存器中转一下。
-
栈:后进先出的原则
push压栈,pop出栈
栈顶:总是从这端插入和删除元素
栈顶元素的地址是最低的
栈指针%esp保存着栈顶元素的地址
算数和逻辑操作
- 四组操作:加载有效地址:将有效地址写入目的操作数,目的操作数必须是寄存器
一元操作:只有一个操作数,既是源又是目的
二元操作:源操作数是第一个,可以是立即数、寄存器、存储器,目的操作数是第二个,可以是寄存器、存储器,但两个不能同时为存储器
移位:第一个是移位量,用单个字节编码且只允许0-31位的移位,可以是立即数或者放在单字节寄存器%cl中(算术右移SAR,填上符号位/逻辑右移SHR)
目的操作数可以是一个寄存器或存储器
控制
1、cmp(根据操作数的差设置条件码)、test指令只改条件码不改寄存器。
2、set指令操作数大小为单字节,得32位结果要对高24位清零。
3、跳转指令编码方法:目标指令地址-跳转指令后面那条指令得地址=编码。
4、goto代码:就是把汇编代码按顺序用c语言写出来,碰到跳转指令用goto。
5、c语言中的所以循环结构先转化为do-whlie结构,再转化为汇编代码。
过程
1、call指令:call指令的效果是将返回地址入栈,并跳转到被调用过程的起始处。
2、ret指令:ret指从栈中弹出地址,并跳转到这个位置;ret指令返回到call指令后的那条指令。
3、leave指令:leave指令可以使栈做好返回的准备。
4、寄存器eax、edx、ecx为调用者保存寄存器,ebx、esi、edi为被调用者保存寄存器。
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
代码调试中的问题和解决过程
实验楼练习
vim编写代码
查看汇编文件
将含有代码中以"."开头的编译器指令删除
代码托管
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | |
---|---|---|---|
目标 | 3500行 | 30篇 | 300小时 |
第一周 | 50/50 | 1/2 | 10/10 |
第二周 | 120/170 | 1/3 | 20/30 |
第三周 | 130/300 | 1/4 | 20/50 |
第五周 | 130/430 | 2/6 | 25/75 |
posted on 2016-10-16 22:25 20145321曾子誉 阅读(144) 评论(2) 编辑 收藏 举报