欢迎访问 内存溢出 —— 独立后端与系统工程技术博客

专注于分布式系统、Linux内核、数据库存储与后端工程实践

内存安全漏洞实战:堆利用 Use-After-Free (UAF) 原理剖析

发表于:|最后更新:|分类:二进制安全|阅读:7764 次

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();
}