Python 环境
2026/5/29工具通用工具工具通用工具Python大约 6 分钟
Python 环境
链接
是什么
Python 是 CTF 竞赛中最常用的编程语言,几乎在所有方向(Web、Pwn、Crypto、Misc、Reverse)都有广泛应用。本指南介绍 Python 环境的配置和 CTF 常用库。
Python 在 CTF 中的应用:
- Web:编写自动化脚本、漏洞利用
- Pwn:使用 pwntools 编写 Exploit
- Crypto:实现密码学算法和攻击
- Misc:数据处理、文件分析
- Reverse:逆向分析辅助脚本
安装与配置
安装 Python
# Linux
# Ubuntu/Debian
sudo apt update
sudo apt install python3 python3-pip python3-venv
# CentOS/RHEL
sudo yum install python3 python3-pip
# Arch Linux
sudo pacman -S python python-pip
# macOS
brew install python3
# Windows
# 从官网下载:https://www.python.org/downloads/
# 安装时勾选 "Add Python to PATH"
# 验证安装
python3 --version
pip3 --version配置 pip 镜像源
# 配置国内镜像源(加速下载)
# 创建或编辑 pip 配置文件
mkdir -p ~/.pip
cat > ~/.pip/pip.conf << EOF
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
trusted-host = pypi.tuna.tsinghua.edu.cn
EOF
# 或临时使用镜像源
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple package_name虚拟环境配置
# 创建虚拟环境
python3 -m venv ctf_env
# 激活虚拟环境
# Linux/macOS
source ctf_env/bin/activate
# Windows
ctf_env\Scripts\activate
# 退出虚拟环境
deactivate
# 查看已安装的包
pip list
# 导出依赖
pip freeze > requirements.txt
# 从 requirements.txt 安装依赖
pip install -r requirements.txtIDE 配置
# 推荐 IDE/编辑器
# 1. VS Code(推荐)
# - 安装 Python 扩展
# - 安装 Pylance
# - 配置代码格式化
# 2. PyCharm
# - 社区版免费
# - 功能强大
# 3. Vim/Neovim
# - 安装 Python 补全插件
# - 配置代码格式化
# 4. Jupyter Notebook
# - 适合交互式分析
pip install jupyter
jupyter notebook基本用法
Python 基础语法
# 变量和数据类型
x = 42 # 整数
y = 3.14 # 浮点数
s = "hello" # 字符串
b = True # 布尔值
n = None # 空值
# 列表
lst = [1, 2, 3, 4, 5]
lst.append(6)
lst[0]
# 字典
d = {"key": "value", "num": 42}
d["key"]
# 元组
t = (1, 2, 3)
# 集合
s = {1, 2, 3}文件操作
# 读取文件
with open("file.txt", "r") as f:
content = f.read()
# 读取二进制文件
with open("file.bin", "rb") as f:
data = f.read()
# 写入文件
with open("output.txt", "w") as f:
f.write("Hello, World!")
# 写入二进制文件
with open("output.bin", "wb") as f:
f.write(b"\x00\x01\x02")字符串处理
# 字符串操作
s = "Hello, World!"
s.lower() # 转小写
s.upper() # 转大写
s.split(",") # 分割
",".join(["a", "b"]) # 连接
s.replace("Hello", "Hi") # 替换
s.find("World") # 查找
s[0:5] # 切片
# 格式化字符串
name = "CTF"
f"Hello, {name}!" # f-string
"Hello, {}!".format(name) # format异常处理
try:
# 可能出错的代码
result = 1 / 0
except ZeroDivisionError as e:
print(f"Error: {e}")
except Exception as e:
print(f"Unexpected error: {e}")
finally:
# 无论是否出错都会执行
print("Done")CTF常用库
pwntools(Pwn 方向)
# 安装
pip install pwntools
# 基本使用
from pwn import *
# 设置架构
context.arch = 'amd64'
context.os = 'linux'
# 连接远程服务
p = remote("challenge.ctf.com", 1337)
# 启动本地进程
p = process("./vuln")
# 交互
p.send(b"data")
p.sendline(b"data")
data = p.recv(1024)
data = p.recvline()
p.interactive()
# ROP 构造
elf = ELF("./vuln")
rop = ROP(elf)
pop_rdi = rop.find_gadget(['pop rdi', 'ret'])[0]
# Shellcode
shellcode = asm(shellcraft.sh())
# 打包/解包
p64(0xdeadbeef)
u64(b"\xef\xbe\xad\xde\x00\x00\x00\x00")requests(Web 方向)
# 安装
pip install requests
# 基本使用
import requests
# GET 请求
r = requests.get("http://example.com")
r.text # 响应内容
r.status_code # 状态码
r.headers # 响应头
# POST 请求
r = requests.post("http://example.com/login", data={"user": "admin", "pass": "123"})
# 带 Cookie
session = requests.Session()
session.get("http://example.com/cookies/set/name/admin")
# 带 Header
r = requests.get("http://example.com", headers={"User-Agent": "Mozilla/5.0"})
# 文件上传
files = {"file": open("shell.php", "rb")}
r = requests.post("http://example.com/upload", files=files)BeautifulSoup(Web 方向)
# 安装
pip install beautifulsoup4
# 基本使用
from bs4 import BeautifulSoup
html = "<html><body><p class='flag'>flag{test}</p></body></html>"
soup = BeautifulSoup(html, "html.parser")
# 查找元素
soup.find("p", class_="flag").text
soup.find_all("a") # 所有链接
# CSS 选择器
soup.select("p.flag")hashlib(密码学)
# 内置库,无需安装
import hashlib
# MD5
hashlib.md5(b"data").hexdigest()
# SHA-1
hashlib.sha1(b"data").hexdigest()
# SHA-256
hashlib.sha256(b"data").hexdigest()
# SHA-512
hashlib.sha512(b"data").hexdigest()
# 文件哈希
with open("file.txt", "rb") as f:
print(hashlib.md5(f.read()).hexdigest())pycryptodome(密码学)
# 安装
pip install pycryptodome
# AES 加密
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
key = b"0123456789abcdef" # 16 字节密钥
iv = b"0123456789abcdef" # 16 字节 IV
cipher = AES.new(key, AES.MODE_CBC, iv)
encrypted = cipher.encrypt(pad(b"Hello, World!", 16))
# AES 解密
cipher = AES.new(key, AES.MODE_CBC, iv)
decrypted = unpad(cipher.decrypt(encrypted), 16)
# RSA
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
# 生成密钥对
key = RSA.generate(2048)
private_key = key.export_key()
public_key = key.publickey().export_key()
# 加密
rsa_key = RSA.import_key(public_key)
cipher = PKCS1_OAEP.new(rsa_key)
encrypted = cipher.encrypt(b"Hello, World!")
# 解密
rsa_key = RSA.import_key(private_key)
cipher = PKCS1_OAEP.new(rsa_key)
decrypted = cipher.decrypt(encrypted)
# Base64
import base64
encoded = base64.b64encode(b"Hello")
decoded = base64.b64decode(encoded)struct(二进制处理)
# 内置库,无需安装
import struct
# 打包
data = struct.pack("<I", 0xdeadbeef) # 小端 32 位
data = struct.pack("<Q", 0xdeadbeef) # 小端 64 位
# 解包
value = struct.unpack("<I", data)[0]
# 格式说明:
# < 小端
# > 大端
# I 无符号 32 位
# Q 无符号 64 位
# i 有符号 32 位
# q 有符号 64 位
# H 无符号 16 位
# B 无符号 8 位z3(约束求解)
# 安装
pip install z3-solver
# 基本使用
from z3 import *
# 创建求解器
s = Solver()
# 创建变量
x = BitVec('x', 32)
y = BitVec('y', 32)
# 添加约束
s.add(x + y == 100)
s.add(x - y == 20)
# 求解
if s.check() == sat:
m = s.model()
print(f"x = {m[x]}, y = {m[y]}")PIL/Pillow(图片处理)
# 安装
pip install Pillow
# 基本使用
from PIL import Image
# 打开图片
img = Image.open("image.png")
# 获取像素
pixel = img.getpixel((x, y))
# 设置像素
img.putpixel((x, y), (255, 0, 0))
# 获取图片大小
width, height = img.size
# 转换模式
img = img.convert("RGB")
# 保存图片
img.save("output.png")scapy(网络)
# 安装
pip install scapy
# 基本使用
from scapy.all import *
# 读取 pcap 文件
packets = rdpcap("capture.pcap")
# 分析数据包
for pkt in packets:
if pkt.haslayer(IP):
print(pkt[IP].src, pkt[IP].dst)
# 创建数据包
pkt = IP(dst="192.168.1.1")/ICMP()gmpy2(数学)
# 安装
pip install gmpy2
# 基本使用
import gmpy2
# 大数运算
gmpy2.mpz(2**100)
# 模逆元
gmpy2.invert(3, 7)
# 快速幂
gmpy2.powmod(2, 100, 1000000007)
# 开方
gmpy2.isqrt(123456789)sympy(符号计算)
# 安装
pip install sympy
# 基本使用
from sympy import *
# 符号变量
x, y = symbols('x y')
# 方程求解
solve(x**2 - 4, x)
# 微积分
diff(x**3, x)
integrate(x**2, x)
# 数论
factorint(123456789)numpy(数值计算)
# 安装
pip install numpy
# 基本使用
import numpy as np
# 数组
arr = np.array([1, 2, 3, 4, 5])
# 矩阵
mat = np.array([[1, 2], [3, 4]])
# 矩阵运算
np.dot(mat, mat)
np.linalg.inv(mat)CTF 常用脚本模板
Web 自动化脚本
import requests
url = "http://challenge.ctf.com/login"
session = requests.Session()
# 登录
data = {"username": "admin", "password": "admin123"}
r = session.post(url, data=data)
# 访问受保护页面
r = session.get("http://challenge.ctf.com/admin")
print(r.text)Pwn Exploit 模板
from pwn import *
context.arch = 'amd64'
context.log_level = 'debug'
p = process("./vuln")
# p = remote("challenge.ctf.com", 1337)
elf = ELF("./vuln")
rop = ROP(elf)
pop_rdi = rop.find_gadget(['pop rdi', 'ret'])[0]
ret = rop.find_gadget(['ret'])[0]
payload = b"A" * offset
payload += p64(pop_rdi)
payload += p64(elf.got['puts'])
payload += p64(elf.plt['puts'])
payload += p64(elf.symbols['main'])
p.sendline(payload)
p.recvline()
leaked = u64(p.recvline().strip().ljust(8, b'\x00'))
log.info(f"Leaked: {hex(leaked)}")
p.interactive()Crypto 解密脚本
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
key = b"0123456789abcdef"
iv = b"0123456789abcdef"
encrypted = bytes.fromhex("...")
cipher = AES.new(key, AES.MODE_CBC, iv)
decrypted = unpad(cipher.decrypt(encrypted), 16)
print(decrypted.decode())Misc 数据处理脚本
# 读取二进制文件
with open("mystery.bin", "rb") as f:
data = f.read()
# 搜索字符串
import re
strings = re.findall(b"[\x20-\x7e]{4,}", data)
for s in strings:
print(s.decode())
# 提取特定模式
flag_pattern = re.compile(b"flag\\{.*?\\}")
flags = flag_pattern.findall(data)
for flag in flags:
print(flag.decode())常见问题
pip 安装失败
解决:
# 使用镜像源
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple package_name
# 升级 pip
pip install --upgrade pip
# 使用 --user 选项
pip install --user package_name编码问题
解决:
# 设置编码
import sys
sys.stdout.reconfigure(encoding='utf-8')
# 文件读取指定编码
with open("file.txt", "r", encoding="utf-8") as f:
content = f.read()模块导入错误
解决:
# 检查模块是否安装
pip list | grep module_name
# 安装模块
pip install module_name
# 检查 Python 路径
python3 -c "import sys; print(sys.path)"内存不足
解决:
# 使用生成器
def read_large_file(file):
with open(file, "r") as f:
for line in f:
yield line
# 分块处理
def process_chunk(data, chunk_size=1024):
for i in range(0, len(data), chunk_size):
yield data[i:i+chunk_size]性能优化
解决:
# 使用多进程
from multiprocessing import Pool
def process(x):
return x * x
with Pool(4) as p:
results = p.map(process, range(10))
# 使用 NumPy
import numpy as np
arr = np.array([1, 2, 3, 4, 5])