05|Use-After-Free:钥匙还在你手里,柜子已经不是你的了

发布时间:2026/10/28 10:04:09

05|Use-After-Free:钥匙还在你手里,柜子已经不是你的了 Use-After-Free钥匙还在你手里柜子已经不是你的了UAFUse After Free翻译过来就是「释放后重用」。这个词听着抽象其实用一个场景就讲明白了——而且这个场景你八成真遇到过。先说这个场景去健身房办卡的时候管理员给你一个储物柜。1. 租柜子 → 管理员把 10 号柜给你钥匙在你手上 2. 放东西 → 你把衣服塞进 10 号柜 3. 退柜子 → 你跟前台说不用了系统里把 10 号柜标成空闲 4. 但你没还钥匙 → 你昨天下班顺手配了一把带着第二天另一个人来健身前台看 10 号柜空着就租给了他他把钱包手机放了进去。你拿着昨天配的那把钥匙开门了。抽屉里不是你的衣服是别人的钱包。这就是 UAF。柜子重新租出去了但钥匙没作废。对应到程序里储物柜 一块内存 钥匙 指向它的指针 退柜子 free() 配的钥匙 悬垂指针dangling pointer代码上就这么几行#include stdlib.h #include string.h #include stdio.h int main() { char *p malloc(100); strcpy(p, 正常的数据); free(p); /* 注意free 只告诉系统我不用了p 里存的地址一个字都没变 */ char *q malloc(100); strcpy(q, 别人的数据); printf(%s\n, p); /* 打印出来的是别人的数据 */ return 0; }跑一下就知道p和q大概率是同一个地址所以printf(p)打印的是q写进去的东西。这不是巧合。分配器为了效率永远优先复用刚释放的内存——你 free 完它立刻躺在回收站里等着被再分配。但关键不在复用了在被谁接手我之前一直以为 UAF 就是「用了已释放的内存」一句话讲完。后来才发现真正的分水岭是free 之后那块内存进了哪个 bin。因为它进了哪里你读出来的东西完全不一样进 tcache2.26尺寸 ≤ 0x4100x00 next ← 堆地址或者 NULL 0x08 key ← 2.29 起才有值是 tcache 结构地址进 fastbin尺寸 ≤ 0x800x00 fd ← 堆地址或者 NULL进 unsorted bin尺寸大于 fastbin/tcache 上限且后面没挨着 top0x00 fd ← main_arena 0x58/0x60是个 libc 地址 0x08 bk ← 同上所以块进 tcache / fastbin → 你泄到的是堆地址或者 NULL 块进 unsorted → 你泄到的是 libc 地址这就是「UAF 能用来泄 libc」的真正原因——不是 UAF 本身能泄什么是它 free 完之后恰好躺进了带 libc 指针的那个 bin。三种常见的来路第一种free 完忘了置空。free(p); /* 少了 p NULL; */最常见也最好查。第二种别名。char *a malloc(0x20); char *b a; free(a); strcpy(b, x); /* b 还在用 */这种最难查free(a)那行看起来毫无问题。第三种回调 / 闭包 / 观察者。cfg-on_event handler; /* 外部存了指针 */ config_free(cfg); /* cfg 释放了 */ /* 之后 handler 被触发 → UAF */真实软件里这种最多因为生命周期的管理权被分散到了两边。黑客拿它能干什么三个方向按门槛从低到高读——如果程序有show之类的功能能读已释放的块那就是一个泄露点。写——能往 freed chunk 里写就能改 next这就是 tcache poisoning / fastbin attack 的入口。改完再触发——不需要控制分配器只要程序后面还会用这块内存。比如typedef struct { char buf[0x18]; void (*fn)(void); } obj_t; obj_t *o malloc(sizeof(obj_t)); o-fn hello; free(o); /* 指针没清 */ o-fn pwned; /* UAF改写函数指针 */ o-fn(); /* 调用它 */这段能跑通输出pwned。没有任何堆布局可言就是纯改内存。一个容易忽略的细节进了 tcache 的块前 8 字节是 next、第 2 个 8 字节是 key。如果你想改的是别的字段比如上面那个fn在0x18那两个位置随便写都无所谓——不影响链也不影响你要改的地方。所以「UAF 能改什么」取决于两件事它进了哪个 bin以及你要改的字段在不在 bin 元数据的范围内。和 double free 别混UAF 是用一块已经不归你的内存double free 是再还一次。2.29 给 tcache 加的key检查只防 double freeif (__glibc_unlikely (e-key tcache)) /* 再遍历链表确认 → 报 free(): double free detected in tcache 2 */它完全防不住 UAF。所以 2.29 之后 UAF 照样能打只是 tcache 那条投毒的路变窄了。怎么修写代码的话就一条free(p); p NULL; /* 立刻作废这把钥匙 */后面再误用p程序会立刻崩在空指针上——崩溃比被利用好一百倍至少你知道出事了。语言层面的解法Java / Python / Go / C#GC 自动回收根本没有手动 free这一步Rust所有权 借用检查悬垂指针在编译期就过不去现代 Cstd::unique_ptr/std::shared_ptr生命周期结束自动释放并置空版本glibcUAF 能做什么≤ 2.25泄 libc、改 next、改结构体全都能2.26 ~ 2.28多了 tcache投毒更简单2.29能读能写但 double free 路径被 key 堵住2.32next 加密了改链要先泄堆地址2.34hook 被删落点得换_IO那条线变的是利用手法不是漏洞本身。UAF 一直都在。最后UAF 不是一个技巧是一个入口。它给你的只是「一块已经释放、但还能操作的内存」。至于拿它泄地址、改链、还是改个函数指针——取决于它此刻躺在哪个 bin 里。所以下次碰到 UAF先别急着写 payload先问一句这块内存现在归谁 相关阅读· 上一篇《04Large Bin Attack把一个堆地址写到任意位置》· 下一篇《06Chunk Extend改一个 size造出两块重叠内存》· 实战配套《18Use-After-Free 实战双档 bin 分离改函数指针》全部 exp 与 gdb 脚本GitHub 链接
延伸阅读

