PWN的学习日志(2026/1/27)
PWN的一些基础术语和知识
在 x86-64 架构里,常见寄存器有:
| 寄存器 | 作用(新手版) |
|---|---|
RIP | 下一条要执行的指令地址 |
RSP | 栈顶指针 |
RBP | 栈基址(当前函数的“参考点”) |
RAX | 返回值 / 常用寄存器 |
RDI | 第 1 个函数参数 |
RSI | 第 2 个函数参数 |
RDX | 第 3 个函数参数 |
IDA / x86-64 反编译里最常见的指令:
1️⃣ 数据移动类(最常见)
mov
mov dst, src作用:
把
src的值复制到dst
📌 特点:
- 不交换
- 不影响 src
- 可寄存器 ↔ 寄存器 / 内存
📘 笔记用一句话:
mov = 赋值
lea(新手非常容易误解)
lea rax, [rbp-0x10]作用:
计算地址,不取值
⚠️ 非常重要区别:
| 指令 | 含义 |
|---|---|
mov rax, [rbp-0x10] | 取内存里的值 |
lea rax, [rbp-0x10] | 算地址本身 |
📘 笔记口诀:
lea = &变量(取地址)
push
push rbp作用:
栈顶 ↓,把数据压到栈上
等价于:
rsp -= 8
[rsp] = rbppop
pop rbp作用:
从栈顶取数据
等价于:
rbp = [rsp]
rsp += 82️⃣ 控制流(pwn 核心)
call
call func做两件事:
- 把下一条指令地址压栈(返回地址)
- 跳转到函数
📘 笔记重点:
call = push RIP + jmp
ret / retn
ret作用:
从栈中取地址 → 跳转
等价于:
pop rip🚨 pwn 核心点: 👉 覆盖的就是这里用到的地址
leave
leave等价于:
mov rsp, rbp
pop rbp📘 笔记:
leave = 恢复栈帧
jmp
jmp addr作用:
无条件跳转(不保存返回地址)
je / jne / jg / jl / ja / jb
条件跳转,和 cmp / test 配合
📘 新手理解:
if 条件成立 → 跳
3️⃣ 运算 / 比较
add / sub
add rax, 8
sub rsp, 0x10加 / 减
cmp
cmp rax, rbx作用:
比较(本质是做减法,不保存结果)
给后面的 je / jne 用
test
test rax, rax作用:
判断是否为 0(不关心具体值)
📘 常见套路:
test rax, rax
je error4️⃣ 其他你一定会遇到的
nop
nop啥也不干,占位
xor
xor eax, eax📌 常见用途:
- eax = 0(比 mov 快)
- 清寄存器
IDA 里常见“伪代码关键词”解释
IDA 反编译出来的 C 风格代码,常见这些:
__fastcall
int __fastcall main(...)意思:
使用寄存器传参的调用约定(x64 默认)
你可以理解成:
“这是个普通函数”
__int64 / __int128
__int64= 8 字节__int128= 16 字节(SSE 对齐)
_QWORD / _DWORD / _BYTE
| 类型 | 大小 |
|---|---|
_BYTE | 1 字节 |
_WORD | 2 字节 |
_DWORD | 4 字节 |
_QWORD | 8 字节 |