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