Use-After-Free(UAF) 发生于指针指向的内存被 free() 释放后,该指针未被置为 NULL(形成野指针悬空指针),后续再次解引用该指针执行读写或虚函数表调用,造成任意代码执行。
一、悬空指针与函数指针劫持
c
typedef struct Object {
void (*print)(void);
} Object;
void normal_func() { puts("Normal Execution"); }
void shell_func() { puts("Executing Shell!"); }
void vulnerable() {
Object *obj = malloc(sizeof(Object));
obj->print = normal_func;
free(obj); // 释放后未清空 obj = NULL;
// 重新分配相同尺寸的堆块占位
char *fake = malloc(sizeof(Object));
*(void **)fake = shell_func;
// 触发 UAF 劫持控制流
obj->print();
}