| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2083 人关注过本帖, 2 人收藏
标题:缓冲区 溢出 -- 高手们,你们在哪里?
只看楼主 加入收藏
不分手的恋爱
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2011-6-5
收藏
得分:0 
楼主又来耍函数调用里面栈被破坏,没意思
2011-06-05 22:31
我菜119
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:938
专家分:1756
注 册:2009-10-17
收藏
得分:0 
回复 11楼 不分手的恋爱
哈哈

[ 本帖最后由 我菜119 于 2011-6-5 22:38 编辑 ]

愿用余生致力编程
2011-06-05 22:33
不分手的恋爱
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2011-6-5
收藏
得分:0 
以下是引用我菜119在2011-6-5 22:22:51的发言:

楼主出的这个问题是恰到好处的改写了main函数的返回地址,我们都应该知道main是被操作系统调用的,当main调用完毕之后返回一个地址,并且把这个地址返回给它的调用者也就是操作系统!

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


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

这就是我的个人理解,不知道对否!!只是一个菜鸟!
楼主,在耍帅,没有什么好耍的,就连我没学过多少c语言都还能知道,栈被你改写了
2011-06-05 23:06
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
以下是引用不分手的恋爱在2011-6-5 23:06:57的发言:

楼主,在耍帅,没有什么好耍的,就连我没学过多少c语言都还能知道,栈被你改写了



程序代码:
#include <stdio.h>
#include <stdlib.h>
int add(int x,int y)
{
    return x+y;
}
int mul(int x,int y)
{
    return x*y;
}
typedef int (* PF)(int,int);
int main(int argc,char *argv[])
{
    PF pf; 
    char buff[4]; 
    int t=0;
    pf=(PF) &mul; 
    printf("addr add fun : %p\n",&add);
    printf("addr mul fun : %p\n",&mul);
    printf("pf=0x%x\n",pf);
    if(argc >1)
    {
        memcpy(buff,argv[1],8);
    }
    printf("now pf=0x%x\n",pf);
    t=pf(4,8);
    printf("4*8=%i\n",t);
}


你来分析下,我这段代码是怎么修改stack的.
2011-06-05 23:27
gupiao175
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:40
帖 子:1787
专家分:7527
注 册:2007-6-27
收藏
得分:0 
在TC上,楼主1#的代码会出现弹出CPU无效指令错误!

但是其他高级些的编译器,只是报一个警告级错误,并不会导致程序崩溃!

Q:1428196631,百度:开发地 即可找到我,有事请留言!
2011-06-06 00:14
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
程序代码:
#include <stdio.h>

void test() {
    int n;
    *(&n + 10) = 2;
}

int main(void) {
    int n = 1;
    test();
    printf("%d\n", n);
    return 0;
}
图片附件: 游客没有浏览图片的权限,请 登录注册



My life is brilliant
2011-06-06 00:58
cacker
该用户已被删除
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2011-06-06 02:00
cacker
该用户已被删除
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2011-06-06 02:02
cacker
该用户已被删除
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2011-06-06 02:07
liangjinchao
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:376
专家分:697
注 册:2010-11-8
收藏
得分:0 
回复 8楼 我菜119
请问这设计到什么方面的知识?看不懂啊!

因为有了因为,所以有了所以,既然已成既然,何必再说何必
2011-06-06 19:53
快速回复:缓冲区 溢出 -- 高手们,你们在哪里?
数据加载中...
 
   



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

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