【软件安全】ARM64、x86、32 位与 64 位架构的区别、定义、应用背景
ARM64、x86、32 位与 64 位架构的区别、定义、应用背景,软件安全实验(栈溢出、ASLR、缓冲区攻击等)
一、架构定义与关系
1. x86
-
定义:最初由 Intel 8086/80386 演变而来的一系列指令集架构(ISA)。
-
特点:
- 最初是 16 位,后来发展为 32 位(IA-32),再发展为 64 位(x86-64 / AMD64)。
- 使用寄存器命名如
eax, ebx, esp, ebp, eip
(32 位),在 64 位扩展为rax, rsp, rbp, rip
。
-
应用:PC、服务器的主流架构,尤其在 安全课程里常用来教学栈溢出和内存漏洞,因为教材和工具链成熟。
2. ARM / ARM64 (aarch64)
-
定义:ARM 是 RISC(精简指令集计算机),ARM64 指的是其 64 位架构(正式名 AArch64)。
-
特点:
- 移动设备、嵌入式、苹果 M1/M2 芯片都在用。
- 寄存器统一为 64 位:
x0 ~ x30
,sp
(栈指针),x29
(帧指针),x30
(返回地址)。 - 指令更简洁,能效比高。
-
应用:智能手机(Android/iOS)、树莓派、苹果 Macbook (M1/M2/M3),以及部分云计算服务器。
3. 32 位 vs 64 位
-
32 位:寄存器宽度为 32 位,寻址空间最大约 4GB。
-
64 位:寄存器宽度 64 位,理论寻址空间可达 16EB。
-
区别:
- 指针大小不同(32 位 4 字节,64 位 8 字节),影响栈布局、内存对齐。
- 函数调用约定不同:x86 常用栈传参,ARM64 和 x86-64 常用寄存器传参。
- 安全机制不同:64 位系统更容易启用 NX/DEP、ASLR、栈保护等现代防护。
二、在软件安全中的应用
1. 为什么教材多用 x86/32 位?
- 32 位下的栈布局更简单,
ebp
/eip
连续保存在栈中,容易被溢出覆盖。 - 攻击演示(如覆盖返回地址 → 跳转到 shellcode)更直观。
- 很多经典漏洞利用手法(ret2libc、ROP)最早就是基于 IA-32 研究的。
2. ARM64 下的不同点
- 没有 eip/esp/ebp,取而代之的是
pc/sp/x29/x30
。 - 返回地址存在寄存器 x30 (LR),而不是直接压栈,这意味着溢出模式和保护机制不同。
- ASLR/DEP 更常开,在 ARM64 上教材里的简单攻击往往会触发 “Bus error” 而不是 “Segmentation fault”。
3. 64 位安全机制增强
- 更强的 ASLR:地址空间更大,随机化效果更好。
- 更复杂的 ABI:函数调用用寄存器传参,减少了栈上的可控数据,降低了栈溢出的成功率。
- 现代编译器默认防护:例如
-fstack-protector
、-pie
默认开启,需要显式关掉才能复现实验。
三、背景与应用场景
-
教学/研究
- 大学课程和教材(比如你在 IFN657 课程做的实验)常要求用 32 位 x86,因为漏洞利用的原理更容易演示。
- 但现在很多学生用 ARM Mac,只能借助虚拟机/交叉编译来还原 x86 环境。
-
现实中的软件安全
- 现代系统(Windows 10/11、Linux 64 位、iOS、Android)基本都是 64 位。
- 漏洞利用在 64 位下更复杂(需要绕过 ASLR/DEP/Stack Canary)。
- ARM64 由于在手机普及,成为移动安全研究的重要对象(恶意 app、越狱、内核漏洞)。
-
攻防对抗
- 攻击者会研究不同架构的调用约定、内存布局,以设计特定的 exploit。
- 防御者利用 64 位环境的安全特性提高攻击难度。
四、总结对比表
架构 | 位宽 | 典型寄存器 | 应用 | 安全实验中的表现 |
---|---|---|---|---|
x86 (IA-32) | 32 | eax, ebx, ecx, edx, esp, ebp, eip | PC,教材实验 | 栈溢出容易覆盖 eip ,实验直观 |
x86-64 (AMD64) | 64 | rax, rbx, rsp, rbp, rip | PC,服务器 | 默认安全机制更强,利用更难 |
ARM32 | 32 | r0-r12, sp, lr, pc | 旧手机/嵌入式 | 栈溢出可能覆盖 lr (返回地址) |
ARM64 (AArch64) | 64 | x0-x30, sp, x29(fp), x30(lr), pc | 手机、Mac M1/M2/M3 | 返回地址在 x30 ,保护更多,常见崩溃是 Bus error |