堆栈图

存储参数

1.push

先执行push 2,在push1。栈从上往下(1,2是参数)

call—〉返回一个地址,并将下一个指令地址存入栈中

401171—〉函数执行完的返回地址(简称返回地址)

保留栈底

2.push ebp

将ebp里的值放入了栈里面

提升栈顶

3.mov ebp,esp

将esp里的值放入ebp中

4.Sub esp,40

esp-四零,(四零是16进制,一格有四个除以四,等于一零,在换算成十进制就是16个,栈的格数就往上数16个)

esp:12fee4

保存现场

5.Push ebx

push ebx—〉将ebx里面的值存入栈中,esp+4

清除垃圾数据

6.Lea edi,Dword ptr ss:[ ebp 40]

取[ebp- 40]的地址编号放入edi里面

edi变为0012f114(栈没有发生变化

7.清数据

将eax里面的字符串放入edi指向的内存地址中,edi加(减)四。一共重复16次,每重复一次,ecx- 1

(rep重复)

计算(正式工作。。。

8.计算

[ebp+8]地址里面的值放入了eax中

栈平衡

9.恢复现场

执行后

10.降低栈

11.恢复栈底

retn——pop eip

Eip会变成401171

12.外平栈

 

add  esp,8

函数

汇编中的函数

是一个固定的程序段,或者称其为一个子程序,实现固定运算功能。同时带有一个出口和一个入口。

注:1)寄存器和内存都可以将参数传入函数中,也可以将计算出来的值保存下来

       2)不一定有返回值

Windows堆栈特点

第二个堆栈图

 步骤

1.

Push 3

Push 2

Push 1

2.

call   000401005

3. 

 

PUSH EBP 

MOV EBP,ESP 

SUB ESP,48 

 

4、

PUSH EBX 

PUSH ESI 

PUSH EDI

5、

LEA EDI,DWORD PTR SS:[EBP-48] 

MOV ECX,12 

MOV EAX,CCCCCCCC 

REP STOS DWORD PTR  ES:[EDI] 

6、

MOV DWORD PTR SS:[EBP-4],2 

MOV EAX,DWORD PTR SS:[EBP+C] 

eax 变成2

7.

PUSH EAX 

MOV ECX, DWORD PTR SS:[EBP+8] 

PUSH ECX

*8.

CALL 0040100A

9.

PUSH EBP 

MOV EBP,ESP           //ebp=esp

SUBESP,44

10.

PUSH EBX 

PUSH ESI 

PUSH EDI 

LEA EDI,DWORD PTR SS:[EBP-44] 

MOV ECX,11 

MOV EAX,CCCCCCCC 

REP STOS DWORD PTR ES:[EDI]

11.

MOV DWORD PTR SS:[EBP-4],0A 

MOV EAX, DWORD PTR SS:[EBP+81 

ADD EAX,DWORD PTRSS:[EBP+CI         /此时eax为3

ADD EAX, DWORD PTR SS:[EBP-4]    /eax=3+a=d

12.

POP EDI 

POP ESI 

POP EBX

13.

MOV ESP,EBP 

POP EBP

14.

RETN

EIP变为40109c

15.

ADD ESP,8

 16.

MOV DWORD PTR SS:[EBP-8],EAX 

MOV EAX, DWORD PTR SS:[EBP-4]     /EAX=2

ADD EAX,DwORD PTR SS:[EBP-8]      /eax=2+d=f

ADD EAX, DWORD PTR SS:[EBP+10]        /eax=f+3=12      (10转为16进制是16,除以4=4,所以esp向下四格,所以是三)

17.

POP EDI 

POP ESI 

POP EBX

18.

ADD  ESP ,48

CAMP  EBP ,ESP    /Eap和esp做减法,若等于0 ,z位为一

19.

MOV ESP,EBP

POP EBP

RETN

20.

ADD ESP,0C

 

posted @ 2024-06-15 15:12  雨里青山隐  阅读(21)  评论(0编辑  收藏  举报