为什么偏移量运算符返回巨大的偏移量,而变量位于.data段的开头?

问题描述 投票:0回答:2

如果偏移量运算符应该返回变量到其封闭线段开头的距离,那么为什么返回的偏移量总是一个很大的数字?在下面的示例中,变量num在.data段中是第一个。它不是必须在0偏移处吗?在我的机器上,我得到00007FF7C90A4000偏移量。我不明白。

.data 
num byte 123
.code   
mov rsi, offset num
assembly x86-64 masm
2个回答
2
投票

OFFSET运算符的确从段的开头返回偏移量,但是64位(和32位)代码使用平面存储器模型,其中只有一个段,并且该段覆盖了从地址0开始的整个线性地址空间。 [.data.code指令实际上并没有创建两个不同的段,它们在一个平面段中创建了两个段。

在特定情况下偏移量如此之高的原因是,Windows将在可能的情况下在随机线性地址处加载程序。这样做是一种安全措施,可以使各种缓冲区溢出攻击更难以发挥作用。由于单个平面段的底数为0,并且Windows显然决定将程序加载到地址0x00007FF7C90A0000左右,因此.data节开始处的偏移量与该段的开始处相距很远地址0。


3
投票

这看起来像是64位代码。 64位代码通常在64位保护模式的OS(例如Windows或Linux)下运行。这些系统在任意的起始地址处加载程序,而不必在逻辑0处加载程序。因此,您获得的偏移量是数据部分中变量的偏移量,即进程存储器中数据部分的起始地址plus

© www.soinside.com 2019 - 2024. All rights reserved.