滴水逆向之4月17日日记
- CPU是如何计算2+3的?(涉及内容:逻辑运算、移位、数据宽度)
2+3=5
X:0010 R:0001
Y:0011
0010
Xor 0011
0001
0010
& 0011
0010
左移:0010<<1==0100
X:0001
Y:0100 R:0101
0001 0001
Xor 0100 & 0100
0101 0000
左移:0000<<1==0000
当最终结果为0000时,结果为第二次计算出的R,即此题答案为0101十进制数为5
- 如果想获取某个值的第N位的值是多少?
想获取第几位,就将第几位用1来表示,其余位用0表示
如:8F 获取第四位的值
10001111
And 00001000
00001000
即可得出第四位的值为1
- 最简单的加密算法:
要加密的数据:2015
密钥:54
加密后的结果:7441
因数据是四位,密钥为两位,即可将数据分为两位一组进行加密
00100000 (代表20) 00010101 (代表15)
^ 01010100 (代表54) ^ 01010100 (代表54)
01110100 (74) 01010001 (41)
解密后的结果:2015
01110100 (74) 01010001(41)
^ 01010100 (54) ^ 01010100(54)
00100000(20) 00000101 (15)
- 通用寄存器
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 | 字符串操作的目标指针:ES段的数据指针 | 7 | 0-0xFFFFFFFF |
1>. 通用寄存器
通用寄存器
寄存器 | 编号(二进制) | 编号(十进制) | ||
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 |
MOV 第一个数 第二个数
MOV:操作码 第一个数:目标操作数 第二个数:源操作数
MOV:将源操作数存放到目标操作数中
要求:目标操作数与源操作数的数据宽度相同
MOV的语法:(重要的汇编指令)
- MOV r/m8,r8 r:通用寄存器
- MOV r/m16,r16 m:代表内存
- MOV r/m32,r32 imm:代表立即数
- MOV r8,r/m8 r8:代表8位通用寄存器
- MOV r16,r/m16 m8:代表8位内存
- MOV r32,r/m32 imm8:代表8位立即数
- MOV r8,imm8
2>.MOV 目标操作数,源操作数
作用:拷贝源操作数到目标操作数
- 源操作数可以是立即数、通用寄存器、段寄存器、或者内存单元。
- 目标操作数可以是通用寄存器、段寄存器或者时内存单元。
- 操作数的宽度必须一致。
- 源操作数的目标操作数不能同时为内存单元。*
- .ADD指令
- ADD AL,imm8
- ADD AX,imm16
- ADD EAX,imm32
- ADD r/m8,imm8
- ADD r/m16,imm16
- ADD r/m32,imm8
- 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 AL,imm8
- SUB AX,imm16
- SUB EAX,imm32
- SUB r/m8,imm8
- SUB r/m16,imm16
- SUB r/m32,imm32
- SUB r/m16,imm8
- SUB r/m32,imm8
- SUB r/m8,r8
- SUB r/m16,r16
- SUB r/m32,r32
- SUB r8,r/m8
- SUB r16,r/m16
- SUB r32,r/m32
- . AND指令(与)
1&1==1,1&0==0,0&0==0
- . OR指令(或)
1|1==1,1|0==1,0|0==0
- . XOR指令(异或)
1^1==0,0^0==0,1^0==1,0^1==1
- . NOT指令(非)
五.内存的读写
1>.寄存器与内存的区别:
1.寄存器位于CPU内部,执行速度快,但比较贵。
2.内存速度相对较慢,但成本较低,所以可以做的很大。
3.寄存器和内存没有本质区别,都是用于存储数据结构的容器,都是定宽的。
4.寄存器常用的有8个:EAX,BCX,EDX,EBX,ESP,EBP,ESI,EDI
5.计算机中的几个常用计量单位:byte word dword
Byte 字节= 8(BIT)
Word 字 =16(bit)
Dword 双字=32(bit)
1KB =1024 BYTE
1MB =1024 KB
1GB =1024 MB
每一块内存都会有一个编号
6.内存的数量特别庞大,无法为每个内存单元都起一个名字,所以用编号来代替,我们称计算机CPU是32位或者64位,有很多书上之所以叫32位计算机是因为寄存器的宽度是32位的,是不准确的,因为还有很多寄存器是大于32位的。
计算机内存的每一个字节都会有一个编号(即内存编号的单位是字节)
0x00000000
0x00000001
0x00000002
……
……
0xFFFFFFFF
32位计算机的编号最大是32位,也就是32个1,换成16进制位FFFFFFFF,也就是说,32位计算机内存寻址的最大范围是4G.
内存的单位是字节,那内存中能存储的信息最多为:FFFFFFFF+1字节,即4G。
2>.内存
1.内存格式:
① 每个内存单元的宽度为8
② [编号]称为地址
③ 地址的作用:从内存中读入数据
2.从指定内存中写入/读入数据
Mov dword ptr ds:[0x0012FF34]
Mov eax,dword ptr ds:[0x0012FF34]
Dword :要读/写多少 此时是4字节 byte==1字节
word==2字节
Prt:point 代表后面是一个指针(指针的意思是里面存的不是普通的值,而是个地址)
Ds:段寄存器
0x0012FF34:内存编号,必须是32位的,前面0可以省略
注意:地址编号不要随便写,因为内存是有保护的,并不是所有的内存都可以直接读写(需要特别处理)
建议地址编号写成esp的值