其他分享
首页 > 其他分享> > 滴水逆向(二)

滴水逆向(二)

作者:互联网

汇编语言

通用寄存器

32位通用寄存器的指定用途如下:

寄存器主要用途编号存储数据的范围
EAX累加器00 - 0xFFFFFFFF
ECX计数10 - 0xFFFFFFFF
EDXI/O指针20 - 0xFFFFFFFF
EBXDS段的数据指针30 - 0xFFFFFFFF
ESP堆栈指针40 - 0xFFFFFFFF
EBPSS段的数据指针50 - 0xFFFFFFFF
ESI字符串操作的源指针;SS段的数据指针60 - 0xFFFFFFFF
EDI字符串操作的目标指针;ES段的数据指针70 - 0xFFFFFFFF
寄存器编号(二进制)编号(十进制)
32位16位8位
EAXAXAL0000
ECXCXCL0011
EDXDXDL0102
EBXBXBL0113
ESPSPAH1004
EBPBPCH1015
ESISIDH1106
EDIDIBH1117

在这里插入图片描述

MOV指令

MOV指令
MOV EXA,0AAAAAAAA
MOV AX,0BBBB
MOV AH,0CC
MOV AL,0DD
在这里插入图片描述
这是经过输入MOV指令的内容,接下来按F8一直运行看一看,我把初始的EAX存了AAAAAAAA
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这就能够体现EAX,AX,AH,AL的关系,其他的关系同理
在这里插入图片描述

  MOV的语法
  1.MOV  r/m8,r/m8                     r 通用寄存器
  2.MOV  r/m16,r/m16                 m 代表内存
  3.MOV  r/m32,r/m32                 r8 代表8位通用寄存器
  4.MOV  r8/,r/m8                        m8 代表8位内存
  5.MOV  r16,r/m16                     imm 代表立即数
  6.MOV  r32,r/m32                     imm8 代表8位立即数
  7.MOV  r8,imm8
  8.MOV  r16,imm16
  9.MOV  r32,imm32

MOV 目标操作数,源操作数
作用:拷贝源操作数到目标操作数
1.源操作数可以是立即数、通用寄存器、段寄存器或者内存单元
2.目标操作数可以是通用寄存器、段寄存器或者内存单元
3.操作数的宽度必须一样
4.源操作数和目标操作数不能同时为内存单元

ADD指令

ADD指令相当于加法运算
当我输入MOV EAX,1 时这时候寄存器内为EAX 00000001
下一行我输入ADD EAX,2 时寄存器内变成EAX 00000003
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

ADD指令语法:
ADD AL,imm8
ADD AX,imm16
ADD EAX,imm32
ADD r/m8,imm8
ADD r/m16,imm16
ADD r/m32,imm32
ADD r/m16,imm8
ADD r/m32,imm16
ADD r/m8,r8
ADD r/m16,r16
ADD r/m32,r32
ADD r8,r/m8
ADD r16,r/m16
ADD r32,r/m32

SUB指令

SUB指令相当于减法
在上ADD指令后再加上SUB EAX,2 寄存器内就变成了EAX 00000001
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
SUB指令跟ADD指令格式一样就把ADD换成SUB其他的都不变,为了简便在这里就不写了。

AND,OR,XOR,NOT指令

AND的指令就是与运算,相同位的两个数字都为1,则为1;若有一个不为1,则为0。
举个例子: 2 and 3 (下面的都是二进制数)
0010
0011
——
0010
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
运行过后结果还是00000002,是因为2and3就是2所以显示的就是00000002
OR,XOR,NOT指令和AND指令运算不同,AND,OR,XOR的指令语法都和ADD相同,NOT指令语法不一样

NOT指令语法:
NOT r/m8
NOT r/m16
NOT r/m32

内存

寄存器与内存

寄存器与内存的区别:
1.寄存器位于CPU内部,执行速度快,但比较贵
2.内存速度相对较慢,但成本较低,所以可以做的很大
3.寄存器和内存没有本质的区别,都是用于存储数据的容器,都是定宽的
4.寄存器常用的有8个,EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI
5.计算机中的几个常用计量单位,BYTE,WORD,DWORD
BYTE 字节 = 8(BIT)
WORD 字 = 16(BIT)
DWORD 双字 = 32(BIT)
1KB = 1024 BYTE
1MB = 1024KB
1GB = 1024MB
6.内存的数量特别庞大,无法每个内存单元都起一个名字,所以用编号来代替,我们称计算机CPU是32位后者是64位,有很多书上说之所以叫32位计算机是因为寄存器的宽度是32位,是不准确的,因为还有很多寄存器是大于32位的,32位计算机是指寻址编位32位。
计算机内存的每一个字节会有一个编号(即内存编号的单位是字节)(下图为16进制)
0x00000000
0x00000001
0x00000002
······
······
0xFFFFFFFF
32位计算机的编号最大是32位,也就是32个1,换成16进制为FFFFFFFF,也就是说32位计算机内存寻址的最大范围是0~FFFFFFFF内存的单位是字节,那内存中能存储的信息最多为FFFFFFFF+1字节,即4G
7.只要是32位的计算机,最多识别的内存不一定是4G,内存是可以物理扩展的

