在b站上找到的滴水逆向的课,bv号:BV1w54y1y7Di
1.逻辑运算
2.寄存器和内存
1.逻辑运算
问:计算机只认识二进制,也就是0和1,那么计算机是如何进行计算的?
答:逻辑运算
举例:计算2+3=?
X=0010
Y=0011
令R=X xor Y =0001
令Z=X and Y =0010 且 Z=Z<<1=0100
若Z=0则R就是计算的结果,反之,则令X=R,Y=Z再次进行上面的计算
此处显然不符合Z=0,则
X=0001
Y=0100
R=X xor Y=0101
Z=X and Y=0000 且 Z=Z<<1=0
此时Z=0,那么R就是计算的结果,结果为0101,也就是5。
用汇编写2+3:
mov eax,2
add eax,3
2.寄存器和内存
在计算机的计算中需要用到数据,需要容器来储存这些数据,寄存器和内存就是储存这些数据的容器。
寄存器:位于cpu内部,储存快但昂贵
内存:执行速度相对较慢,但成本低,可以做得很大
寄存器
32位通用寄存器及指定用途
EAX 累加器
ECX 计数
EDX I/0指针
EBX Ds段的数据指针
ESP 堆栈指针
EBP SS段的数据指针
ESI 字符串操作的源指针;SS段的数据指针
EDI 字符串操作的目标指针;ES段的数据指针
其实目前只用将这8个容器看做是8个相同大小的杯子,并不用记里面存的是什么0、
内存
32位的计算正常情况下寻址大小不但能超过4GB
内存的读写
寻址公式一:立即数
mov eax,dword ptr ds:[某地址]:将某地址的内存赋给eax
mov dword ptr ds:[某地址],0x87654321:将某地址的内存修改为0x87654321
lea ecx,dword ptr ds:[某地址]: 将某地址的地址编号赋给ecx
寻址公式二:[reg]reg代表寄存器,可以是8个通用寄存器中的任意一个
mov eax,dword ptr ds:[某寄存器]:将某寄存器的内存赋给eax
mov dword ptr ds:[某寄存器],0x87654321:将某寄存器的内存修改为0x87654321
lea ecx,dword ptr ds:[某寄存器]: 将某寄存器的地址编号赋给ecx
寻址公式三:[reg+立即数]
寻址公式四:[reg+reg’ * N] (N只能是1,2,4,8)
寻址公式五:[reg+reg’ * N+立即数]
堆栈
1.堆栈的本质就是内存
2.栈是用来储存临时变量,函数传递的中间结果
3.堆栈是操作系统维护的,对于“正向程序员”是透明的
将栈看作一个杯子EBP是杯底,ESP是杯口
push 入栈 pop 出栈
变形
pop ecx 相当于
mov ecx,dword ptr ss:[esp]
lea esp,dword ptr ss:[esp+4]==mov esp,esp+4==add esp,4
或者
lea esp dword ptr ss:[esp+4]
mov ecx,dword ptr ss:[esp-4]