UAF漏洞原理

<Excerpt in index | 首页摘要>

UAF漏洞原理

<The rest of contents | 余下全文>

概要

当应用程序调用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

参考资料:

参考资料(含利用方式)