通过寻找危险函数,我们快速确定程序是否可能有栈溢出,以及有的话,栈溢出的位置在哪里。常见的危险函数如下
这一部分主要是计算我们所要操作的地址与我们所要覆盖的地址的距离。常见的操作方法就是打开 IDA,根据其给定的地址计算偏移。一般变量会有以下几种索引模式
一般来说,我们会有如下的覆盖需求
之所以我们想要覆盖某个地址,是因为我们想通过覆盖地址的方法来直接或者间接地控制程序执行流程。
在x86环境中,esp
和ebp
是两个特殊的寄存器,用于管理栈帧和函数调用。
esp
寄存器(Extended Stack Pointer)是栈指针寄存器,用于指向栈的顶部。栈是一种后进先出(LIFO)的数据结构,用于存储函数调用的局部变量、函数参数以及其他临时数据。通过修改esp
寄存器的值,可以在栈上进行数据的压栈和弹栈操作。
ebp
寄存器(Extended Base Pointer)是基址指针寄存器,也称为帧指针寄存器。它通常用于指向当前函数的栈帧的底部。栈帧是一个用于存储函数的局部变量和其他相关信息的区域。通过保存和恢复ebp
寄存器的值,可以在函数调用之间正确地访问和管理局部变量。
在函数调用过程中,通常会按照以下步骤使用esp
和ebp
寄存器:
ebp
值保存到栈上,创建一个新的栈帧。这样可以在函数执行期间保存上一级函数的栈帧信息。
esp
值赋给ebp
寄存器,以建立当前函数的栈帧。这样可以使用ebp
作为基址指针来访问函数的局部变量和其他相关信息。
esp
寄存器的值来分配和释放栈上的空间,以便存储局部变量和临时数据。
ebp
值,销毁当前函数的栈帧,并将控制权返回到上一级函数。
使用esp
和ebp
寄存器可以有效地管理函数调用和局部变量,确保栈帧的正确访问和释放,以及函数之间的正确返回。
在x86架构的环境中,有一些常见的寄存器用于存储和处理数据。以下是x86架构中常见的寄存器: