#include "stdafx.h"
int Plus(int x, int y)
{
int z = 2;
return x+y+z; }
int main(int argc, char* argv[])
{
int r = Plus(3, 4);
return 0;
}
esp:栈顶
ebp:栈底
对于函数调用,先压入参数,再执行call
对于参数,从右向左依次压入堆栈(stdcall模式) 因此,本程式先压入4,再压入3
一般的mov等指令无法改变eip的值,但是call可以call 00401005: a.将eip的值改为函数所在的地址0x00401005 b.将函数的ret address 压入堆栈保存
保留原栈底位置
紫色部分即为缓冲区
LEA EDI,DWORD PTR SS : [EBP - 44] (EDI中存放缓冲区的最顶地址)MOV ECX ,11 MOV EAX , CCCCCCCCREP STOS DWORD PTR ES : [EDI]
一般情况下:ebp - n 是局部变量 ebp +n 是参数 EBP + 4 是返回地址(因此凡是想修改 ebp + 4 的指令都必须小心)
EAX存放函数返回值
MOV ESP,EBP
POP EBP 恢复栈底
将堆栈中函数的返回地址pop到eip中
ADD ESP,8 平衡堆栈
本文分享自 Ms08067安全实验室 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!