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) |