版权声明:本文为博主原创文章,转载请附上原文出处连接和本声明。2019-08-24,00:40:12
做者By-----溺心与沉浮----博客园spa
一、BASE,TOP是2个32位的通用寄存器,里面存储的是内存单元编号(内存地址).3d
二、BASE里面存储了一个地址,记录的起始地址.blog
三、TOP里面也存储了一个地址,记录的是结束的地址.内存
四、存入数据的时候,TOP的值减4(为方便演示,每次存取都是4个字节)博客
五、释放数据的时候,TOP的值加4(为方便演示,每次存取都是4个字节)方法
六、若是要读取中间的某个数据的时候能够经过TOP 或者 BASE 加上偏移的方式去读取im
七、这种内存的读写方式有个学名:堆栈d3
堆栈的优势:临时存储大量的数据,便于查找.数据
在OD中红框位置,随机选取一个内存地址做为咱们的栈底与栈顶,我已0x18FFD0为例,用EDX,EBX仿ESP,EBPimg
MOV EDX,0x18FFD0 TOP
MOV EBX,0x18FFD0 BASE
一、压入数据
压入数据的方法不少
方式1、
MOV DWORD PTR DS:[EDX-4],0xAAAAAAAA
SUB EDX,4
版权声明:本文为博主原创文章,转载请附上原文出处连接和本声明。2019-08-24,00:40:12
做者By-----溺心与沉浮----博客园
代码执行后:
后面的就不上图了
方式二、
SUB EDX,4
MOV DWORD PTR DS:[EDX],0xBBBBBBBB
方式三、
LEA EDX,DWORD PTR DS:[EDX-4]
MOV DWORD PTR DS:[EDX],0xCCCCCCCC
方式四、
MOV DWORD PTR DS:[EDX-4],0xDDDDDDDD
LEA EDX,DWORD PTR DS:[EDX-4]
步骤二、读取第N个数
方式一、经过BASE加偏移的形式来读取,读出来的值放到ESI中
读第一个压入的数据
MOV ESI,DWORD PTR DS:[EBX-4]
读第四个压入的数据
MOV ESI,DWORD PTR DS:[EBX-10]
方式二、经过TOP加偏移的形式来读取,读出来的值放到ESI中
读第一个压入的数据
MOV ESI,DWORD PTR DS:[EDX+10]
读第四个压入的数据
MOV ESI,DWORD PTR DS:[EDX+4]
步骤三、弹出数据
方法一、
MOV ECX,DWORD PTR DS:[EDX]
ADD EDX,0x4
方法二、
LED EDX,DWORD PTR DS:[EDX+0x4]
MOV ECX,DWORD PTR DS:[EDX-0x4]
方法三、
MOV ECX,DWORD PTR DS:[EDX]
LEA EDX,DWORD PTR DS:[EDX+0x4]
push指令:
一、PUSH r32
二、PUSH r16
三、PUSH m16
四、PUSH m32
五、PUSH imm8/imm16/imm32
pop指令:
一、POP r32
二、POP r16
三、POP m16
四、POP m32
一、使用2种方式实现:push ecx
1、
MOV DWORD PTR DS:[ESP-0x4],0x1
LEA ESP,DWORD PTR DS:[ESP-0x4]
2、
LEA ESP,DWORD PTR DS:[ESP-0x4]
MOV DWORD PTR DS:[ESP],0x1
3、
MOV DWORD PTR DS:[ESP-0x4],0x1
SUB ESP,0x4
4、
SUB ESP,0x4
MOV DWORD PTR DS:[ESP],0x1
二、使用2种方式实现:pop ecx
1、
ADD ESP,0x4
MOV EAX,DWORD PTR DS:[ESP-0x4]
2、
MOV EAX,DWORD PTR DS:[ESP]
ADD ESP,0x4
3、
MOV EAX,DWORD PTR DS:[ESP]
LEA ESP,DWORD PTR DS:[ESP+0x4]
4、
LEA ESP,DWORD PTR DS:[ESP+0x4]
MOV EAX,DWORD PTR DS:[ESP-0x4]
三、使用2种方式实现:push esp
1、
MOV EAX,ESP
MOV DWORD PTR DS:[ESP-4],EAX
SUB ESP,4
2、
MOV DWORD PTR DS:[ESP-4],ESP
SUB ESP,4
四、使用2种方式实现:pop esp
1、
MOV EAX,DWORD PTR DS:[ESP]
MOV ESP,EAX
2、
MOV ESP,DWORD PTR DS:[ESP]
3、
ADD ESP,4
MOV ESP,DWORD PTR DS:[ESP-4]
push必定是减去4个字节吗?
答:不是,push能够对一个字的寄存器或者内存进行push,此时是2字节,对双字的寄存器或者内存进行push的时候,是4字节,
注意:push不能push一个字节的寄存器或者内存,pop同push