免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3005 | 回复: 2
打印 上一主题 下一主题

创建进程的过程中是否会发生用户堆栈溢出? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-09-28 11:38 |只看该作者 |倒序浏览
本帖最后由 s200661524 于 2011-09-28 12:05 编辑

在创建进程时候,是否有用户堆栈溢出的可能呢?书上说创建进程的时候子进程会与父进程共享内存空间,并根据参数把共享内存标记为只读直到写入操作引起写时复制,那么如果写一个恶意程序,不断的在子进程中多次嵌套调用几个函数后再次在最里面的一层函数中创建子进程,以次来消耗进程的堆栈空间,那么只要子进程不发生excv调用,那么SP不会被修改,只会在父进程的基础上向下长,这样最后会不会发生堆栈溢出呢?linux内核是否有这方面的预防代码呢?有这方面的资料吗?呵呵纯属个人胡乱猜想,对源代码也是半生不熟的,如果想法有误轻拍。

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
2 [报告]
发表于 2011-09-28 14:54 |只看该作者
回复 1# s200661524
多层函数嵌套的应用层代码堆栈溢出是完全可能发生的,但是这种溢出只是影响用户态,不会影响内核态的代码。
内核态进行fork的时候,做的第一件事情就是dup_task_struct,从而为子进程创建新的栈,也就是说父子进程的栈是不会共用的。

论坛徽章:
0
3 [报告]
发表于 2011-09-29 10:25 |只看该作者
本帖最后由 s200661524 于 2011-09-29 11:42 编辑

回复 2# 瀚海书香
堆栈的实际物理地址是不会共用,但是虚拟地址都是0-3G,以下说的都是虚拟地址,新进程的用户态堆栈初试指针位置(虚拟地址)在哪儿呢?我的理解是新进程在创建的时候会继承父进程的运行环境,包括切换前的一些寄存器值,当然包括堆栈指针位置(虚拟地址),只是R0为0以标识为子进程返回,这样只要新进程不使用exec系统调用去执行另外一个新程序,那么新进程SP位置(虚拟地址)和父进程SP的位置是否一样呢?(虚拟地址)我的想法是一样的,因为子进程会继承父进程的一些环境,只是在写入操作时发生缺页中断,此后相同的虚拟地址(比如SP指针位置)被映射到不同的物理地址上去。那么如果在进程中嵌套调用几个程序(这写程序可能是是毫无用处的),SP(虚拟地址)就会减小,在嵌套的程序里面再去创建新进程,那新进程的SP(虚拟地址)又会是前一个进程的复制(指向新进程私有虚拟地址),如此以来每次创建一个新进程SP(虚拟地址)会在父进程的SP(虚拟地址)基础上向下生长(在自己的私有空间里面改变,不会影响到父进程)这样下去新进程的SP(虚拟地址)会不会触底发生溢出呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP