发布时间:2026/6/29 16:00:26
【学习记录】Week2(二):Libc 泄露艺术——版本识别与 Offset 精准计算实操
写在前面在开启了 NX 和 ASLR 的现代 Linux 环境下栈上的 shellcode 没法执行libc 的加载基址每次也在变。我们想调用system(/bin/sh)却不知道system的真实内存地址在哪。这时候一场名为“信息泄露”的谍战就此打响。本文将手把手教你如何通过泄露出的一个地址反查 libc 版本并精准计算出我们需要的所有偏移量。 目录核心原理为什么需要算 Offset第一步泄露 libc 函数的真实地址第二步libc 版本识别特征匹配法第三步Offset 精准计算实操Pwntools 自动化实战从泄露到计算1. 核心原理为什么需要算 OffsetASLR地址空间布局随机化让 libc 每次加载的基址都不一样。但是在一个确定的 libc 文件中函数与函数之间、函数与字符串之间的相对偏移量是永远不变的。这就好比一列火车火车的起始站libc 基址每次变但“1号车厢”到“餐车”的距离是固定的。如果我们能知道“餐车”现在的绝对位置就能反推出火车的起始站位置进而算出“卧铺车厢”system函数的绝对位置。核心公式libc 基址 泄露出的函数真实地址 - 该函数在 libc 中的偏移目标函数真实地址 libc 基址 目标函数在 libc 中的偏移2. 第一步泄露 libc 函数的真实地址怎么泄露最经典的方法是利用栈溢出调用putsplt把putsgot里面存放的真实地址打印出来。假设性场景我们通过构造 Payload让程序执行了puts(putsgot)。由于puts已经被调用过懒绑定已触发此时putsgot里存放的就是puts在 libc 中的真实内存地址。模拟 Pwntools 接收输出# 假设我们接收到了泄露出来的 4 字节或 6 字节内存数据 leaked_bytes p.recvline().strip() # 将其解包为整数 puts_real_addr u64(leaked_bytes.ljust(8, b\x00)) print(f泄露出的 puts 真实地址: {hex(puts_real_addr)})模拟终端输出泄露出的 puts 真实地址: 0x7ffff7a649c03. 第二步libc 版本识别特征匹配法拿到0x7ffff7a649c0后我们面临一个尴尬的问题服务器上的 libc 是什么版本不知道版本就查不到偏移。识别原理虽然 ASLR 随机化了高位地址但最低的 12 位即十六进制的后 3 位是页内偏移不受 ASLR 影响永远固定因此0x7ffff7a649c0的特征就是末尾的9c0。识别方法在线网站查询打开著名的 libc.rip 或 libc.blukat.me。在puts选项卡中输入9c0点击搜索。LibcSearcher 工具在本地使用 Python 库自动查询。假设性说明模拟 LibcSearcher 输出假设我们在本地使用 LibcSearcher 查询终端输出如下[*] Searching libc database for puts offset: 0x9c0 [] Multiple libc found: 1. libc6_2.23-0ubuntu11.3_amd64 (id: 1) 2. libc6_2.27-3ubuntu1.4_amd64 (id: 2)*(注有时会有多个匹配结果因为不同版本的 libc 可能存在偏移相同的函数。通常需要泄露两个函数或者结合题目环境如 Ubuntu 版本来确定。假设我们确定是 Ubuntu 16.04 的 libc 2.23)*。4. 第三步Offset 精准计算实操确定了 libc 版本为libc6_2.23-0ubuntu11.3_amd64后我们可以通过readelf -s或 pwntools 查到关键偏移。模拟查询结果puts偏移0x6f690system偏移0x45390字符串/bin/sh偏移0x18cd57开始套用公式计算计算 libc 基址libc_base 泄露的 puts 地址 - puts 偏移libc_base 0x7ffff7a649c0 - 0x6f690 0x7ffff79f5330(注意正常算出来的基址末尾必定是000因为内存是以页为单位加载的。这里为了演示连贯性假设我们查询的偏移是0x6f6a0算出来的基址应为0x7ffff79f5000。大家实际计算时如果基址不以 000 结尾说明匹配错了。)修正正确计算libc_base 0x7ffff7a649c0 - 0x6f9c0 0x7ffff79f5000计算 system 真实地址system_addr libc_base system 偏移system_addr 0x7ffff79f5000 0x45390 0x7ffff7a3a390计算 /bin/sh 真实地址bin_sh_addr libc_base /bin/sh 偏移bin_sh_addr 0x7ffff79f5000 0x18cd57 0x7ffff7b81d57至此我们拿到了system和/bin/sh的绝对地址接下来就可以构造 ROP 链去拿 Shell 了5. Pwntools 自动化实战从泄露到计算在实际打 PWN 时我们绝不会用计算器去算而是全交给 Pwntools 处理。下面是一段标准的泄露与计算代码模板from pwn import * from LibcSearcher import * # 1. 建立连接 p process(./vuln) elf ELF(./vuln) # 2. 泄露 puts 真实地址 (假设已经构造好泄露的 ROP 链) # payload bA*offset p64(pop_rdi) p64(elf.got[puts]) p64(elf.plt[puts]) p64(main_addr) # p.sendline(payload) # 3. 接收泄露的地址 leaked_puts u64(p.recvline().strip().ljust(8, b\x00)) log.success(fLeaked puts address: {hex(leaked_puts)}) # 4. 使用 LibcSearcher 自动计算 libc LibcSearcher(puts, leaked_puts) libc_base leaked_puts - libc.offset(puts) log.success(fLibc base address: {hex(libc_base)}) # 5. 推导 system 和 /bin/sh 的地址 system_addr libc_base libc.offset(system) bin_sh_addr libc_base libc.offset(/bin/sh) log.success(fSystem address: {hex(system_addr)}) log.success(f/bin/sh address: {hex(bin_sh_addr)}) # 6. 构造最终的 ret2libc payload 并发送...模拟脚本运行输出[] Leaked puts address: 0x7ffff7a649c0 [] Libc base address: 0x7ffff79f5000 [] System address: 0x7ffff7a3a390 [] /bin/sh address: 0x7ffff7b81d576. 总结泄露与计算偏移是ret2libc攻击的灵魂。核心记住三步泄露通过 GOT 表拿到已解析函数的真实地址。识别利用地址后 3 位特征反查 libc 版本。计算算出基址注意末尾必为000验证再加偏移得到目标地址。下一部分我们将重点梳理 Glibc 从 2.23 到 2.35 的演进看看高版本 libc 到底给我们挖了哪些坑。如果本文对你有帮助请点赞收藏支持

相关新闻

当单机游戏遇见分屏魔法:Nucleus Co-op如何重燃你的本地多人游戏时光?
2026/6/29 15:00:26

当单机游戏遇见分屏魔法:Nucleus Co-op如何重燃你的本地多人游戏时光?

当单机游戏遇见分屏魔法:Nucleus Co-op如何重燃你的本地多人游戏时光? 【免费下载链接】splitscreenme-nucleus Nucleus Co-op is an application that starts multiple instances of a game for split-screen multiplayer gaming! 项目地址: https://…

阅读更多
如何让Windows文件资源管理器智能显示STL模型缩略图
2026/6/29 15:00:26

如何让Windows文件资源管理器智能显示STL模型缩略图

如何让Windows文件资源管理器智能显示STL模型缩略图 【免费下载链接】STL-thumbnail Shellextension for Windows File Explorer to show STL thumbnails 项目地址: https://gitcode.com/gh_mirrors/st/STL-thumbnail STL-Thumbnail是一个专为Windows系统设计的文件资源…

阅读更多
Memtest86+ 专业内存诊断:5步彻底解决系统不稳定问题
2026/6/29 15:00:26

Memtest86+ 专业内存诊断:5步彻底解决系统不稳定问题

Memtest86 专业内存诊断:5步彻底解决系统不稳定问题 【免费下载链接】memtest86plus Official repo for Memtest86 项目地址: https://gitcode.com/gh_mirrors/me/memtest86plus 内存故障是电脑蓝屏、死机和数据损坏的主要原因之一。Memtest86 作为专业的独立…

阅读更多
Windows应急响应实战:从PowerShell挖矿脚本追踪到矿池C2域名
2026/6/29 17:00:26

Windows应急响应实战:从PowerShell挖矿脚本追踪到矿池C2域名

1. 项目概述:一次典型的Windows入侵应急响应最近处理了一个挺有意思的应急响应案例,客户那边一台Windows服务器CPU莫名飙高,风扇狂转,业务却慢如蜗牛。登录上去一看,任务管理器里一个陌生的powershell.exe进程长期占用…

阅读更多
Kafka集群管理太复杂?这款开源Web UI让你5分钟上手
2026/6/29 17:00:26

Kafka集群管理太复杂?这款开源Web UI让你5分钟上手

Kafka集群管理太复杂?这款开源Web UI让你5分钟上手 【免费下载链接】kafka-ui Open-Source Web UI for managing Apache Kafka clusters 项目地址: https://gitcode.com/gh_mirrors/kaf/kafka-ui 还记得那个深夜,我盯着满屏的Kafka命令行输出&…

阅读更多
alphaxiv可以直接翻译论文
2026/6/29 17:00:26

alphaxiv可以直接翻译论文

阅读更多
鸿蒙 ArkTS 实战:Essay Material Library 从状态建模到交互闭环完整解析
2026/6/29 17:00:26

鸿蒙 ArkTS 实战:Essay Material Library 从状态建模到交互闭环完整解析

鸿蒙 ArkTS 实战:Essay Material Library 从状态建模到交互闭环完整解析 前言 欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net Essay Material Library 是一个面向 学习成长工具 的鸿蒙 ArkTS 小应用。按关键词检索作文素材&…

阅读更多
Gemini原生多模态:统一表示空间与跨模态因果推理
2026/6/29 17:00:26

Gemini原生多模态:统一表示空间与跨模态因果推理

1. 项目概述:这不是又一个“大模型”,而是一次底层认知范式的迁移2024年初,当整个AI圈还在消化GPT-4 Turbo的更新节奏时,Google quietly(但绝非低调)把Gemini推到了聚光灯下。它被官方称为“Google迄今最强…

阅读更多
终极Windows 11优化指南:4步让你的系统性能飙升70%的免费方案
2026/6/29 16:00:26

终极Windows 11优化指南:4步让你的系统性能飙升70%的免费方案

终极Windows 11优化指南:4步让你的系统性能飙升70%的免费方案 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter…

阅读更多
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告
2026/6/28 0:00:11

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

阅读更多
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?
2026/6/28 0:00:11

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

阅读更多
蒙特卡洛离策略强化学习:工业场景下的无偏评估与稳定训练
2026/6/29 0:00:22

蒙特卡洛离策略强化学习:工业场景下的无偏评估与稳定训练

1. 这不是教科书里的“蒙特卡洛离策略”,而是我在强化学习项目里亲手调通的那套逻辑“Monte Carlo Off-Policy Explained”——看到这个标题,别急着去翻Sutton那本绿皮书第5章。我带过三个工业级强化学习落地项目,从智能仓储调度到金融风控策…

阅读更多
Java开发者转型安全开发:从代码审计到自动化工具实践
2026/6/29 0:00:22

Java开发者转型安全开发:从代码审计到自动化工具实践

1. 转型背景与核心驱动力最近几年,身边不少做Java后端开发的朋友,都开始或多或少地关注起安全开发这个方向。我自己也是从写了七八年Java业务代码,一步步转向了安全领域,现在主要做代码审计和自动化安全工具开发。这个转变不是一时…

阅读更多
HyperFrames 设计、品味与借鉴
2026/6/29 0:00:22

HyperFrames 设计、品味与借鉴

调研对象:https://github.com/heygen-com/hyperframes 核心判断:HyperFrames 最值得学习的不是“用 HTML 渲染视频”这个技术点,而是它把“让 Agent 生成视频”设计成了一套可操作、可验证、可复现的生产协议。 一句话记住:视频生…

阅读更多
GIT修改用户名
2026/6/28 5:47:46

GIT修改用户名

在GIT中修改用户名可按以下步骤操作: 查看当前git的用户名,使用命令git config --list或git config user.name。修改git用户名,使用命令git config --global user.name "xxx(新的用户名)",将其中…

阅读更多
Win11Debloat:让你的Windows系统重获新生的终极优化工具
2026/6/28 14:44:43

Win11Debloat:让你的Windows系统重获新生的终极优化工具

Win11Debloat:让你的Windows系统重获新生的终极优化工具 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and …

阅读更多
技术深度解析:m4s-converter实现原理与B站缓存视频转换最佳实践
2026/6/28 14:44:39

技术深度解析:m4s-converter实现原理与B站缓存视频转换最佳实践

技术深度解析:m4s-converter实现原理与B站缓存视频转换最佳实践 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter m4s-converter是一个…

阅读更多