Skip to content

ARM64 Assembly Essentials

Android 汇编速查与实战:从寄存器到 Exploit 开发

为什么要学汇编?

安全研究绑定汇编的三个理由:

  1. 漏洞分析 — 理解 CVE 报告中的"越界写"到底写到了哪里
  2. Exploit 开发 — ROP chain、shellcode 都需要汇编思维
  3. 逆向工程 — 没有源码时,汇编是唯一的真相

一个真实场景:

├── 漏洞成因: C 代码逻辑错误
├── 触发路径: ioctl 系统调用
└── 利用方式: ROP chain → 28 条 ARM64 gadget → root

如果看不懂这 28 条 gadget,就无法理解这个漏洞是如何变成 root 的。

学习路径

Week 1: 基础 (Chapter 00-02)
├── ARM64 寄存器和指令
├── 内存寻址
└── 调用约定

Week 2: 工具 (Chapter 03-04)
├── Inline 汇编
└── 调试技巧

Week 3-4: Exploit (Chapter 05-07)
├── Control Flow Hijack
├── Memory Corruption
└── 完整 Exploit 开发

预计时间: 20-30 小时(每天 1-2 小时,2-3 周)

前置要求

要求程度说明
C 语言必需指针、内存布局
Linux 命令行必需GDB 基本操作
Android 基础推荐NDK、adb
x86 汇编可选有帮助但不必须

ARM64 vs 其他架构

特性ARM64 (AArch64)x86-64ARM32
寄存器数量31 通用16 通用16 通用
指令长度固定 4 字节变长 1-15 字节固定 4 或 2 字节
字节序小端小端可配置
Android 使用主流(64位设备)模拟器旧设备
安全研究价值⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐

为什么 Android 用 ARM?

  • 功耗低(移动设备核心需求)
  • 授权灵活(厂商可定制)
  • 生态成熟

与其他语言笔记的关系

┌─────────────────────────────────────────────────────┐
│              Android Security Research              │
├───────────┬───────────┬───────────┬────────────────┤
│  C        │  Java     │  Rust     │  ARM64 Asm     │
│  Essentials│ Essentials│ Essentials│  Essentials    │
├───────────┼───────────┼───────────┼────────────────┤
│  内核     │  Framework│  新组件   │  Exploit       │
│  驱动     │  App 层   │  Keystore │  逆向          │
│  HAL      │  Xposed   │  Binder   │  漏洞分析      │
└───────────┴───────────┴───────────┴────────────────┘

联系:

  • C 代码编译后就是汇编
  • Java/ART 运行时也是 native 代码
  • Rust 的 unsafe 最终也是汇编

推荐工具

必备

工具用途安装
GDB + GEF调试apt install gdb + GEF 插件
objdump反汇编系统自带
readelfELF 分析系统自带

推荐

工具用途说明
Ghidra逆向免费,NSA 出品
IDA Pro逆向商业,行业标准
ROPgadgetROP 开发pip install ropgadget
pwntoolsExploit 开发pip install pwntools
Frida动态分析pip install frida-tools

Android 特定

bash
# Android NDK (交叉编译)
# 下载: https://developer.android.com/ndk/downloads

# adb 调试
adb shell
adb push exploit /data/local/tmp/

快速开始(10 分钟)

1. 环境检查

bash
# 确认有 aarch64 工具链
aarch64-linux-gnu-gcc --version

# 或使用 Android NDK
$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android30-clang --version

2. Hello World

asm
// hello.s
.global _start
.section .text

_start:
    // write(1, msg, 13)
    mov x0, #1          // fd = stdout
    adr x1, msg         // buf = msg
    mov x2, #13         // count = 13
    mov x8, #64         // syscall = write
    svc #0
    
    // exit(0)
    mov x0, #0          // status = 0
    mov x8, #93         // syscall = exit
    svc #0

.section .data
msg:
    .ascii "Hello ARM64\n"

3. 编译运行

bash
# 编译
aarch64-linux-gnu-as -o hello.o hello.s
aarch64-linux-gnu-ld -o hello hello.o

# 在 ARM64 设备上运行
adb push hello /data/local/tmp/
adb shell chmod +x /data/local/tmp/hello
adb shell /data/local/tmp/hello
# 输出: Hello ARM64

4. 用 GDB 调试

bash
# 在设备上启动 gdbserver
adb shell /data/local/tmp/gdbserver :1234 /data/local/tmp/hello

# 本地连接
adb forward tcp:1234 tcp:1234
aarch64-linux-gnu-gdb hello
(gdb) target remote :1234
(gdb) break _start
(gdb) continue
(gdb) info registers

章节目录

基础篇

章节内容难度
00 - ARM64 基础寄存器、指令、架构
01 - 内存寻址寻址模式、对齐、Cache⭐⭐
02 - 调用约定AAPCS64、栈帧、参数传递⭐⭐
03 - Inline 汇编GCC/Clang inline asm⭐⭐
04 - 调试技巧GDB、Ghidra、crash 分析⭐⭐⭐

Exploit 篇

章节内容难度
05 - 控制流劫持ROP、JOP、ret2libc⭐⭐⭐⭐
06 - 内存破坏栈溢出、堆溢出、UAF⭐⭐⭐⭐
07 - Exploit 开发完整 exploit、shellcode⭐⭐⭐⭐⭐

相关 CVE 速览

本系列会分析以下真实漏洞:

CVE类型章节
CVE-2021-0920socket UAF06
CVE-2022-20186GPU 驱动06
CVE-2023-20938Binder UAF05, 06

深入阅读

官方资源:

推荐书籍:

  • Blue Fox: Arm Assembly Internals & Reverse Engineering
  • The Art of Exploitation

在线资源:

下一步

00 - ARM64 基础 — 从寄存器开始