yehao's Blog

程序执行时,栈指针ESP和栈顶指针EBP的变化

进入main函数的时候,
1)保存ebp指针
2)使得ebp->esp
3)保持现场ebx,esi,edi
4)进入一般函数的时候,push参数,例如有n个参数 esp = esp - 4*n
5)push函数返回地址 esp = esp -4
6)调用函数 EIP指向函数地址,jmp 函数地址
7)Push ebp 保存 (故有[ebp+8]就是第一个参数的内容)
8)使得ebp ->esp, esp = esp - 40h - 临时变量需要字节数(有字节对齐问题)
9)保持现场ebx,esi,edi
10)返回值=》eax
11)恢复现场,就是依次pop出edi,esi,ebx,
12)Esp = ebp
13)Pop ebp
14)pop 函数返回地址(即ret),EIP指向下个指令地址 esp = esp +4
15)Esp + n*4 (每个字有4个字节);push是按字操作的,32位机器

知道这些后,程序的溢出就比较容易做了。


http://hi.baidu.com/goodallen/blog/item/1a2e23fc07b7e487b901a0cb.html/cmtid/494b414bcea227fc82025ca2

posted on 2012-02-29 17:17 厚积薄发 阅读(1311) 评论(0)  编辑 收藏 引用 所属分类: C/C++


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

统计

常用链接

留言簿

随笔分类

文章分类

文章档案

搜索

最新评论