逆向02:通用寄存器与内存读写

32位通用寄存器的指定用途

寄存器 主要用途 编号 存储数据范围
EAX 累加器 0 0 - 0xFFFFFFFF
ECX 计数 1 0 - 0xFFFFFFFF
EDX I/O指针 2 0 - 0xFFFFFFFF
EBX DS段的数据指针 3 0 - 0xFFFFFFFF
ESP 堆栈指针 4 0 - 0xFFFFFFFF
EBP SS段的数据指针 5 0 - 0xFFFFFFFF
ESI 字符串操作的源指针:SS段的数据指针 6 0 - 0xFFFFFFFF
EDI 字符串操作的目标指针:SS段的数据指针 7 0 - 0xFFFFFFFF

主要用途中的描述仅为厂商建议、供开发者参考。

基本指令格式

1
2
3
4
<操作码>  目标操作数, 源操作数
<COMMAND>       DST, SRC
Example:
mov eax, 0xFFFFFFFF

在32位寄存器中,当指令的SRC超出数据宽度后,最高位会被丢弃。如 0x012345678会写入0x12345678

通用寄存器命名

REG NAME
AX Accumulator Register
CX Counter Register
DX Data Register
BX Base Register
SP Stack Pointer
BP Base Pointer
SI Source Index
DI Destination Index

通用寄存器的结构

32 16 8 编号(二进制) 编号(十进制)
EAX AX AL 000 0
ECX CX CL 001 1
EDX DX DL 010 2
EBX BX BL 011 3
ESP SP AH 100 4
EBP BP CH 101 5
ESI SI DH 110 6
EDI DI BH 111 7

其中,以EAX为例,0~7位为AL,0~15位为AH,0~15位为AX,0~31位为EAX,以此类推。

POC:

1
2
3
4
MOV EAX, 0xAAAAAAAA
MOV  AX, 0xBBBB
MOV  AH, 0xCC
MOV  AL, 0xDD

分步运行可得:

1
2
3
4
EAX AAAAAAAA
EAX AAAABBBB
EAX AAAACCBB
EAX AAAACCDD

MOV指令的语法

1
2
3
4
5
6
7
8
9
MOV r/m8,  r8 
MOV r/m16, r16
MOV r/m32, r32
MOV r8,    r/m8
MOV r16,   r/m16
MOV r32,   r/m32
MOV r8,    imm8
MOV r16,   imm16
MOV r32,   imm32

对应关系:

LETTERS MEANING
r 通用寄存器
m 内存
imm 立即数
r8 8位通用寄存器
m8 8位内存
imm8 8位立即数

常用指令

  • MOV
  • ADD
  • SUB
  • AND
  • OR
  • XOR
  • NOT

内存读写

寄存器与内存的区别

  1. 寄存器位于CPU内部,执行速度块,但成本较高
  2. 内存速度相对较慢,但成本较低,因此容量会比寄存器大
  3. 寄存器与内存没有本质区别,都是用于存储数据的容器,都是定宽的
  4. 常用的寄存器有8个(通用寄存器的结构中列举的8个)
  5. 内存的数量特别多,因此无法给每个内存单位命名,故使用编号代替,内存的每个字节(BYTE)会有一个编号。CPU的位数指的是CPU的寻址宽度。

内存的基本概念

内存中的编号是以字节位单位的,每一个编号对应一个字节的宽度,可以存储8个0/1。

32位的计算机可以识别FFFFFFFF+1个内存地址,每个地址1BYTE,即4GB,所以32位的计算机最大可识别4GB的内存。

但是部分系统可以通过软件手段扩增寻址范围。

内存格式

  1. 每个内存单元的宽度为8(0~7)
  2. [编号](如[0x12345678])称为内存地址
  3. 地址的作用是确定操作的内存位置

内存格式

内存的读写

内存的写入

与寄存器不同,在寄存器中写入多余的数据会被丢弃,内存是连续的,因此涉及内存读写一定要指定内存的宽度。

1
2
3
MOV BYTE PTR DS:[0x12345678], 0xFFFF
MOV WORD PTR DS:[0x12345678], 0xFFFF
MOV DWORD PTR DS:[0x12345678], 0xFFFF

在内存中,部分地址是可以访问的,部分地址是不能访问的。操作不能访问的地址可能会掉入异常。

可以通过ESP的位置确定可以操作内存的地址。

内存的读取

例:

读取内存地址到EAX

1
MOV EAX, DOWRD PTR DS:[0x12FFD0]

Built with Hugo
主题 StackJimmy 设计