逆向学习笔记-基于EBP的栈帧
来源:未知 责任编辑:责任编辑 发表时间:2013-11-15 19:49 点击:次
程序的OEP,一开始以 push ebp 和mov ebp esp这两句开始。
p>
p>原因:c程序的开始是以一个主函数main()为开始的,而函数在访问的过程中最重要的事情就是要确保堆栈的平衡,而在win32的环境下保持平衡的办法是这样的:
p>1.让EBP保存ESP的值。
p>2.在程序运行完毕的时候调用
p>
p>mov esp,ebp
p>pop ebp
p>retn
p>或者是
p>leave
p>retn
p>通过EBP保存程序运行前ESP的值,那么程序运行过程中,不管ESP被Push还是Pop多少次,最终都可以通过EBP还原最开始的值。
p>
p>我们下面使用gcc编译的stackframe函数为例:
p>
p>
p>void stackframe(int a,int b,int c){
p> int x=c;
p> char buffer[64];
p> int y=b;
p> int z=10;
p> buffer[0]='A';
p> bar(z,y);
p>}
p>这个函数对应的反汇编代码如下:
p>
p>.text:0040153C ; =============== S U B R O U T I N E =======================================
p>.text:0040153C
p>.text:0040153C ; Attributes: bp-based frame
p>.text:0040153C
p>.text:0040153C _text_40153C proc near ; CODE XREF: _text_40157A
p>.text:0040153C
p>.text:0040153C var_60= dword ptr -60h ;z
p>.text:0040153C var_5C= dword ptr -5Ch ;y
p>.text:0040153C var_58= dword ptr -58h ;buffer
p>.text:0040153C var_C= dword ptr -0Ch ;x
p>.text:0040153C arg_4= dword ptr 0Ch ;b
p>.text:0040153C arg_8= dword ptr 10h ;c
p>.text:0040153C
p>.text:0040153C push ebp
p>.text:0040153D mov ebp, esp
p>.text:0040153F sub esp, 78h
p>.text:00401542 mov eax,[ebp+arg_8]
p>.text:00401549 mov [ebp+var_C],eax
p>.text:0040154B mov eax,[ebp+arg_4]
相关新闻>>
- coco2d学习day01 精灵分析
- cocos2d-x学习日志(18) --程序是如何开始运行与结束?
- [cocos2dx笔记004] android增加静态库工程
- [cocos2dx笔记003] Vs2013增加静态库工程
- cocos2d-x 3.0 rc0 + flappybird 学习心得
- cocos2d-x3.0 开发笔记---Extension
- 关于“.WriteLine()是否需要这么多重载”的笔记
- Cocos2dx游戏开发系列笔记19:vs2013下开发cocos2dx3.0beta并成
- Cocos2dx游戏开发系列笔记18:《跑酷》游戏源码解析
- Cocos2dx游戏开发系列笔记16:来个Demo:《喵汪大战》之cocos2dx
最新推荐更多>>>
- 发表评论
-
- 最新评论 更多>>