-
-
[原创]缓冲区溢出小程序分析
-
发表于:
2020-2-4 20:21
7188
-
首先来看看C语言溢出小程序
这个程序看着好像是没有任何问题,运行是这样的:
我们主要关注这个check函数,首先定义了一个int类型的数组且其中个数为8个,下一行将fun函数地址存入arr[9]中,其实这里我们可以看到定义数组的时候个数也就是8,实际到达的下标是7,所以我们最多能取数组的值为arr[7],连8都不到,这里我们获取fun函数地址的时候却存到了下标为9的地址,跳了一个下标。首先来了解下数组的存储方式
高地址
低地址
这是我简单画的数组存储的堆栈图,数组是使用连续的内存空间来存储的,说白了和局部变量的存储差异不大,我们现在开始分析代码:
现在我们记住ebp和esp的值
现在我们来把这个堆栈图画一下
这里按F11进入函数体中,call进函数会将它下一行地址压入栈中,然后调到函数体,这时再来看看堆栈的变化:
接着往下走,我们看看函数体中的代码:
进入函数后将ebp压入栈中,然后将esp中的值移动到ebp中,之后esp-60h(60h/4h=18h=24)提升栈空间,再来看看此时的堆栈:
接下来将ebx,esi,edi依次推入栈中,下面的代码到rep指令是将缓冲区填充为CCCCCCCCCh,再来看看堆栈的变化:
接着往下走
这里是将数组存到缓冲区中,从低地址向高地址存储,20h/4h=8h=8从esp的位置向上数八格就是存储1的位置,依次存储下来,再来看看栈中的变化:
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课