汇编学习之笔记1
ebp ,esp寄存器
注意栈是从高地址向低地址生长(堆相反):
EBP是"基址指针"(BASE POINTER), 它最经常被用作高级语言函数调用的"框架指针"(frame pointer).
ESP 专门用作堆栈指针,被形象地称为栈顶指针,堆栈的顶部是地址小的区域,压入堆栈的数据越多,ESP也就越来越小。在32位平台上,ESP每次减少4字节。
在破解的时候,经常可以看见一个标准的函数起始代码:
push ebp ;保存当前ebp
mov ebp,esp ;EBP设为当前堆栈指针
sub esp, 0xF8 ;预留0xF8字节给函数临时变量.
…
变化过程如下图,
运行上面代码前:
EBP地址为:0043F7C8,
ESP:0043F778,中间有80个字节是原来程序所占内存;
运行代码后:
EBP地址为:0043F778,
ESP:0043F680,中间有248个字节是为该函数分配的内存;
这样一来,EBP 构成了该函数的一个框架, 在EBP上方分别是原来的EBP, 返回地址和参数. EBP下方则是临时变量. 函数返回时作 mov esp,ebp/pop ebp/ret 即可.