从CTF赛题babyheap_0ctf_2017剖析堆溢出与Unlink攻击原理

超详解“二分法查找”,一看就会! 二分法往简单明了就三个步骤:1. 对半折 2. 查找中间值(mid) 3.缩小区间(看与mid的关系再决定,往左+1或者往 右-1) 阅读详情

1. 从一道经典赛题看堆溢出漏洞的攻防本质

如果你刚开始接触CTF中的PWN方向,尤其是堆利用,那么 babyheap_0ctf_2017 这道题绝对是一个绕不开的里程碑。它不像一些简单的栈溢出题目那样直白,也不涉及过于复杂的堆风水技巧,而是恰到好处地展示了堆溢出漏洞最核心的破坏力—— 通过改写堆块的管理元数据,最终劫持程序控制流 。这道题之所以经典,是因为它剥离了繁杂的干扰,将攻击者的目光精准地引向了 malloc 和 free 这两个最基础函数背后的复杂世界。我们今天要做的,就是亲手揭开这层帷幕,看看一个看似简单的“越界写”漏洞,如何一步步演变成夺取shell的利器。

很多新手在初次面对堆题目时会有一种无力感,面对一堆 malloc 和 free 调用不知从何下手。这很正常,因为堆利用的本质是对 glibc 内存管理器的“规则”进行攻击。你需要先理解它的规则(如 ptmalloc2 的bin机制、chunk结构),然后找到程序违反规则的地方(漏洞点),最后精心构造输入,让程序在遵循错误数据时,帮你完成攻击。 babyheap_0ctf_2017 就是一个完美的教学样本:程序逻辑清晰,漏洞点明显,利用链完整。通过它,你将掌握堆利用中最基础也最关键的技巧之一—— unlink 攻击。我会带你从零开始,分析程序、定位漏洞、设计利用思路,并给出每一行EXP代码的详细解释,确保你能看懂、能复现、更能理解背后的原理。

2. 程序逻辑分析与漏洞定位

首先,我们需要知道程序在做什么。通常,我们会用 checksec 查看保护机制,用反汇编工具(如 IDA Pro 或 Ghidra )分析逻辑。

2.1 安全机制与功能菜单

用 checksec 检查,大概率会发现只开启了 NX (栈不可执行)和 ASLR (地址空间布局随机化)。没有 Canary 和 PIE ,这意味着栈溢出不好利用,但堆上的地址(如 libc 的基址)是随机的,我们需要想办法泄露。

用 IDA 打开程序,可以看到一个典型的菜单式逻辑:

1. Allocate
2. Fill
3. Free
4. Dump
5. Exit

这对应一个简单的堆管理器:

  • Allocate : 调用 malloc 申请指定大小的堆块。程序会用一个全局数组记录每个堆块的指针和大小,索引从0开始。
  • Fill : 根据索引,向已分配的堆块中填充数据。 这里就是漏洞所在 。
  • Free : 根据索引,调用 free 释放堆块,并将指针置零,防止了 Use-After-Free 。
  • Dump : 根据索引,打印堆块中的内容。这是我们 泄露地址信息 的关键。

程序的漏洞点非常清晰:在 Fill 函数中,它读取用户输入的长度,然后向对应堆块写入数据, 但没有检查输入长度是否小于或等于堆块当初申请的大小 。这就导致了堆溢出。

2.2 关键数据结构与堆布局规划

为了利用,我们必须理解程序如何管理堆块。通常,它会有一个结构体数组,比如:

struct heap_chunk {
    char *ptr;
    size_t size;
} chunks[16];

Allocate 时, ptr = malloc(size) ,并记录 size 。 Fill 时,使用 read(0, chunks[idx].ptr, user_input_size) ,这里的 user_input_size 是我们可控的,可以大于 chunks[idx].size 。

假设我们申请了三个堆块:

  • Chunk 0: 大小 0x80
  • Chunk 1: 大小 0x80
  • Chunk 2: 大小 0x80

在内存中,它们可能是连续排列的(取决于当时堆的布局)。我们的目标是利用Chunk 0的溢出,去覆盖与Chunk 1相关的关键数据。

注意 :现代 glibc 的 malloc 实现中, size 字段位于chunk头,而用户使用的指针 ptr 指向的是chunk的数据区。一个 malloc(0x80) 得到的chunk,其实际大小(含元数据)是 0x90 (0x80用户区 + 0x10 chunk头)。chunk头包含前一个chunk的大小( prev_size )和当前chunk的大小及标志位( size )。 free 操作会检查这些元数据的合法性。

3. 利用思路:Unlink攻击详解

面对堆溢出,一个经典的利用手法是 unlink 。 unlink 是 glibc 在合并空闲堆块时的一个宏操作,它会将某个空闲块从其所在的双向链表(如 small bin 或 unsorted bin )中摘除。如果我们可以伪造一个空闲块,并诱使 glibc 对其执行 unlink ,就能实现一次任意地址写。

3.1 Unlink宏的传统利用原理

在旧版本 glibc (约2.26之前)中, unlink 宏类似如下:

#define unlink(P, BK, FD) {
    FD = P->fd;
    BK = P->bk;
    FD->bk = BK; // *(P->fd + 12) = P->bk
    BK->fd = FD; // *(P->bk + 8) = P->fd
}

