您的位置:首页 > 其它

栈溢出利用--预备知识

2015-12-07 11:14 232 查看

一、缓冲区溢出原理:

简单而言就是大缓冲区中的数据向小缓冲区复制的过程,小缓冲区的相邻内存区域被覆盖,而引起的内存问题。成功的利用缓冲区漏洞可以修改内存中变量的值,甚至是劫持进程,执行恶意代码,最终获得程序的控制权。

二、理解内存的功能:

1、代码区.text–存储被装入执行的二进制代码,CPU会到这里来取指执行。

2、数据区.data–存储全局变量。

3、堆区–进程在堆区动态的请求一定大小的内存块,并在用完后回收。特点–动态&回收。

4、栈区–动态存储函数之间的调用关系,以保证在调用完成后恢复到上级父函数执行。

三、PE文件装载:

高级语言程序编译后生成可执行的PE文件。PE文件被装载运行后,就成了进程。

PE文件中二进制机器码被装入内存的.text区。



四、栈的操作:

1、push–压栈操作,在栈顶处增加一个元素;

2、pop–弹栈操作,从栈顶处取出一个元素;

3、top–表示栈顶位置。每push一次,top++;每pop一次,top–;

4、base–表示栈底。用于防止栈空后继续弹栈。

五、函数调用在底层的工作原理:

int func_B(int arg_B1,int arg_B2)
{
int var_B1, int var_B2;
var_B1=arg_B1+arg_B2;
var_B2=arg_B1-arg_B2;
return var_B1*var_B2;
}
int func_A(int arg_A1,int arg_A2)
{
int var_A;
var_A=func_B(arg_A1,arg_A2)+arg_A1;
return var_A;
}
int main(int argc,char **argv,char **envp)
{
int var_main;
var_main=func_A(4,3);
return var_main;
}




代码区中的跳转都是和系统栈的巧妙结合下完成的。

1、在main函数调用func_A时,首先将自己的栈帧中压入函数返回地址,然后为func_A创建新栈帧并压入系统栈。

2、在func_A 调用 func_B 时,同样先将自己的栈帧中压入函数返回地址,然后为func_B创建新栈帧并压入系统栈。

3、在func_B 返回时,func_B 栈帧弹出系统栈,func_A 的返回地址此时位于栈顶处,pop 出func_A 的返回地址转去执行func_A 代码区。

4、在func_A返回时,func_A 栈帧弹出系统栈,main函数的返回地址此时位于栈顶处,pop 出 main 函数的返回地址转去执行main代码区。



六、几个重要的术语

每个函数独自拥有自己的栈帧。当前运行的函数的栈帧总是位于系统栈的栈顶。

1、ESP–栈指针寄存器,该指针永远指向系统栈最上面的一个栈帧的栈顶元素;

2、EBP–基址指针寄存器,该指针永远指向系统栈最上面的一个栈帧的底部元素;

Notice:EBP指向的是系统栈最上面一个栈帧的底部,而并非系统栈的底部。

栈帧底部和栈底是不同的概念。



3、函数栈帧:位于ESP和EBP之间的内存空间。在函数栈帧中包含有:

(1)局部变量;

(2)栈帧状态值–保存当前栈的底部和顶部,用于在本帧被弹出恢复上一个栈帧;

(3)函数返回地址–保存当前函数调用前的断点信息。也就是函数调用前的指令的位置。

4、EIP寄存器:指针寄存器。存放下一条等待执行的指令的地址。

七、函数调用的相关指令:

1、调用步骤:

(1)参数入栈:从右到左;

(2)返回地址入栈:当前代码区的下一条指令地址入栈;

(3)代码区跳转:处理器从当前跳转到调用函数入口;

(4)栈帧调整:

1)保存当前栈帧内容(EBP入栈);

2)切换当前栈帧到新栈帧(将ESP值装入EBP,更新栈帧底部);

3)给新栈帧分配空间(ESP减去所需空间,抬高栈顶)

;调用前
push 参数3
push 参数2
push 参数1
call 函数地址
push ebp    ;保存旧栈帧底部
mov esp,ebp ;设置新栈帧底部,栈帧切换
sub esp,xxx ;设置新栈帧顶部,分配空间






2、返回步骤:

(1)保存返回值:返回值通常保存在EAX中

(2)弹出当前栈帧,恢复上一栈帧

1)ESP加上栈帧大小,降低栈帧,回收栈帧空间;

2)当前栈帧底部保存的前栈帧EBP弹入EBP寄存器,恢复上一栈帧;

3)函数返回地址弹入EIP寄存器

(3)跳转:函数返回地址调到父函数执行。

add esp,xxx ;降低栈顶,回收栈帧空间
pop ebp     ;前栈帧底部位置恢复
retn        ;弹出当前栈顶元素,也就是弹出栈帧的返回地址
;处理器跳转到返回地址执行
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: