视频加载失败

逆向工程基础: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 rbp
mov rbp, rsp
sub rsp, 0x20 ; 分配局部变量空间

结尾(尾声):

mov rsp, rbp
pop rbp
ret

看到 push rbp; mov rbp, rsp 基本可判定函数边界,这是 IDA 识别函数的重要特征。

工具实操指引#

IDA Pro#

  • F5 一键反编译为 C 伪代码(最常用)
  • 空格 在图形视图与列表视图间切换
  • N 重命名变量/函数,提升可读性
  • Y 修改变量类型,影响反编译输出

Ghidra(免费开源)#

  • 用 CodeBrowser 视图查看反汇编 + 反编译并排
  • 同样支持重命名、改类型、加注释
  • 优势是免费且插件生态活跃,适合学生党

学习路径建议#

  1. 先用 gcc -S 或 Compiler Explorer 看简单 C 函数编译出的汇编
  2. 写几个小例子(加法、循环、数组访问),对照源码看汇编
  3. 找 CTF Reverse 的 baby 题刷起,先看 writeup 再独立做
  4. 进阶学 ARM / MIPS 汇编,覆盖 IoT 固件分析场景

逆向的门槛不在于工具操作,而在于”看到一长串汇编能脑补出它在做什么”——这只能靠刷题量喂出来。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
逆向工程基础:x86 汇编入门
https://firefly.cuteleaf.cn/posts/reverse-engineering-x86-asm/
作者
zz
发布于
2026-10-08
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
zz
Hello, I'm zz.
公告
欢迎来到我的博客!这是一则示例公告。
分类
标签
最新动态
站点统计
文章
17
分类
6
标签
31
总字数
18,302
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
Cloudflare Pages
博客版本
Firefly v6.16.8
文章许可
CC BY-NC-SA 4.0
文章目录