能力值:
( LV12,RANK:530 )
|
-
-
2 楼
其实不是定义在MAIN里面没有溢出而是溢出到a自己里面去了,对于b来说已经是溢出了。不信你printf("%s", a);看。或者你把b的定义放a前面,程序照样溢出。
局部变量一般在栈内分配空间,全局变量一般在普通内存分配空间
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
哦 明白了
原来如此
非常感谢4nil指点
谢谢
总结:先定义的局部变量分配在栈的较高处,溢出时是向栈高处溢。
|
能力值:
( LV13,RANK:1250 )
|
-
-
4 楼
晕,没仔细看,该说的都让坐沙发的说了,那就看个图吧
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
[QUOTE=冲天剑;345620]晕,没仔细看,该说的都让坐沙发的说了,那就看个图吧
[/QUOTE]
哈 非常感谢冲天剑做的图片
当时因为问题解决了
所以一直没在关注帖子
今天看到您的图片印象更深了
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
高兴 高兴
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
谢谢,我也学到了
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
我也学习一下了
学习 & 支持
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
呵呵
看到又有人学到东东了
自己也特开心
看雪是个好地方
氛围好
牛人多且喜欢帮助别人
在这里我学到了好多
真心感谢所有帮助过我的朋友们
thx :)
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
如果溢出刚好覆盖 返回地址,而这个返回地址又是你特意安排的,
那么就是一个 最初等的 溢出 攻击!
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
哈哈,今天来到看到这里都是一个 精 字开头
惟独我的是一个求助 哈哈
再看看当初的问题
哦 自己当时真的太懒了 调试一下看看不就ok了嘛、、
成长见证 !
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
谢谢,也学习啦.
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
学习一下
太深奥了,我也太小菜了@~
|
能力值:
( 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;
|
能力值:
( LV9,RANK:220 )
|
-
-
15 楼
楼上的。lz的说的是数组是全局变量在编译时候发生错误。
局部变量strcpy的时候拷贝至[ebp-28] 因为char b[4] ; 因为之前数组b是是4字节,所以此时拷贝过来的会覆盖 最后以一个00填充。 你可以看下ebp-8此时就是00。
全局变量拷贝的时候因为之前声明的数组4字节,那么往下就是存放的之前备份的ebp值。所以就直接覆盖之前备份的esp的值。故而发生错误。
其实遇到这种问题,脑海里应该勾勒出一副内存分配的图案。
|
能力值:
( LV7,RANK:100 )
|
-
-
16 楼
几位真是热心啊……感动
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
谢谢LZ,学习ing
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
现在还是看不懂。尽力去看吧。。。。。。。。。。。。。。希望能得到更多高手的指点。。。。。。。。谢谢
|
能力值:
( LV2,RANK:10 )
|
-
-
19 楼
W我觉得这还不错。。 我刚开始学。谢谢。拉楼主
|
能力值:
( LV2,RANK:10 )
|
-
-
20 楼
我不懂 后面瞎掺和了 呵呵
|
能力值:
( LV2,RANK:10 )
|
-
-
21 楼
哇,这个帖子都1年了,不知道还该不该顶了~又学到了好多东西。
尤其是4楼的Stack图真的是一目了然啊。
|
能力值:
( 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次啊 谢谢!
|
能力值:
( LV2,RANK:10 )
|
-
-
23 楼
学习中。。。。
ing
|
能力值:
( LV2,RANK:10 )
|
-
-
24 楼
全局变量是再.data里面定义了。而函数里面的变量是再栈里面。这样导致栈溢出了。
|
|
|