其中 P 指向要脱链的假chunk。如果我们能控制 P->fd 和 P->bk 的值,就能向 *(P->fd + 12) 和 *(P->bk + 8) 写入任意数据。这被称为“ unlink 写”。

攻击通常分几步:

  1. 布局堆块 :申请多个相邻堆块(如A, B, C)。
  2. 溢出伪造 :利用A的溢出,覆盖B的chunk头,将B伪造成一个“已释放”状态的空闲块。同时,在B的用户数据区(即我们可控的区域)提前布置好伪造的 fd 和
LangChain与SkillLite集成:AI Agent安全沙箱实践 在AI与自动化技术领域,安全沙箱是实现可信计算的核心机制。其原理是通过资源隔离与权限控制,构建受限的执行环境。技术价值在于平衡功能开放性与系统安全性,尤其适用于处理用户提交的非受信代码或敏感数据。典型应用场景包括AI插件系统、在线代码评测平台等。本文以LangChain框架与SkillLite沙箱的深度集成为例,详解如何通过命名空间隔离、cgroups限制等机制,为AI Agent赋予安全执行动态技能的能力。其中涉及的关键技术点包括Python运行时隔离、动态资源配额管理,以及如何防范Shell注入等常见攻 阅读详情

相关推荐

法兰克仿真软件FANUC CNC Guide v25.0 安装教程及中文设置

下载地址在文末。我们公司用新到一批FANUC 系统的设备,为方便使用就装了一个 FANUC 数控系统仿真软件FANUC CNC Guide v25.0 ,还是最新版不是市面上流传的老版本。模拟学习一下。

hakesashou的博客 1万+

在Windows 11上用VirtualBox搞定WRF-Hydro 5.2.0:一个水文模型小白的Ubuntu 22.04虚拟机避坑实录

本文详细记录了在Windows 11上使用VirtualBox和Ubuntu 22.04虚拟机成功编译安装WRF-Hydro 5.2.0水文模型的全过程。从虚拟环境配置、依赖库安装到环境变量设置,作者分享了针对Linux新手的实用避坑技巧和关键命令,帮助科研人员高效完成水文模型的环境搭建。

weixin_30733003的博客 352

编程_三大编程思想:POP、OOP、AOP

简单介绍POP、OOP、AOP三大编程思想的区别和优缺点~

mikimo的博客 3894

别再手动写JSON了!用Node-RED OPC UA节点5分钟搞定楼宇温湿度数据采集

本文介绍了如何利用Node-RED和OPC UA节点快速实现楼宇温湿度数据的自动化采集与JSON格式转换。通过可视化工具Node-RED,开发者无需编写复杂代码,5分钟内即可完成从传感器到数据输出的全流程配置,大幅提升智慧楼宇和工业物联网项目的实施效率。

weixin_30368405的博客 431

ABAP内表数据导出Excel:OLE、ALV与GUI_DOWNLOAD方案全解析

在企业级应用开发中,数据导出是连接后台系统与前端业务分析的关键桥梁。其核心原理是将结构化数据转换为通用文件格式,以实现跨平台的数据交换与可视化。从技术价值看,一个健壮的导出功能能显著提升数据处理效率,减少人工干预,是衡量系统实用性的重要指标。常见的应用场景包括报表生成、数据交接和临时数据提取。本文聚焦于SAP ABAP开发领域,深入探讨如何将内表数据高效、稳定地导出至Excel,涵盖了OLE自动化、ALV标准导出以及基于CL_GUI_FRONTEND_SERVICES与GUI_DOWNLOAD的通用方案,并

weixin_32715349的博客 317

APP抓包-代理转发绕过反代理+Xposed绕过证书校验

而这里的牛牛不止设置了反代理还设置了证书校验,一闪而过的三个数据包就是在校验证书。而proxifier工具的转发机制获取的是网络接口出口数据,相当于是在网络接口设代理。这个时候就可以在夜神打开牛牛开始抓包了,打开牛牛可以看到proxifier有夜神流量通过。关闭代理之后牛牛就正常了,可恶的牛牛啊,这样我没办法抓包啊,怎么办啊。模拟器开启代理,burp开启监听。打开牛牛app,牛牛不在报错。牛牛app检测的是系统代理,也就是在模拟器或手机上设置的代理。再在浏览器下载两个模块,在夜神安装,用来屏蔽证书校验。

xiaoheizi的博客 7530

(OpenCV)图像目标尺寸检测

  本文翻译自pyimagesearch技术博客上的一篇文章,《Measuring size of objects in an image with OpenCV》,原文作者:Adrian Rosebrock 。 https://www.pyimagesearch.com/2016/03/28/measuring-size-of-objects-in-an-image-with-opencv...

明柳梦少的博客 7万+

ESP32 WIFI 智能巡线小车设计与实现(四足 / 四轮通用)

本文设计的 ESP32 WIFI 智能巡线小车,硬件模块化、软件轻量化,兼容四足与四轮两种结构,实现了自动巡线与 WIFI 远程控制双功能。系统成本低、易上手,适合嵌入式初学者学习 WIFI 通信、传感器应用、运动控制等核心知识点,也可在此基础上扩展蓝牙控制、避障、视觉识别等功能。

weixin_42300449的博客 151

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

上一篇: AI工作流与关键词采集API在亚马逊SEO中的实践
下一篇: Flutter+OpenHarmony实现高性能分布式步骤条
blackproof
博客等级 码龄17年 12粉丝 543原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值