首页
论坛
课程
招聘
[原创]缓冲区溢出小程序分析
2020-2-4 20:21 4165

[原创]缓冲区溢出小程序分析

2020-2-4 20:21
4165

首先来看看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的位置,依次存储下来,再来看看栈中的变化:



 


 

这里是取fun的地址出来并转换为int类型,然后存入数组下标为9的地方,我们看看ebp+4这个地址执行前后的变化

执行前

执行后



 

经过这个对比之后,ebp+4刚好是这个存储返回地址的地方,我们继续往下走


 

异或eax之后,依次取出edi,esi,ebx,然后将ebp的值移动到esp中,随后取出ebp,再来看看堆栈变化:


 


上面的操作是使堆栈平衡,接着来看


 

接着执行了一个ret,ret的操作相当于push eip,F11一下,看看eip


 


 


就这样进入了fun函数


 


 

本次分析就是分析缓冲区都溢出了为何还能执行fun函数,到这里我们可以知道溢出之后覆盖掉了程序的返回地址,所以导致程序进入了fun函数中。溢出并不可怕,可怕的是不会调试啊!


第五届安全开发者峰会(SDC 2021)议题征集正式开启!

收藏
点赞1
打赏
分享
最新回复 (5)
雪    币: 399
活跃值: 活跃值 (68)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
koop 活跃值 2020-2-4 21:17
2
1
写的挺好的,就是配的图容易晕,其实这样的图更详细,就是猛地一看晕了
雪    币: 3281
活跃值: 活跃值 (992)
能力值: ( LV10,RANK:160 )
在线值:
发帖
回帖
粉丝
Gcow安全团队 活跃值 2020-2-4 21:22
3
0
楼上得大佬,别怕晕了,醒了再继续
雪    币: 3281
活跃值: 活跃值 (992)
能力值: ( LV10,RANK:160 )
在线值:
发帖
回帖
粉丝
Gcow安全团队 活跃值 2020-2-4 21:23
4
0
koop 写的挺好的,就是配的图容易晕,其实这样的图更详细,就是猛地一看晕了[em_13]
别怕晕了,醒了再继续 
雪    币: 399
活跃值: 活跃值 (68)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
koop 活跃值 2020-2-4 21:27
5
0
Gcow安全团队 别怕晕了,醒了再继续
呵呵,主要是表格看起来有点密集恐惧症的眩晕,尤其是表格是拼起来的,再加上中间的字容易忽略,所以一开始看的时候会出错,(截图估计没办法解决了,不过建议中间拼接的字体加大加红加注,否则看看就跑偏了
雪    币: 399
活跃值: 活跃值 (68)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
koop 活跃值 2020-2-4 21:28
6
0
Gcow安全团队 别怕晕了,醒了再继续
我可不是大佬,我只是个刚开始的菜菜
游客
登录 | 注册 方可回帖
返回