版權聲明:本文為博主原創文章,轉載請附上原文出處鏈接和本聲明。2019-08-24,00:40:12
作者By-----溺心與沉浮----博客園
1、BASE,TOP是2個32位的通用寄存器,里面存儲的是內存單元編號(內存地址).
2、BASE里面存儲了一個地址,記錄的起始地址.
3、TOP里面也存儲了一個地址,記錄的是結束的地址.
4、存入數據的時候,TOP的值減4(為方便演示,每次存取都是4個字節)
5、釋放數據的時候,TOP的值加4(為方便演示,每次存取都是4個字節)
6、如果要讀取中間的某個數據的時候可以通過TOP 或者 BASE 加上偏移的方式去讀取
7、這種內存的讀寫方式有個學名:堆棧
堆棧的優點:臨時存儲大量的數據,便於查找.
在OD中紅框位置,隨機選取一個內存地址作為我們的棧底與棧頂,我已0x18FFD0為例,用EDX,EBX仿ESP,EBP
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-----溺心與沉浮----博客園
代碼執行后:
后面的就不上圖了
方式2、
SUB EDX,4
MOV DWORD PTR DS:[EDX],0xBBBBBBBB
方式3、
LEA EDX,DWORD PTR DS:[EDX-4]
MOV DWORD PTR DS:[EDX],0xCCCCCCCC
方式4、
MOV DWORD PTR DS:[EDX-4],0xDDDDDDDD
LEA EDX,DWORD PTR DS:[EDX-4]
步驟2、讀取第N個數
方式1、通過BASE加偏移的形式來讀取,讀出來的值放到ESI中
讀第一個壓入的數據
MOV ESI,DWORD PTR DS:[EBX-4]
讀第四個壓入的數據
MOV ESI,DWORD PTR DS:[EBX-10]
方式2、通過TOP加偏移的形式來讀取,讀出來的值放到ESI中
讀第一個壓入的數據
MOV ESI,DWORD PTR DS:[EDX+10]
讀第四個壓入的數據
MOV ESI,DWORD PTR DS:[EDX+4]
步驟3、彈出數據
方法1、
MOV ECX,DWORD PTR DS:[EDX]
ADD EDX,0x4
方法2、
LED EDX,DWORD PTR DS:[EDX+0x4]
MOV ECX,DWORD PTR DS:[EDX-0x4]
方法3、
MOV ECX,DWORD PTR DS:[EDX]
LEA EDX,DWORD PTR DS:[EDX+0x4]
push指令:
1、PUSH r32
2、PUSH r16
3、PUSH m16
4、PUSH m32
5、PUSH imm8/imm16/imm32
pop指令:
1、POP r32
2、POP r16
3、POP m16
4、POP m32
1、使用2種方式實現:push ecx
一、
MOV DWORD PTR DS:[ESP-0x4],0x1
LEA ESP,DWORD PTR DS:[ESP-0x4]
二、
LEA ESP,DWORD PTR DS:[ESP-0x4]
MOV DWORD PTR DS:[ESP],0x1
三、
MOV DWORD PTR DS:[ESP-0x4],0x1
SUB ESP,0x4
四、
SUB ESP,0x4
MOV DWORD PTR DS:[ESP],0x1
2、使用2種方式實現:pop ecx
一、
ADD ESP,0x4
MOV EAX,DWORD PTR DS:[ESP-0x4]
二、
MOV EAX,DWORD PTR DS:[ESP]
ADD ESP,0x4
三、
MOV EAX,DWORD PTR DS:[ESP]
LEA ESP,DWORD PTR DS:[ESP+0x4]
四、
LEA ESP,DWORD PTR DS:[ESP+0x4]
MOV EAX,DWORD PTR DS:[ESP-0x4]
3、使用2種方式實現:push esp
一、
MOV EAX,ESP
MOV DWORD PTR DS:[ESP-4],EAX
SUB ESP,4
二、
MOV DWORD PTR DS:[ESP-4],ESP
SUB ESP,4
4、使用2種方式實現:pop esp
一、
MOV EAX,DWORD PTR DS:[ESP]
MOV ESP,EAX
二、
MOV ESP,DWORD PTR DS:[ESP]
三、
ADD ESP,4
MOV ESP,DWORD PTR DS:[ESP-4]
push一定是減去4個字節嗎?
答:不是,push可以對一個字的寄存器或者內存進行push,此時是2字節,對雙字的寄存器或者內存進行push的時候,是4字節,
注意:push不能push一個字節的寄存器或者內存,pop同push
版權聲明:本文為博主原創文章,轉載請附上原文出處鏈接和本聲明。2019-08-24,00:40:12
作者By-----溺心與沉浮----博客園