更多相关文章

2026/10/28 10:04:09

Mac Mouse Fix 实操指南:4 步跑通鼠标按键映射与平滑滚动

Mac Mouse Fix 实操指南:4 步跑通鼠标按键映射与平滑滚动 【免费下载链接】mac-mouse-fix Mac Mouse Fix - Make Your $10 Mouse Better Than an Apple Trackpad! 项目地址: https://gitcode.com/GitHub_Trending/ma/mac-mouse-fix Mac Mouse Fix 是一款 mac…

2026/10/28 9:59:09

智能服务机器人多模态交互技术解析与应用

1. 智能服务机器人多模态交互技术概述在商场导购、酒店接待、医院导诊等场景中,我们越来越频繁地遇到能够同时理解语音、手势甚至表情的智能服务机器人。这类机器人背后的核心技术,正是多模态智能交互系统。不同于传统单一人机交互方式,多模态…

2026/10/28 9:59:09

基于Kotlin和Ktor的本地优先AI Agent设计与实现

这个项目是从一个很具体的问题开始的:本地已经跑了一堆工具,有脚本、有数据库、有定时任务,但它们之间互不通信,每次想做点跨工具的操作都得手动连好几趟。后来接触到 AI Agent 的概念,第一反应是这正好能解决我的问题…

2026/10/28 11:15:06

Windows下机器学习训练进度表显示异常的排查与解决

1. 问题现象与初步排查最近在Windows环境下进行机器学习训练时,遇到了一个奇怪的问题:执行训练命令后,本应显示的实时训练进度表格没有正常呈现。这个问题看似简单,却可能由多种因素导致。作为一名长期在Windows平台进行深度学习开…

2026/10/28 11:15:06

TIC、EIC、轮廓图与棒状图:质谱数据交叉验证实战

做质谱分析这行,迟早会被四张图同时摆在面前:TIC、EIC、轮廓图、棒状图。新手看到的是四张画风不同的图,老手看到的是同一份原始信号的四种投影方式。投影方式不同,撒谎的方式也不同:TIC会用总信号掩盖共流出&#xff…

2026/10/28 11:15:06

新消费品牌势能增长研究:从品类创新到品牌资产与PMC模型

简介:面向品牌营销从业者、创业者与咨询研究人员,这份2024年中国新消费品牌势能创新增长研究白皮书围绕“创建强势品牌”展开,梳理新消费品牌在市场环境与消费习惯变化下的增长路径。资源包共1个PDF文件,约2.45MB,结构…

2026/10/28 11:15:06

跨地域访问慢怎么优化:CDN边缘缓存与回源配置实战

做运维和前端性能优化的朋友大概都遇到过这种场景:源站明明跑得好好的,本地测速一二百毫秒,结果一到异地用户那边,首屏时间直接飙到三四秒,图片一张张往下掉。我第一次被这个问题按在地上摩擦,是给一个内容…

2026/10/28 11:15:05

CDN跨地域加速实战:边缘缓存、回源与命中率优化

1. 先把“慢”拆开:跨地域访问到底卡在哪跨地域访问慢这件事,最怕的就是一句“上CDN吧”就完事。我在模拟项目A上踩过这个坑:站点A的源站放在一个机房,用户分布在相隔约两千公里的两地,上线第二天就有人反馈“页面转圈…

2026/10/28 11:10:04

8253+8255A+8259A交通灯控制器实操:真接线、真烧录、真亮灯

简介:本资源是面向高校微机原理与接口技术课程学习者的课程设计完整文档,聚焦基于经典可编程芯片8253、8255A和8259A实现十字路口交通灯自动控制系统的设计与实现。内容覆盖绪论、总体设计、硬件电路搭建(含三芯片功能详解与端口连接&#xf…

2026/10/27 14:24:03

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/27 9:34:54

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/28 3:32:29

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/28 0:02:13

Python股票自动交易系统源码解析:从行情获取到风控的完整链路

简介:这份资源是面向高校计算机、金融相关专业毕业设计场景的完整项目源码包,主题为基于Python的股票自动交易系统,适合需要完成毕设选题、课程设计或自学金融量化交易开发的学生与开发者参考。压缩包共收录687个文件,整体约14.93…

2026/10/28 0:02:13

视酷酷信IM源码部署指南:Java 17+MySQL 8.0.33实战配置

简介:这是一套2024年亲测可部署的视酷酷信IM即时通讯系统源码,面向具备Java、OC、C#及Vue开发能力的技术人员,解决私有化即时通讯平台快速搭建与二次定制需求,尤其适用于需集成商城、保障数据主权的中小型企业或独立开发者。资源共…

2026/10/28 0:02:13

Python爬取百度迁徙数据:接口解析、批量采集与避坑指南

简介:这份资源是一个用Python爬取百度迁徙数据的脚本压缩包,面向具备Python基础、希望入门网络爬虫与数据解析的开发者,解决按日期获取全国热门城市人口迁徙数据的问题。包内共1个文件,为单个py脚本,压缩包约1KB&#…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