UAF漏洞原理
概要
当应用程序调用free()释放内存时,如果内存块小于256kb,dlmalloc并不马上将内存块释放回内存,而是将内存块标记为空闲状态。这么做的原因有两个:一是内存块不一定能马上释放会内核(比如内存块不是位于堆顶端),二是供应用程序下次申请内存使用(这是主要原因)。当dlmalloc中空闲内存量达到一定值时dlmalloc才将空闲内存释放会内核。如果应用程序申请的内存大于256kb,dlmalloc调用mmap()向内核申请一块内存,返回返还给应用程序使用。如果应用程序释放的内存大于256kb,dlmalloc马上调用munmap()释放内存。dlmalloc不会缓存大于256kb的内存块,因为这样的内存块太大了,最好不要长期占用这么大的内存资源。
实例
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| #include <stdio.h> #include <stdlib.h> void main(void){ int* p1; int* p2; p1 = malloc(sizeof(int)); *p1 = 100; printf("p1: \t address:%X \t value=%d\n", (int)p1, *p1); free(p1);//释放内存
//接着申请同样大小的内存空间 p2 = malloc(sizeof(int)); *p2 = 50; printf("p2: \t address:%X \t value=%d\n", (int)p2, *p2); printf("p1: \t address:%X \t value=%d\n", (int)p1, *p1); free(p2); }
|
运行
1 2 3
| p1: address:7115260 value=100 p2: address:7115260 value=50 p1: address:7115260 value=50
|
参考资料:
参考资料(含利用方式)