测试malloc申请的内存,越界多少会coredumped

目的:测试malloc申请的内存,越界多少会coredumped

测试方法

申请不同大小的内存空间,然后不断的越界访问,直到发生coredumped,记录越界时的字节和内存地址。

环境:10.0.0.131

Size

首地址

core dumped时的访问的越界字节数

core dumped时的地址的前一个地址

两个地址之间的内存大小

1

0x00717010

135151

0x00737fff

0x20FF0

1

0x01a7f010

135151

0x01a9ffff

0x20FF0

1

0x01270010

135151

0x01290fff

0x20FF0

5000

0x00a22010

134248

0x00a43fff

0x21FF0

5000

0x00b06010

134248

0x00b27fff

0x21FF0

5000

0x0255b010

134248

0x0257cfff

0x21FF0

5000000

0x640c0010

21680

0x64589fff

0x4C9FF0

5000000

0x371d4010

21680

0x3769dfff

0x4C9FF0

5000000

0x1e3c7010

21680

0x1e890fff

0x4C9FF0

10000000

0xc6ac9010

22896

0xc7457fff

0x98EFF0

10000000

0x26980010

22896

0x2730efff

0x98EFF0

10000000

0x280a0010

22896

0x28a2efff

0x98EFF0

1、首先分析size为1和5000的情况,使用首地址除以一页(该系统一页为4096字节)的大小,结果如下:

0x00717010 ÷ 4096 = 1815…16

0x01a7f010 ÷ 4096 = 6783…16

0x01270010 ÷ 4096 = 4720…16

0x00a22010 ÷ 4096 = 2594…16

0x00b06010 ÷ 4096 = 2822…16

0x0255b010 ÷ 4096 = 9563…16    之后的首地址也是余数为16.

 

malloc分配内存块时,会额外分配几个字节用来存放记录这块内存大小的整数值。该整数位于内存块的起始处,用来提供给free函数使用。所以首先可以得知,该系统的这块内存为16字节。

2、分析size为1和5000的情况时,malloc申请内存的首地址和发生coredumped地址,这两个地址之间的内存大小

         0x20FF0 ÷ 4096 = 32…4080

         0x21FF0 ÷ 4096 = 33…4080

        

可以看到,余数为4080,与4096正好差了一个第一步分析的16,所以实际上这里的4080加上首地址之前多出来的16字节,正好为一页。所以当size为1时,实际上与coredumped的地址与malloc的地址差正好是33个页大小,而size为5000时,该差为34个页大小。根据内存是按页分配的,可以得知发送core dumped是发生在内存越界超过32页时产生的。

3、第二步分析了当size为1和5000时的情况,即malloc分配小内存,因为malloc分配大内存时使用的是mmap的匿名映射实现的,所以需要这一步分析分配大内存时的情况。首先,malloc返回值的除以一页的大小的余数跟之前是相同的,都是16,即当使用mmap匿名映射实现malloc时,前面也是保留了16个字节。接下来分析内存大小。

         5000000 ÷ 4096 = 1220…2880

         10000000 ÷ 4096 = 2441…1664

首先可以确定,size为5000000时页大小为1221,10000000时页大小为2442。再看malloc申请内存的首地址和发生coredumped地址,这两个地址之间的内存大小

         0x4C9FF0 ÷ 4096 = 1225…4080

         0x98EFF0 ÷ 4096 = 2446…4080

即分配大小为1221个页大小时,在超过1226个页大小时发生coredumped,所以实际上越界内存大小为5个页。同样分配内存大小为2442个页大小时,在超过2447个页大小时发生coredumped,所以实际上越界内存也是5个页。

 

总结:当分配小内存时,越界内存超过32个页大小会发生coredumped,而分配大内存,即需要使用mmap的匿名映射实现malloc时,越界内存超过5个页大小就会发生coredumped

 

 

目的:测试使用malloc申请内存,使用越界到其他已经申请的内存时会不会发生coredumped

测试方法

申请两块内存空间,然后不断的对低地址的内存块越界访问,直到发生coredumped,记录越界时的字节和内存地址。

环境:10.0.0.131

Size

第一块内存首地址

第二块内存首地址

两块内存的距离

core dumped时的地址的前一个地址

发生coredumped时的地址和首地址之间的内存大小

1

0x009f6010

0x009f6030

32

0x00a16fff

0x20ff0

1

0x02168010

0x02168030

32

0x02188fff

0x20ff0

5000

0x010ba010

0x010bb3a0

5008

0x010dbfff

0x21ff0

5000

0x008b0010

0x008b13a0

5008

0x008d1fff

0x21ff0

5000000

0xfc7b7010

0xfc2f2010

5001216

0xfcc80fff

0x98eff0

5000000

0xaa009010

0xa9b44010

5001216

0xaa4d2fff

0x98eff0

10000000

0x2e4af010

0x2db25010

10002432

0x2ee3dfff

0x1318ff0

10000000

0xbc5a9010

0xbbc1f010

10002432

0xbcf37fff

0x1318ff0

  1. 根据size为1和5000的数据,可以看到,即使访问第一块内存时越界,达到了第二块内存,并不会发生coredumped,仍然与第一张表格的情况相同,在越界超过32个页大小时,发生coredumped。
  2. 根据size为5000000和10000000的数据,可以看到当通过mmap匿名映射实现的malloc,申请到的内存时递减排序,并且是连续排序的。访问低地址块时,越界到另一个内存块时,不仅不会coredumped,还会扩大coredumped发生时访问的地址空间。相比于第一个表,最后一列内存空间正好大了一个两块内存的间距。也就是说在访问内存时,并不会因为是两块内存就报错,对系统来说,两次申请的内存都是有效的,无论是通过两次malloc的返回的首地址中的哪一个,都可以正常访问,系统默认都是有效的。

结论:当有多块内存时,并不会因为使用一块内存时越界到另一块内存就发生coredumped,而是可以正常访问。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值