前言
由于母亲的一场大病已有近一个月未更新博客,大家也要反思自己是否有些忽视了健康的重要性啊。
回到正题,最近软件安全作业需要写一份最基础的栈溢出的实验报告,因为栈溢出是安全领域的基础知识,但是由于平时没有使用的机会所以总是记不住,这里写一篇博客记录一下。
正文
Background
这里先主要针对 32 位程序进行说明。
寄存器使用约定
Caller-saved registers: EAX, ECX, EDX
Callee-saved registers: EBX, ESI, EDI
函数调用栈典型布局
函数在调用过程中,首先将函数的参数从右到左逐个入栈,然后入栈返回地址,入栈EBP,最后入栈 Callee 的局部变量。
常用指令
call:将当前的指令指针 EIP(该指针指向紧接在 call 指令后的下条指令) 压入堆栈,以备返回时能恢复执行下条指令;然后设置 EIP 指向被调函数代码开始处,以跳转到被调函数的入口地址执行。
ret: 从栈顶弹出返回地址 (之前 call 指令保存的下条指令地址) 到 EIP 寄存器中,程序转到该地址处继续执行(此时 ESP 指向进入函数时的第一个参数)。若带立即数,ESP 再加立即数(丢弃一些在执行 call 前入栈的参数)。使用该指令前,应使当前栈顶指针所指向位置的内容正好是先前 call 指令保存的返回地址。