Chinaunix首页 | 论坛 | 博客
  • 博客访问: 26474
  • 博文数量: 6
  • 博客积分: 135
  • 博客等级: 入伍新兵
  • 技术积分: 70
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-09 15:51
文章存档

2011年(6)

我的朋友

分类: LINUX

2011-10-04 18:30:16

        IA32程序用栈来支持过程调用。当过程P调用过程Q时,先将过程P的(1)%ebp,(2)某些被保存的寄存器(%ebx、%esi和%edi)、本地变量和临时变量,(3)参数,(4)返回地址(调用Q结束之后的下一条指令的地址)压入栈中。P调用Q,也会使帧指针%ebp和栈指针%esp发生变化。%ebp的作用是确定过程Q某些参数值(被压入在P栈帧中)。被保存的寄存器在执行ret命令之前需要恢复其保存在栈中的值。调用结束后,可以通过pop命令出栈,ret命令使%eip读返回地址中的值。
        缓冲区溢出:由于C对于数组的引用不进行任何边界检查(例如,定义int a[10],我可以对a[10]进行操作),而且局部变量和状态信息都放在栈中,从严对越界的数组元素进行写操作会破坏储存在栈中的状态信息。当栈分配某些字节来保存一个数组时,字符符串的长度超出数组分配的空间就导致缓冲区溢出。
       通过改变栈中返回地址的值,就可以让程序执行程序本来不愿意执行的程序。
阅读(1558) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~