温馨提示×

linux反汇编怎么看栈

小樊
37
2026-09-24 17:08:28
栏目: 智能运维

在 Linux 下进行反汇编(比如用 objdump、gdb、IDA、radare2 等)时,“看栈”通常包含几层意思:看栈内存内容、看函数调用栈(backtrace)、看栈帧结构、看参数和局部变量怎么放在栈上。下面按实用角度讲。


一、用 GDB 动态看栈(最常用)

1. 查看调用栈(函数调用关系)

bt
bt full
  • bt:显示函数调用栈(EIP/RIP + 返回地址)
  • bt full:连局部变量一起显示

2. 查看栈指针和栈内存

info registers

关注:

  • x86: esp(栈顶)、ebp(栈基址)
  • x86_64: rsp、rbp

查看栈内存:

x/20x $rsp        # 从栈顶看20个十六进制
x/10x $rbp        # 从当前栈帧基址看
x/10wx $rsp       # 32位字

3. 切换栈帧

frame 1
info frame

可以看到:

  • 返回地址
  • 参数地址
  • 局部变量地址

二、从反汇编角度看栈(静态分析)

以 x86_64 为例(AT&T 语法):

push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp

含义:

  1. 保存旧 rbp
  2. 建立新栈帧
  3. 分配局部变量空间

常见栈布局(x86_64)

高地址
| 调用者返回地址 |
| 旧 rbp         |  <- rbp
| 局部变量       |
| 参数(溢出时) |
| ...            |  <- rsp
低地址

看参数和局部变量

  • 前 6 个参数:rdi, rsi, rdx, rcx, r8, r9
  • 多余参数:压栈
  • 局部变量:-0x4(%rbp)、-0x8(%rbp)

例子:

movl   $0x1,-0x4(%rbp)   # 局部变量 int a = 1

三、Linux 下常用反汇编工具

1. objdump(静态)

objdump -d ./a.out

配合栈看:

objdump -d -M intel ./a.out

2. gdb(动态最清晰)

gdb ./a.out
disassemble

3. radare2(逆向神器)

r2 -d ./a.out
pdf        # 反汇编当前函数
px @ rsp   # 看栈

四、栈溢出 / 漏洞分析中看栈

常见关注点:

  • 返回地址位置:rbp + 8
  • 缓冲区起始:rbp - 0x20
  • 覆盖返回地址 → 控制 RIP

示例:

buffer at rbp-0x20
return addr at rbp+8

五、总结一句话

静态看栈看 rbp/rsp 和偏移,动态看栈用 gdb 的 bt、x/xx $rsp、frame。

如果你愿意,可以:

  • 发一段反汇编代码
  • 或说你是 漏洞分析 / 逆向 / 调试崩溃 / 学汇编

我可以按你的场景具体讲。

0 踩