堆栈之直观体验

堆栈之直观体验(一)

jefby

学过很多方面编程方面的知识,但是却发现很多自己都不是特别明白,比如说过程的调用,堆栈的分配等,虚拟内存管理等等,虽然自己也看过不少这方面的书,研究过Intel汇编语言程序设计(大三的时候),看过深入理解LINUX内存管理,但却只是草草而过,只是知道大致过程,其中细节却总不那么清楚,今天有人问我关于缓冲区溢出攻击方面的知识,我以前做过,而且成功植入了代码,但是也许是因为时间的关系,我大部分已经忘了,然后开始给他讲有关过程调用的知识,讲着讲着自己都有点乱了……然后,开始反省,开始查找资料,开始看以前写的代码,但是发现自己写的都有点看不懂了(木有注释),无奈啊,只好上网查资料,各种纠结..现在将自己所悟所感整理下来备用。

首先,在Windows下默认的栈大小是1MB,页大小是4KB,怎么检测?本人在main函数里面直接定义了一个整形数组int a[1024*1024/4];因为int占四个字节,故定义的大小为1M/4,

编译,报错如下:


即栈溢出,点击打开项目属性,打开链接器,打开系统,


上网查资料搜到VS2008里面默认分配的堆栈大小为1MB,故你定义一个1MB的局部变量直接就给崩溃了。因为局部变量是在栈中分配的,而栈的默认大小是1MB,肯定不够用,故堆栈溢出。这是一个很容易忽略的问题,因为我们写着写着自己就忘了定义了多少个局部变量。或者函数嵌套调用了多少次。但是如果这样定义可不可以呢??


编译无错,为什么??因为new是在堆里面分配空间,不在栈中分配。而堆的大小与系统的位数相关,当前32位系统使用的比较多,故对大小为2^32/2,因为地址高位被系统保留。


这样分配可以吗?? 编译报错,提示信息是:

error C2148: 数组的总大小不得超过0x7fffffff 字节

warning C4307: “*”: 整型常量溢出

这是摘自一位网友的回复:

32位的处理器的地址长度是32,所以能表示大最大地址是 2^32指针表示的是地址,所以指针也是32位的,但是 windows对内存做了分区, 进程可用的内存地址范围是 0x00010000 ~ 0x7FFFFFFF故而如果你真的需要超过这个范围,那就只能把超过限制的数据放到硬盘上面了。需要的时候再载入内存


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值