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