参加网络安全竞赛(CTF)的朋友们都知道,比赛中那些烧脑的隐写术、复杂的密码学题目和棘手的漏洞利用场景,往往让人既兴奋又头疼。我打了七年CTF,从菜鸟到带队,最深的体会就是:解题能力=知识储备+经验技巧+工具熟练度。而这份指南,就是要帮你把这三块短板一次性补上。
不同于网上零散的Writeup,这份资料按照题型分类整理了实战中最常见的解题套路。比如隐写术里的LSB隐写、文件结构重组,密码学中的RSA攻击链、流密码漏洞,以及漏洞利用时的ROP链构造、堆风水技巧等。每个案例都包含题目还原、思考路径、工具选用和完整操作记录,相当于把比赛中的"灵光一闪"固化成了可复用的方法论。
去年省赛有道题,给了一张看似普通的jpg图片,全场80%队伍卡了至少两小时。其实用binwalk就能发现文件尾部附加了ZIP压缩包,但关键是要用dd if=image.jpg bs=1 skip=125757 of=hidden.zip精确截取(这个偏移量需要通过hexdump分析文件结构确定)。解压后得到密码提示"生日",用fcrackzip -b -c '1' -l 6 -u hidden.zip暴力破解出密码950321。
更隐蔽的题目会用到:
stegsolve.jar分析RGB通道,配合zsteg检测PNG中的异常数据010 Editor手动修复损坏的PNG文件头(如将错误的IHDR块修正)exiftool查看后,发现GPS坐标隐写需要echo "ibase=16; $(echo '坐标值' | tr -d '°'"NSEW")" | bc转换为十进制遇到ELF文件隐写时,我常用的三板斧:
strings -n 8 file 查找可疑字符串rabin2 -z file 提取所有段字符串objdump -d file | grep 'call' 分析异常函数调用去年一道题在.data段藏了经过XOR加密的flag,密钥是程序里某个固定字符串的MD5前4字节。破解时需要:
bash复制r2 -d challenge
> afl # 列出函数
> s sym.encrypt # 定位加密函数
> pdf # 反汇编发现密钥生成逻辑
从基础的模数分解到Coppersmith攻击,这张表整理了所有常见场景:
| 攻击类型 | 使用条件 | 工具命令示例 |
|---|---|---|
| 模数分解 | n<256bit | factor(n) |
| 共模攻击 | 相同n不同e | rsatool.py -n n -e e1,e2 --attack common_modulus |
| 低加密指数广播攻击 | e小且相同消息加密多次 | python crt.sage |
| Wiener攻击 | d < (1/3)*n^(1/4) | rsa-wiener-attack |
遇到OAEP填充的题目时,记得先用from Crypto.Cipher import PKCS1_OAEP正确解密,很多队伍直接pow(c,d,n)导致失败。
AES-ECB模式最容易出题,比如这道经典题:
flag{已知部分+未知4字符}openssl enc -aes-128-ecb -K $(echo -n "key" | md5sum | cut -d' ' -f1)生成所有可能密文对于RC4类题目,如果已知部分明文,可以用:
python复制from Crypto.Cipher import ARC4
keystream = bytes([a ^ b for a,b in zip(ciphertext, plaintext)])
flag = ARC4.new(keystream).decrypt(ciphertext)
以32位栈溢出为例的checklist:
checksec --file=challengecyclic 200生成测试串 + dmesg | grep "segfault"cyclic -l 0x6161616cputs@got构造payloadROPgadget --binary challenge > gadgets.txt遇到堆题时,重点看:
malloc/free的调用关系tcache poisoning修改__free_hook当遇到沙箱保护的题目(如禁用了execve),需要转向ORW(open-read-write)攻击:
python复制# 64位系统典型链
ropchain = [
pop_rdi, filename_addr,
pop_rsi, 0,
pop_rdx, 0,
open_addr,
pop_rdi, 3, # 文件描述符
pop_rsi, buffer,
pop_rdx, 100,
read_addr,
pop_rdi, 1,
write_addr
]
记得用seccomp-tools dump ./challenge先检查过滤规则。
ropper --search "pop rdi" 快速找gadgettcp.port == 9999 && datatshark -r capture.pcap -Y "http" -T jsonhashcat -m 1000 hash.txt -a 3 ?l?l?l?l 4位小写字母爆破john --wordlist=rockyou.txt --format=NT hash.txt根据题目难度建议分配时间:
我习惯的解题优先级:
.png就是图片,实际可能是file fake.png显示为"data"
xxd fake.png | head看文件头cat看到乱码就放弃,可能是iconv -f GBK -t UTF-8 filebash复制while [ -f *.zip ]; do unzip -P $(fcrackzip -u -D -p rockyou.txt *.zip | grep pw | cut -d' ' -f5) *.zip; done
e和φ(n)不互素hash(length_extention_attack)python -c "print(bytes.fromhex('414243'))"就能解决新手建议按这个顺序攻关:
cryptohack.org练密码学)CTFtime.org上的线上赛积累经验用Docker快速搭建练习环境:
dockerfile复制FROM ubuntu:20.04
RUN apt update && apt install -y xinetd socat
COPY ./pwn /home/ctf/pwn
RUN chmod 755 /home/ctf/pwn
EXPOSE 9999
CMD ["xinetd", "-dontfork"]
配合docker-compose.yml实现一键部署多个题目。