内存

1.内存格式

在这里插入图片描述
计算机中为了区别立即数和内存编号一般加中括号为内存编号即[0x12345678]为内存编号而0x87654321为立即数
2.从指定内存中写入/读取数据
mov dword ptr ds:[0x0812FF34],0x12345678
mov eax,dword ptr ds:[0x0012FF34]
dword(32位):要读/写多少 此时是4字节 byte == 1字节 word == 2字节
ptr:Point代表后面是一个指针(指针的意思就是里面存的不是普通的值,而是个地址)
ds:段寄存器
0x0012FF34:内存编号,必须是32位的,前面0可以省略
注意:地址编号不要随便写,因为内存是有保护的,并不是所有的内存都可以直接读写(需要特别处理)
建议地址编号写成esp
写入数据:
在这里插入图片描述
这是原本[0x0019FF74]编号地址对应的值为763AFA29,接下来用mov dword ptr ps:[0x0019FF74],0x12345678改一下
在这里插入图片描述
在这里插入图片描述
这时0x0019FF74里面对应的值变为12345678
读取数据:
把地址0x0019FF7C内容读取到EAX中,EAX的值为0019FFCC
在这里插入图片描述
在这里插入图片描述
写入指令:mov eax,dword ptr ds;[0x19FF7C](0可以省略)
在这里插入图片描述
在这里插入图片描述
运行后EAX对应的值就变成0x0019FF7C里面的值
3.寻址
寻址公式一:[立即数]

读取内存的值:
MOV EAX,DWORD PTR DS:[0x13FFC4]
MOV EAX,DWORD PTR DS:[0x13FFC8]
向内存中写入数据:
MOV DWORD PTR DS:[0x13FFC4],EAX
MOV DWORD PTR DS:[0x13FFC8],EAX
获取内存编号:
LEA EAX,DWORD PTR DS:[0x13FFC4]
LEA EAX,DWORD PTR DS:[ESP+8]

在这里插入图片描述
这是原始的EAX和ESP的值,运用上面两个公式
在这里插入图片描述
第一个获得了内存编号
在这里插入图片描述
ESP原本值是0019FF74再加上8就是0019FF7C

寻址公式二:[reg] reg代表寄存器,可以是8个通用寄存器的任意一个

读取内存的值:
MOV ECX,0x13FFD0
MOV EAX,DWORD PTR DS:[ECX]
向内存中写入数据:
MOV EDX,0x13FFD8
MOV DWORD PTR DS:[EDX],0x87654321
获取内存编号:
LEA EAX,DWORD PTR DS:[EDX]
MOV EAX,DWORD PTR DS:[EDX]

寻址公式三:[reg+立即数]

读取内存的值:
MOV ECX,0x13FFD0
MOV EAX,DWORD PTR DS:[BCX+4]
向内存中写入数据:
MOV EDX,0x13FFD0
MOV DWORD PTR DS:[EDX+0xC],0x87654321
获取内存编号:
LEA EAX,DWORD PTR DS:[EDX+4]
MOV EAX,DWORD PTR DS:[EDX+4]

寻址公式四:[reg+reg*{1,2,4,8}]

读取内存的值:
MOV EAX,13FFC4
MOV ECX,2
MOV EDX,DWORD PTR DS:[EAX+ECX*4]
向内存中写入数据:
MOV EAX,13FFC4
MOV ECX,2
MOV DWORD PTR DS:[EAX+ECX*4],87654321
获取内存编号:
LEA EAX,DWORD PTR DS:[EAX+ECX*4]

寻址公式五:[reg+reg*{1,2,4,8}+立即数]

读取内存:
MOV EAX,13FFC4
MOV ECX,2
MOV EDX,DWOED PTR DS:[EAX+ECX*4+4]
向内存中写入数据:
MOV EAX,13FFC4
MOV ECX,2
MOV DWOED PTR DS:[EAX+ECX*4+4],87654321
获取内存编号:
LEA EAX,DWORD PTR DS:[EAX+ECX*4+2]

如果最后存入的数据溢出将取最大范围

标签:逆向,滴水,MOV,DS,EAX,ADD,内存,PTR
来源: https://blog.csdn.net/qq_51999322/article/details/117790591