逆向工程基础:x86 汇编入门
642 字
3 分钟
逆向工程基础:x86 汇编入门
为什么从汇编开始
逆向工程的核心是把机器码还原成可理解的逻辑,而汇编是机器码的人类可读形式。无论用 IDA、Ghidra 还是 x64dbg,最终都要看汇编。理解了寄存器、指令、调用约定,后面学 Pwn、恶意代码分析才有底气。
通用寄存器
x86-64 下常用寄存器(64 位版):
| 寄存器 | 用途 |
|---|---|
rax | 返回值 / 通用运算 |
rbx | 通用,callee-saved |
rcx rdx r8 r9 | 函数参数(前四个) |
rsp | 栈指针 |
rbp | 帧指针,callee-saved |
rdi rsi | 第一、二参数 |
rip | 指令指针 |
关键指令速查
mov rax, rbx ; 数据移动push rbp ; 入栈pop rbp ; 出栈call func ; 调用函数(隐含 push 返回地址)ret ; 返回(隐含 pop 返回地址到 rip)lea rax, [rbx+8] ; 取地址,不访问内存cmp rax, 0 ; 比较,设置标志位je label ; 相等则跳转test rax, rax ; 按位与,常用于判空函数调用约定
Linux x86-64 System V ABI:前 6 个整型参数依次放 rdi, rsi, rdx, rcx, r8, r9,多余参数入栈,返回值在 rax。
Windows x64 ABI 略有不同:前四个参数放 rcx, rdx, r8, r9,且需要 32 字节”影子空间”。
调用约定决定了你逆向时如何识别参数和返回值,必须搞清楚目标程序用的哪种。
函数序言与尾声
经典函数开头(序言):
push rbpmov rbp, rspsub rsp, 0x20 ; 分配局部变量空间结尾(尾声):
mov rsp, rbppop rbpret看到 push rbp; mov rbp, rsp 基本可判定函数边界,这是 IDA 识别函数的重要特征。
工具实操指引
IDA Pro
F5一键反编译为 C 伪代码(最常用)空格在图形视图与列表视图间切换N重命名变量/函数,提升可读性Y修改变量类型,影响反编译输出
Ghidra(免费开源)
- 用 CodeBrowser 视图查看反汇编 + 反编译并排
- 同样支持重命名、改类型、加注释
- 优势是免费且插件生态活跃,适合学生党
学习路径建议
- 先用
gcc -S或 Compiler Explorer 看简单 C 函数编译出的汇编 - 写几个小例子(加法、循环、数组访问),对照源码看汇编
- 找 CTF Reverse 的 baby 题刷起,先看 writeup 再独立做
- 进阶学 ARM / MIPS 汇编,覆盖 IoT 固件分析场景
逆向的门槛不在于工具操作,而在于”看到一长串汇编能脑补出它在做什么”——这只能靠刷题量喂出来。
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!
相关文章智能推荐
1
CTF Web 方向入门指南
CTF面向新手的 CTF Web 方向入门路线,涵盖必学知识点、常用工具与刷题平台推荐。
2
我的第一篇博客
记录开启博客的初衷,以及未来想在这里分享的内容方向。
3
SQL 注入漏洞原理与防御
漏洞分析从原理到实战,系统讲解 SQL 注入漏洞的成因、利用方式与防御方案,附常见绕过技巧。
4
Firefly 代码块示例
文章示例在Firefly中使用表达性代码的代码块在 Markdown 中的外观。
5
Firefly 布局系统详解
博客指南深入了解 Firefly 的布局系统,包括侧边栏布局(左侧/双侧)和文章列表布局(列表/网格),以及自适应网格列数。
随机文章随机推荐














