2018-2019-1 20175206《信息安全系统设计基础》第三周学习总结
学习目标
1.理解逆向的概念
2.掌握X86汇编基础,能够阅读(反)汇编代码
3.了解ISA(指令集体系结构)
4.理解函数调用栈帧的概念,并能用GDB进行调试
学习PPT和查阅相关资料后,第三章我总结如下:
两个抽象
-
指令集体系结构或指令集架构来定义机器级程序的格式和行为,他定义了处理器状态、指令的格式,以及每条指令对状态的影响。
-
机器级程序使用的内存地址,提供的内存模型看上去是一个非常大的字节数组。
ISA(指令集体系结构)定义了处理器状态指令的格式,以及每条指令对状态的影响
PC(程序计数器)指示将要执行的下一条指令在存储器中的地址
X86-64指令
- 指令长度:1到15个字节不等
- 指令格式:OPER[DEST[,SRC]];注释
生成汇编文件和反汇编
-
使用GCC编译器 输入
gcc -Og -S *.c即可生成对应的汇编文件 -
使用OBJDUMP 输入
objdump -d mstore.o即可生成对应文件(反汇编)
处理器的类型
| 处理器 |
|---|
| 程序计数器 |
| 整数寄存器 |
| 条纹寄存器 |
| 浮点寄存器 |
数据格式
- C语言数据类型对应x86-64中的表示
| C声明 | Intel数据类型 | 汇编代码后缀 | 大小(字节) |
|---|---|---|---|
| char | 字节 | b | 1 |
| short | 字 | w | 2 |
| int | 双字 | l | 4 |
| long | 四字 | q | 8 |
| char* | 四字 | q | 8 |
| float | 单精度 | s | 4 |
| double | 双精度 | l | 8 |
访问信息
通用目的寄存器:

操作数指示符
- 操作数指示符分为三类
立即数
寄存器
内存引用

数据传送指令和寻址方式
movb ——传送字节
movw——传送字
movl——传送双字
movs——符号位扩展
movz——零扩展
寻址方式分为立即数寻址方式、寄存器寻址方式和存储器寻址方式,其中还有更为详细的分类:
如直接寻址方式、基址变址寻址方式、寄存器间接寻址方式、相对基址变址寻址方式、寄存器相对寻址方式等。
算术和逻辑操作
一元和二元操作:
一元操作:
INC DEC NEG NOT (只有一个操作数,既是源又是目的,可以是一个寄存器,或者存储器位置)
二元操作:
ADD SUB IMUL XOR OR AND (第一个操作数可以是立即数,寄存器或者存储器位置;第二个操作数既是源又是目的。可以是寄存器或者存储器位置,但是不同时是储存器位置)
移位操作:
SAL SHL SAR SHR (源操作数即移位量是立即数或者放在单字节寄存器元素%cl中;目的操作数是一个寄存器或是一个存储器位置)
条件码
CF(进位标志) ZF(零标志) SF(符号标志) OF(溢出标志)
函数栈帧
push——把ebp压入栈中
movebp,esp:ebp=esp——
sub esp,xxx——在栈上分配XXX字节的临时空间
push xxx——如果有必要,保存名为XXX的寄存器
pop xxx——如有必要,恢复保存过的寄存器
movesp ,ebp——恢复esp同时回收局部变量空间
ret——从栈取得返回地址,并跳转到该位置。
指令:
call Label 过程调用
call *Operand过程调用
leave为返回准备栈
ret从过程调用中返回
参考文献:
教材《深入理解计算机系统》
程序的机器级表示PPT