You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ghidra与IDA加载同二进制栈偏移不一致问题咨询

Ghidra与IDA栈变量偏移差异解析

问题背景

将同一二进制文件分别加载至Ghidra与IDA中,查看main()函数时发现二者展示的栈变量存在偏移差异:

Ghidra栈变量展示

undefined main()
             undefined         AL:1           <RETURN>
             undefined4        Stack[-0x18]:4 local_18                                XREF[2]:     004005f6(W), 
                                                                                                   00400609(R)  
             undefined1        Stack[-0x58]:1 local_58                                XREF[1]:     004005fd(*)  
             undefined4        Stack[-0x5c]:4 local_5c                                XREF[1]:     004005e5(W)  
             undefined8        Stack[-0x68]:8 local_68                                XREF[1]:     004005e8(W)  

IDA栈变量展示

.text:00000000004005DD main            proc near               ; DATA XREF: _start_c+19↑o
.text:00000000004005DD
.text:00000000004005DD var_60          = qword ptr -60h
.text:00000000004005DD var_54          = dword ptr -54h
.text:00000000004005DD var_50          = byte ptr -50h
.text:00000000004005DD var_10          = dword ptr -10h

核心疑问:

  • 四组对应变量(var_10与local_18、var_50与local_58、var_54与local_5c、var_60与local_68)的栈偏移存在0x8的差值,为何同一二进制文件的栈帧会出现此差异?
  • Ghidra反汇编中显示语句:LEA RAX=>local_58,[RBP + -0x50],但local_58标注的栈偏移为Stack[-0x58]:1 local_58,该如何理解?

解答

1. 栈偏移0x8差值的原因

本质是Ghidra与IDA对栈偏移的基准计数点定义不同:

  • IDA的栈变量偏移直接以RBP(基址指针)为基准,比如var_10 = dword ptr -10h,指的是内存地址RBP-0x10。
  • Ghidra默认会将函数调用时压入栈的**返回地址(x86_64架构下为8字节)**计入偏移计算。在x86_64函数的标准栈帧中,call指令会把返回地址压栈,函数开头执行push rbp; mov rbp, rsp后,RBP指向栈底,RBP+8是返回地址。Ghidra的Stack[-0x18]实际对应RBP-0x10(即0x18-0x8=0x10),相当于从返回地址的上方空间开始计数偏移。

简言之:Ghidra显示的栈偏移 = IDA显示的栈偏移 + 8字节(返回地址大小),因此所有对应变量的偏移都差了0x8。

2. Ghidra中LEA语句的标注矛盾解释

这是Ghidra的UI显示逻辑与实际指令逻辑的表现差异,并非错误:

  • 指令LEA RAX=>local_58,[RBP + -0x50]是准确的,实际指向的内存地址为RBP-0x50,与IDA中的var_50位置完全一致。
  • Ghidra标注的Stack[-0x58]:1 local_58是它自身的偏移计数方式(包含返回地址的8字节),因此Stack[-0x58]等价于RBP-0x50(计算方式:0x58-0x8=0x50)。
  • 这种标注差异只是Ghidra的显示规则,实际对应的栈内存位置是正确的,和IDA指向同一块空间。

内容的提问来源于stack exchange,提问作者user656857

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 08:16:01