如何计算堆栈段(SS)内的值

逆向工程 部件 x64dbg
2021-07-01 11:02:37

我有一个装配行,其中包含以下信息:

EBP = 006FFB50
SS  = 002B  

当我查看这一行时:

mov eax,dword ptr ss:[ebp+8]  

我假设 EBP + 8 = 006FFB50 + 8 = 006FFB58。
但根据 x64DBG,这是结果:

dword ptr [ebp+8]=[006FFB58]=006FFC98  

我不明白它是如何计算的。
为什么ss:[006FFB58]等于006FFC98

图片供参考,了解更多信息:
在此处输入图片说明

1个回答

寄存器ss, cs, ds, es, gs,fs是特殊的。它们被称为段寄存器,包含的不是地址而是选择器

CPU 使用选择器作为对段的引用 - 具有特定基址(起始地址)、限制(结束地址)和权限的内存区域。

选择器和段由操作系统设置,理论上可能有许多不同的段,但实际上所有现代操作系统都使用平面内存段(32 位进程为 0 到 0xFFFFFFFF)作为标准代码和数据段(ss, cs, ds1 . 这意味着在表达式中ss:[ebp+8],只有 的值EBP用于计算地址。在你的情况下确实是正确的

EBP + 8 = 006FFB50 + 8 = 006FFB58

与括号中显示的值匹配。

但是,=调试器中符号后面的值不是计算结果,而是内存中该地址处的值如果您打开内存转储并转到地址 006FFB58,您应该会看到006FFC98那里。

调试器提示中的括号表示内存取消引用,类似于程序集语法。

1 gs并被fs区别对待,通常用于线程本地存储 (TLS) 块,该块对于每个线程都不同,并且不从 0 开始,因此例如 fs:0 不会映射到 RAM 地址 0。