首页
社区
课程
招聘
[求助]关于变量在缓冲区的存储问题
发表于: 2007-8-14 09:48 13418

[求助]关于变量在缓冲区的存储问题

2007-8-14 09:48
13418

#include <stdio.h>
#include <string.h>
char a[]="aaaabbbbccccddddeeeeffffgggghhhh";  
        int main()
{
        //char a[]="aaaabbbbccccddddeeeeffffgggghhhh";
        char b[4];

        strcpy(b,a);

        return 0;
}

代码如上,编译运行出报错对话筐。书上解释为典型的堆栈溢出。
但是倘若将数组a定义在main函数内,则正常运行,那为何此时不
溢出了呢?

小弟心里犯嘀咕:
是不是全局变量在栈里定义,而局部变量则定义在普通内存区?
到底有那些变量是在堆栈区开辟空间存储的呢?

麻烦各位大牛们指点迷津,不甚感激:)


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 7
支持
分享
最新回复 (23)
雪    币: 313
活跃值: (440)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
2
其实不是定义在MAIN里面没有溢出而是溢出到a自己里面去了,对于b来说已经是溢出了。不信你printf("%s", a);看。或者你把b的定义放a前面,程序照样溢出。
局部变量一般在栈内分配空间,全局变量一般在普通内存分配空间
2007-8-14 12:27
0
雪    币: 171
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
哦 明白了
原来如此
非常感谢4nil指点
谢谢

总结:先定义的局部变量分配在栈的较高处,溢出时是向栈高处溢。
2007-8-14 13:18
0
雪    币: 433
活跃值: (176)
能力值: ( LV13,RANK:1250 )
在线值:
发帖
回帖
粉丝
4
晕,没仔细看,该说的都让坐沙发的说了,那就看个图吧

上传的附件:
2007-8-14 13:41
0
雪    币: 171
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
[QUOTE=冲天剑;345620]晕,没仔细看,该说的都让坐沙发的说了,那就看个图吧

[/QUOTE]

哈 非常感谢冲天剑做的图片
当时因为问题解决了
所以一直没在关注帖子
今天看到您的图片印象更深了
2007-9-17 19:36
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
高兴  高兴
2007-9-17 21:42
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
谢谢,我也学到了
2007-9-17 22:12
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
我也学习一下了
学习 & 支持
2007-9-17 22:26
0
雪    币: 171
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
呵呵
看到又有人学到东东了
自己也特开心
看雪是个好地方
氛围好
牛人多且喜欢帮助别人
在这里我学到了好多
真心感谢所有帮助过我的朋友们
thx  :)
2007-10-15 17:15
0
雪    币: 245
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
如果溢出刚好覆盖 返回地址,而这个返回地址又是你特意安排的,

那么就是一个 最初等的 溢出 攻击!
2007-10-16 09:26
0
雪    币: 171
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
哈哈,今天来到看到这里都是一个 字开头
惟独我的是一个求助 哈哈
再看看当初的问题
哦 自己当时真的太懒了 调试一下看看不就ok了嘛、、

成长见证 !
2008-2-6 18:07
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
谢谢,也学习啦.
2008-2-22 23:54
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
学习一下
太深奥了,我也太小菜了@~
2008-3-1 22:11
0
雪    币: 210
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
真的是如楼主所说的会编译不过吗?
我在vc下没有问题
顺便再附上反汇编的代码,说明一下:
#include <stdio.h>
2:    #include <string.h>
3:    //char a[]="aaaabbbbccccddddeeeeffffgggghhhh";
4:            int main()
5:    {
0040D6F0   push        ebp
0040D6F1   mov         ebp,esp
0040D6F3   sub         esp,68h           ;debug模式下会预留出一部分的空间分配局部变量
0040D6F6   push        ebx              
0040D6F7   push        esi
0040D6F8   push        edi
0040D6F9   lea         edi,[ebp-68h]    ;默认会以cccc填充这一部分预留空间
0040D6FC   mov         ecx,1Ah
0040D701   mov         eax,0CCCCCCCCh
0040D706   rep stos    dword ptr [edi]
6:      char a[]="aaaabbbbccccddddeeeeffffgggghhhh";
0040D708   mov         ecx,8
0040D70D   mov         esi,offset string "aaaabbbbccccddddeeeeffffgggghhhh"... (00422fa8)
0040D712   lea         edi,[ebp-24h]                 ;此时还有预留空间哦。。。
0040D715   rep movs    dword ptr [edi],dword ptr [esi]
0040D717   movs        byte ptr [edi],byte ptr [esi]
7:      char b[4];
8:
9:      strcpy(b,a);
0040D718   lea         eax,[ebp-24h]
0040D71B   push        eax
0040D71C   lea         ecx,[ebp-28h]
0040D71F   push        ecx
0040D720   call        strcpy (00401060)
0040D725   add         esp,8
10:     printf("b:%s\na:%s",b,a);
0040D728   lea         edx,[ebp-24h]
0040D72B   push        edx
0040D72C   lea         eax,[ebp-28h]
0040D72F   push        eax
0040D730   push        offset string "b:%s\na:%s" (00422f9c)
0040D735   call        printf (0040d670)
0040D73A   add         esp,0Ch
11:
12:           return 0;
2008-3-25 23:22
0
雪    币: 315
活跃值: (23)
能力值: ( LV9,RANK:220 )
在线值:
发帖
回帖
粉丝
15
楼上的。lz的说的是数组是全局变量在编译时候发生错误。

  局部变量strcpy的时候拷贝至[ebp-28] 因为char b[4] ; 因为之前数组b是是4字节,所以此时拷贝过来的会覆盖 最后以一个00填充。  你可以看下ebp-8此时就是00。

全局变量拷贝的时候因为之前声明的数组4字节,那么往下就是存放的之前备份的ebp值。所以就直接覆盖之前备份的esp的值。故而发生错误。

其实遇到这种问题,脑海里应该勾勒出一副内存分配的图案。
2008-3-26 02:33
0
雪    币: 331
活跃值: (57)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
16
几位真是热心啊……感动
2008-3-29 13:59
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
谢谢LZ,学习ing
2008-5-6 13:04
0
雪    币: 231
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
现在还是看不懂。尽力去看吧。。。。。。。。。。。。。。希望能得到更多高手的指点。。。。。。。。谢谢
2008-5-30 18:43
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
W我觉得这还不错。。 我刚开始学。谢谢。拉楼主
2008-6-14 12:38
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
我不懂  后面瞎掺和了   呵呵
2008-6-14 13:31
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
哇,这个帖子都1年了,不知道还该不该顶了~又学到了好多东西。
尤其是4楼的Stack图真的是一目了然啊。
2008-7-14 20:05
0
雪    币: 1736
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
0040D6F9   lea         edi,[ebp-68h]    ;默认会以cccc填充这一部分预留空间
0040D6FC   mov         ecx,1Ah
0040D701   mov         eax,0CCCCCCCCh
0040D706   rep stos    dword ptr [edi]
6:      char a[]="aaaabbbbccccddddeeeeffffgggghhhh";
问题:用rep 重复 stos有什么意义吗?是不是把 eax的内容放入dword ptr [edi]的动作重复1AH次啊  谢谢!
2008-7-28 11:22
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
学习中。。。。

ing
2008-8-11 22:55
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
全局变量是再.data里面定义了。而函数里面的变量是再栈里面。这样导致栈溢出了。
2008-10-14 14:42
0
游客
登录 | 注册 方可回帖
返回
//