| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2083 人关注过本帖, 2 人收藏
标题:缓冲区 溢出 -- 高手们,你们在哪里?
只看楼主 加入收藏
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
结帖率:100%
收藏(2)
 问题点数:0 回复次数:30 
缓冲区 溢出 -- 高手们,你们在哪里?
code如下。

程序代码:
#include<stdio.h>
void why_here(void) /*this function has never been called*/
{
    printf("why u here ?!\n");
    _exit(0);
}
int main(int argc,char * argv[])
{
    int buff[1];
    buff[2]=(int)why_here;
    return 0;
}


很明显, why_here function没有被调用过,但是输出结果是被调用的。

谁来解释下为毛被调用。

[ 本帖最后由 Devil_W 于 2011-6-5 20:24 编辑 ]
搜索更多相关主题的帖子: 缓冲区 
2011-06-05 19:11
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
看不懂!buff[2]能用吗?

My life is brilliant
2011-06-05 19:24
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:0 
我跟踪的结果是这个函数被调用了  但是却没有确定的返回地址

QQ截图未命名.rar (95.01 KB)
  也就是说主函数竟然也不知道它在哪里调用了这个函数

我就更不知道了


                                         
===========深入<----------------->浅出============
2011-06-05 19:35
hjywyj
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:3
帖 子:1114
专家分:2611
注 册:2010-4-14
收藏
得分:0 
此程序在VC中没有报错,函数也的确被调用,但是产生一个“程序访问为例”

[ 本帖最后由 hjywyj 于 2011-6-5 19:41 编辑 ]
2011-06-05 19:39
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
2b

我就是真命天子,顺我者生,逆我者死!
2011-06-05 21:04
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
以下是引用BlueGuy在2011-6-5 21:04:37的发言:

2b


蠢货。
2011-06-05 21:05
qldxsun
Rank: 4
等 级:业余侠客
帖 子:125
专家分:240
注 册:2011-6-4
收藏
得分:0 
不一定说的对。。。看下面代码
#include<stdio.h>
#include<stdlib.h>
void why_here(void) /*this function has never been called*/
{
    printf("why u here ?!\n");
    exit(0);如果去掉这句,程序将无法结束
}
int main(int argc,char * argv[])
{
    int buff[1];
    buff[2]=(int)why_here;//不知道为什么你要把一个空类型的函数强制转为int的。。。
    printf("%d",buff[2]);这句,说明buff【2】输出的是随机的,即buff【2】这种写法有问题。这个大家应该都知道,不知道为什么要这样写
    printf("1");
    return 0;printf("1");粉色字单独使用,位置不同,输出不同,可以说名,why_here是在return 0后面执行的。
}
而在单步跟踪时,直接就跳到了main函数的结束位置
我认为是你的main函数用的有问题。。。我还在用vc++6.0这种int的main不会用。。。
这段代码“错误”好多,出现非常规的问题好像正常。。。buff是干什么用的能解释一下吗?
2011-06-05 21:16
我菜119
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:938
专家分:1756
注 册:2009-10-17
收藏
得分:0 
楼主出的这个问题是恰到好处的改写了main函数的返回地址,我们都应该知道main是被操作系统调用的,当main调用完毕之后返回一个地址,并且把这个地址返回给它的调用者也就是操作系统!

函数的调用实现是通过一个叫做帧栈指针(或者叫做帧指针)的移动来实现一步一步运行的,而这个帧栈指针式保存在寄存器%ebp中,当一个函数调用完毕之后需要将这个帧栈指针存储在寄存器%esp中,然后释放帧栈空间。当main函数调用完毕之后将权限还给了操作系统,然后操作系统进行一些后续的处理,而这个处理也是通过移动%esp的指针来实现的,但是此时寄存器%esp中存储的值(地址)变为了why_here该函数的地址,这样就执行了why_here函数!!!


也就是说buff[2] = (int)why_here;改变了main函数的返回地址!

这就是我的个人理解,不知道对否!!只是一个菜鸟!
收到的鲜花
  • Devil_W2011-06-05 22:26 送鲜花  3朵   附言:这个 是我想要的答案。

愿用余生致力编程
2011-06-05 22:22
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
进入main 函数后的栈内容下:
[ eip ][ ebp ][ buff[0] ]
高地址<---- 低地址
以上3 个存储单元中eip 为main 函数的返回地址,buff[0]单元就是buff 申明的一个int
空间。程序中定义了int buff[1],那么只有对buff[0]的操作才是合理的(我们只申请
了一个int 空间),而我们的buff[2]=why_here 操作超出了buff 的空间,这个操作越界了,
也就是溢出了。溢出的后果是: 对buff[2]赋值其实就是覆盖了栈中的eip 存放单元的数
据,将main 函数的返回地址改为了why_here 函数的入口地址。这样main 函数结束后返回
的时候将这个地址作为了返回地址而加以运行。
2011-06-05 22:28
我菜119
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:938
专家分:1756
注 册:2009-10-17
收藏
得分:0 
回复 9楼 Devil_W
狠人呀!


愿用余生致力编程
2011-06-05 22:30
快速回复:缓冲区 溢出 -- 高手们,你们在哪里?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027950 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved