第一章:异架构Pwn与Fuzz概述
各位好,我是老周。做二进制安全有些年头了,从x86一路折腾到ARM、MIPS、RISC-V。今天咱们聊聊异架构Pwn和Fuzz测试——这门课的开篇,我打算把几个核心概念先掰扯清楚。
1.1 什么是异架构?
说白了,异架构就是跟我们日常用的x86/x64不一样的CPU指令集架构。你平时用的电脑、服务器,大多是x86。但手机、路由器、嵌入式设备、IoT终端,用的可就是ARM、MIPS、RISC-V这些了。
我刚开始接触异架构Pwn时,最大的感受就是:同样的漏洞,换了个架构,利用手法完全不一样。指令长度、寄存器约定、调用栈布局、内存模型,处处是坑。
| 架构 | 常见设备 | 指令长度 | 寄存器数量 | 字节序 |
|---|---|---|---|---|
| ARM (32-bit) | 手机、路由器、工控 | 4字节 (ARM模式) / 2字节 (Thumb) | 16个通用寄存器 | 小端为主 |
| MIPS | 路由器、机顶盒、网关 | 4字节 (固定) | 32个通用寄存器 | 大小端都有 |
| RISC-V | 新兴IoT、AI加速器 | 4字节 (基础指令集) | 32个通用寄存器 | 小端 |
核心认知:异架构Pwn不是把x86的exp换个编译器重新编译一遍就完事了。指令编码、栈帧布局、系统调用号、GOT/PLT机制,每个架构都有自己的脾气。
1.2 Pwn题目的常见类型
CTF里的Pwn题,说白了就是让你利用程序漏洞,拿到shell或者读取flag。我这些年见过的题目,大致可以分成这几类:
- 栈溢出(Stack Overflow):最经典的类型。覆盖返回地址、ROP链构造,在异架构下要特别注意栈对齐和返回指令的差异。
- 堆利用(Heap Exploitation):UAF、堆溢出、double free。ARM和MIPS的堆管理器实现跟glibc不太一样,我踩过不少坑。
- 格式化字符串(Format String):任意读写原语。异架构下参数传递方式不同,格式化字符串的偏移计算要重新学。
- 逻辑漏洞(Logic Bug):整数溢出、条件竞争、类型混淆。这类漏洞跟架构关系不大,但利用时还是要考虑目标架构的特性。
我的经验:刚开始做异架构Pwn时,建议从栈溢出入手。因为栈布局相对直观,ROP链构造也有规律可循。堆利用在异架构下坑太多,容易劝退。
1.3 Fuzz测试在安全研究中的定位
Fuzz测试,说白了就是自动生成大量畸形输入,扔给目标程序,看它会不会崩溃。崩溃了,就说明可能有漏洞。
我个人的理解是:Fuzz是漏洞挖掘的第一道筛子。它不保证能找到所有漏洞,但能帮你快速发现那些触发条件简单的、容易被忽略的bug。
在异架构Pwn中,Fuzz的作用尤其明显:
- 异架构设备上,手动逆向分析成本高,Fuzz可以自动化覆盖大量代码路径。
- 嵌入式系统往往缺少ASLR、NX等防护,Fuzz出来的crash更容易转化为可利用的漏洞。
- Fuzz可以帮你发现协议解析、文件格式处理中的边界问题——这些正是Pwn题的高频考点。
注意:Fuzz不是万能的。它很难发现逻辑漏洞、条件竞争、多步骤利用链。Fuzz是工具,不是银弹。我见过有人跑了一周Fuzz一个crash都没出,就怀疑人生了——其实很正常,Fuzz的覆盖率取决于种子质量和变异策略。
1.4 异架构Fuzz的挑战
你想想看,在x86上跑AFL,开箱即用。但换到ARM/MIPS/RISC-V呢?问题就来了:
- 模拟器性能:QEMU用户态模拟比原生慢5-10倍,Fuzz效率大打折扣。
- 系统调用差异:异架构的系统调用号、参数传递方式不同,Fuzz工具需要适配。
- 二进制插桩:AFL的编译时插桩在异架构下不一定能用,需要QEMU模式或静态插桩。
- 崩溃可重现性:模拟器下的crash不一定能在真机上复现,我遇到过好几次模拟器跑出crash,真机上跑不出来的情况。
一句话总结:异架构Fuzz,核心是解决模拟执行效率和插桩兼容性两个问题。后面的章节,我会带着大家一步步攻克这些难点。
1.5 本章知识体系
下面这张图,是我梳理的本章知识结构。你可以把它当作整个课程的导航地图:
1.6 本章小结
这一章,我们聊了三个核心问题:
- 异架构是什么——ARM、MIPS、RISC-V的基本差异
- Pwn题目有哪些——栈溢出、堆利用、格式化字符串、逻辑漏洞
- Fuzz测试的定位——自动化漏洞挖掘的第一道筛子,但要注意异架构下的特殊挑战
给新手的建议:如果你之前只做过x86的Pwn,建议先拿ARM的栈溢出练手。ARM的指令集相对规整,资料也多。MIPS的延迟槽和分支指令比较反人类,可以放后面。RISC-V目前题目还不多,但未来是趋势。