TA的每日心情 | 开心 2014-7-1 15:10 |
---|
签到天数: 1 天 [LV.1]初来乍到
滴水专家
- 积分
- 550
|
本帖最后由 有三只熊 于 2014-3-14 03:58 编辑
根哥一再强调栈的重要性 相信大家都在此处花了很多功夫 经过N次攻坚 有一点小小的心得 恳请大家批评指正
函数头
0040D450 push ebp //保留ebp的值
0040D451 mov ebp,esp //将栈底和栈顶放到一起
0040D453 sub esp,40h //将栈顶向上走16行 空余出16行的空间
0040D456 push ebx //保存ebx的值
0040D457 push esi //保存esi的值
0040D458 push edi //保存edi的值
0040D459 lea edi,[ebp-40h] //将edi变成ebx的下方 准备放入数据
0040D45C mov ecx,10h //规定填充次数 16次
0040D461 mov eax,0CCCCCCCCh //准备放入数据 CCCCCCCC是方便纠错
0040D466 rep stos dword ptr [edi] //填充16次 将栈填满
函数尾
0040D46A pop edi //还原edi的值
0040D46B pop esi //还原esi的值
0040D46C pop ebx //还原ebx的值
0040D46D mov esp,ebp //将栈底和栈顶放到一起
0040D46F pop ebp //还原ebp的值
0040D470 ret //esp+4后 【esp-4】-->eip
寄存器 初始值 结束值 变化特征
EDI = 00000000 --> 00000000 (0012FF40 --> 0012FF80 --> 还原)
ESI = 02BBF8E8 --> 02BBF8E8 (未发生变化)
EBP = 0012FFC0 --> 0012FFC0 (0012FF80 --> 还原)
EBX = 7FFDD000 --> 7FFDD000 (未发生变化)
EIP = 0040D4B0 --> 00401189
粗略总结:
1、通过一系列操作 保存的寄存器 有EDI EBP EBX ESI以上4个寄存器 都成功还原为之前的值 其中EBX ESI的值从未发生变化
2、EDI起到了中转站的作用 为填充eax的值指明了位置
3、EBP因为始终指向栈底 所以只进行了1次变化 并成功还原为之前的值
|
|