缓冲区溢出之栈溢出原理(上篇)

0x01 缓冲区溢出介绍

缓冲区溢出技术一直是黑客技术的巅峰,同时也是菜鸟和高手的分水岭(一个黑客如果说不会缓冲区溢出攻击,就说明你是个菜鸡,菜鸡~)。当掌握了缓冲区溢出,可以说是真正的进入了黑客的世界(蠕虫,网马都出自于此)。同时缓冲区溢出也是最难学的黑客技术之一,包括系统编程,逆向工程,漏洞分析等高端技术,入门门槛比较高,而且相关资料非常少

0x02 什么是栈

(1)要了解为什么会出现缓冲区溢出,首先需要了解变量在内存当中是怎么储存的。变量在内存中的储存方式主要是储存在栈中,程序或函数在进入的时候会在内存当中开辟一块栈空间供程序或函数来使用,当程序或函数运行结束时,栈空间会被释放掉。以下是一个简单的程序,主要模拟函数的开始和结束栈是如何变化的(C-Free编译)
在这里插入图片描述
(2)用OD载入,图中0x00401210就是程序的真正入口点OEP,0x40121B就是test()函数,单步跟一下
在这里插入图片描述
(3)到这个位置开始就开始调用函数了,注意观察堆栈窗口,此时ESP指向的是0x0240FF18
在这里插入图片描述
在这里插入图片描述
(4)之后F7单步进入函数内部。这里有一个知识,栈有3个名词:栈底,栈顶,和栈帧。压栈和出栈都是针对栈帧进行操作的,栈帧大小为固定的4个字节,所以压一次栈和出一次栈都是4个字节。在进入函数的时候首先会进行一次压栈操作,将函数的返回地址压入栈(4个字节),此时ESP从刚才的0x0240FF18变为0x0240FF14,栈帧中储存的是返回地址0x00401220
在这里插入图片描述
在这里插入图片描述
(5)F8单步跟,发现程序压入了ebp,之后将esp减去0x8,0x8的空间就是给函数来存放函数中的变量等等。那么此时ESP的地址应该是0x0240FF14-0x4-0x8 = 0x0240FF08,到这为止函数的进入操作就都完成了
在这里插入图片描述在这里插入图片描述
(6)那么函数退出时栈怎么变化的呢。单步跟到函数返回的地方,观察堆栈,刚刚函数进入的时候压入了返回地址,那时候ESP指向的是0x0240FF14这个地址,所以在函数返回的时候ESP同样会指向这个地址,之后函数运行结束,重新回到main函数当中,之后增加ESP用于维持堆栈平衡…
在这里插入图片描述在这里插入图片描述

0x03 总结

一个函数调用的流程:进入函数->压入返回地址->压入EBP->开辟函数栈空间->函数内部操作->根据压入的返回地址返回->增加EBP->结束。这就是函数的调用流程,也就是说函数开辟的栈空间离函数的返回地址整整差了8个字节(返回地址+压入EBP),也为溢出创造了条件。下面请看:缓冲区溢出之栈溢出原理学习(中篇)

猜你喜欢

转载自blog.csdn.net/qq_38924942/article/details/86583586