二进制安全
Day 1
0x1 高级汇编语言
1.debug 命令
-r 查看、改变寄存器内容
-d 查看内存中的内容
-e 改变内存中的内容
-u 将内存中的机器指令翻译成汇编指令
-t 执行一条机器指令
-p 执行int指令
-g 运行到有断点处
2.汇编代码的编译过程
环境准备:
(1)文本编辑器(010 Editor)
(2)编译器masm
(3)链接器link
(4)调试器debug
|
|
3.寄存器的讲解
4个数据寄存器(EAX、EBX、ECX和EDX)
2个变址寄存器(ESI和EDI)
2个指针寄存器(ESP和EBP)
6个段寄存器(ES、CS、SS、DS、FS和GS)
1个指令指针寄存器(EIP)
1个标志寄存器(EFlags)
寄存器的分类:

(1)数据段寄存器
- 寄存器EAX称为基地址寄存器(Accumulator),用累加器进行的操作可能需要更少时间。累加器可用于乘、除、输入输出等操作,他们的使用频率很高。EAX还通常用于存储函数的返回值。
- 寄存器EBX称为基地址寄存器(Base Register)。它可作为存储器指针来使用。
- 寄存器ECX称为计数寄存器(Count Register)。在循环和字符串操作时,用它来控制循环次数;在位操作中,当移位多时,要用CL来指明移位的位数。
- 寄存器EDX称为数据段寄存器(Data Register)。在进行乘、除运算时,它可以作为默认的操作数参与运算,也可以用于存放I/O的端口地址。
(2)变址寄存器
32位的CPU中有2个32位通用寄存器ESI和EDI。其低16位对应先前CPU中的SI和DI,对低16位数据的存取,不影响高16位的数据。
ESI通常在内存操作指令中作为源地址的指针使用,而EDI通常在内存操作指令中作为目的指针使用。DE/ES通常是默认段寄存器或选择寄存器。
在很多字节串指令中,DS:ESI指向源串,而ES:EDI指向目标串。
(3)指针寄存器
寄存器ESP、ESP称为指针寄存器(Pointer Register),主要用于存放堆栈内存储单元的偏移量,用它们可以实现多种存储器操作数的寻址方式,为不同的地址形式访问存储单元提供方便。指针寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算数逻辑运算的操作数和运算结果。
他们主要用于访问堆栈内的存储单元,并规定EBP为基指针(Base Pointer)寄存器,通过它减去一定的偏移值,来访问栈中的元素;ESP为堆栈指针(Stack Pointer)寄存器,它始终指向栈顶。
(4)段寄存器
| 寄存器 | 用途 |
|---|---|
| CX | 计数器 |
| SI | 串操作中的源指针 |
| DI | 串操作中的目的指针 |
| BP | 存取堆栈的指针 |
| SP | 堆栈指针 |
(5)指令指针寄存器
32位CPU把指令指针扩展到32位,并记作EIP。指令指针EIP是存放下次将要执行的指令在代码段的偏移量。
4.指令系统讲解
(1)数据传送指令
|
|
(2)算数运算指令
|
|
(3)位运算指令
|
|
(4)程序流控制指令集
|
|
(5)条件转移指令
|
|
(6)字符串操作指令
|
|
持续更新中