在 Linux 下进行反汇编(比如用 objdump、gdb、IDA、radare2 等)时,“看栈”通常包含几层意思:看栈内存内容、看函数调用栈(backtrace)、看栈帧结构、看参数和局部变量怎么放在栈上。下面按实用角度讲。
bt
bt full
bt:显示函数调用栈(EIP/RIP + 返回地址)bt full:连局部变量一起显示info registers
关注:
esp(栈顶)、ebp(栈基址)rsp、rbp查看栈内存:
x/20x $rsp # 从栈顶看20个十六进制
x/10x $rbp # 从当前栈帧基址看
x/10wx $rsp # 32位字
frame 1
info frame
可以看到:
以 x86_64 为例(AT&T 语法):
push %rbp
mov %rsp,%rbp
sub $0x20,%rsp
含义:
rbp高地址
| 调用者返回地址 |
| 旧 rbp | <- rbp
| 局部变量 |
| 参数(溢出时) |
| ... | <- rsp
低地址
rdi, rsi, rdx, rcx, r8, r9-0x4(%rbp)、-0x8(%rbp)例子:
movl $0x1,-0x4(%rbp) # 局部变量 int a = 1
objdump -d ./a.out
配合栈看:
objdump -d -M intel ./a.out
gdb ./a.out
disassemble
r2 -d ./a.out
pdf # 反汇编当前函数
px @ rsp # 看栈
常见关注点:
rbp + 8rbp - 0x20示例:
buffer at rbp-0x20
return addr at rbp+8
静态看栈看
rbp/rsp和偏移,动态看栈用gdb的bt、x/xx $rsp、frame。
如果你愿意,可以:
我可以按你的场景具体讲。