avatar🌌
DocAcerDA's BLOG

mostly about CTFs and hacking

CTFer(misc and web) and SRC researcher

PWN的学习日志(2026/1/27)

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] = rbp

pop
pop rbp

作用:

从栈顶取数据

等价于:

rbp = [rsp]
rsp += 8

2️⃣ 控制流(pwn 核心)

call
call func

做两件事:

  1. 把下一条指令地址压栈(返回地址)
  2. 跳转到函数

📘 笔记重点:

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 error

4️⃣ 其他你一定会遇到的

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
类型大小
_BYTE1 字节
_WORD2 字节
_DWORD4 字节
_QWORD8 字节
盘古石-DA 计算机取证
鹏城杯2025
Valaxy v1.0.0-rc.9 驱动|主题-Yunv1.0.0-rc.9