我正在反转 32 位 ELF 可执行文件。
我看到类似的东西:
mov al, byte ptr ds:xxxxx
xxxxx
是绝对地址。ds
这里的意义是什么?
我正在反转 32 位 ELF 可执行文件。
我看到类似的东西:
mov al, byte ptr ds:xxxxx
xxxxx
是绝对地址。ds
这里的意义是什么?
只是为了澄清备忘录的答案(缺乏一个很好的例子)。
当谈到段寄存器 ( cs
, ds
, es
, ss
) 时,语法的语义cs:0xdeadbeef
必须解释为存储在其中的前缀cs
和附加到它的值的串联。但是,如果我们退后一步看大图,可以将其视为:
0xdeadbeef
指向的内存段中的地址cs
。
事实上,从 Intel 8086 开始,这些 CPU 的内存模型是基于段的,这意味着每个段寄存器存储一个内存地址的前缀,这将允许访问一块内存用于特定用途。
正如您在下面的图片中看到的(由关于 Intel x86 内存分段的维基百科页面提供),主内存被分成几个内存段,并通过调用几个段寄存器来访问(不在图片上,但您可以猜到这些寄存器用 LDT 初始化)。
在你的情况下:
mov al, byte ptr ds:xxxxx
可能意味着您正在将变量从数据段移动到您的al
寄存器。
但是,在正常模式下不需要这种代码,因为ds
寄存器通常设置为零(并且在这样使用时没有效果)。相反,在保护模式下,ds
需要段寄存器指向正确的内存段。而且,这可能是来自在保护模式下执行的汇编代码的一行(除非它已被混淆,然后他们一直违反规则,我们无法在不知道价值的情况下再知道意图是什么的ds
)。
我希望这样更清楚一点!
在保护模式下,DS 是一个选择器,而不是一个段。它定义了物理地址、权限和其他属性。通常,例如您示例中的指令默认使用 DS,但这可以(通过指令前缀)覆盖以使用不同的指令(ES、FS、GS、SS 等)
看看英特尔的编程手册:https : //www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software-developer-vol-1-手册.html
这个答案只是为了解决评论中的查询
例如,fs[0] 在 TIb 结构上的 win32 点上。有没有其他方法可以得到这个地址?(我的意思是它在进程的 4Gb 地址空间中的哪个位置?)
在用户模式下,线程环境块由 fs:[0] 指向
您可以在windbg下使用以下任何命令在虚拟地址空间中查看它
0:000> ? fs
Evaluate expression: 59 = 0000003b
0:000> dd fs:[0] l 8
003b:00000000 0012f5b0 00130000 0012d000 00000000
003b:00000010 00001e00 00000000 7ffdf000 00000000
0:000> dd 3b:00000000 l8
003b:00000000 0012f5b0 00130000 0012d000 00000000
003b:00000010 00001e00 00000000 7ffdf000 00000000
0:000> dd @$thread l8
7ffdf000 0012f5b0 00130000 0012d000 00000000
7ffdf010 00001e00 00000000 7ffdf000 00000000
0:000> dd @$teb l8
7ffdf000 0012f5b0 00130000 0012d000 00000000
7ffdf010 00001e00 00000000 7ffdf000 00000000
0:000> ? @$teb
Evaluate expression: 2147348480 = 7ffdf000
0:000> ? @$thread
Evaluate expression: 2147348480 = 7ffdf000
使用 ds 选择器确认
0:000> ? ds
Evaluate expression: 35 = 00000023
0:000> dd ds:[7ffdf000] l8
0023:7ffdf000 0012f5b0 00130000 0012d000 00000000
0023:7ffdf010 00001e00 00000000 7ffdf000 00000000
在 x86 cs es ds 和 ss 都将指向相同的虚拟地址,但 fs 和 gs 不会如下所示
0:000> ? ds
Evaluate expression: 35 = 00000023
0:000> dd ds:[7ffdf000] l8
0023:7ffdf000 0012f5b0 00130000 0012d000 00000000
0023:7ffdf010 00001e00 00000000 7ffdf000 00000000
0:000> ? cs
Evaluate expression: 27 = 0000001b
0:000> dd cs:[7ffdf000] l8
001b:7ffdf000 0012f5b0 00130000 0012d000 00000000
001b:7ffdf010 00001e00 00000000 7ffdf000 00000000
0:000> dd es:[7ffdf000] l8
0023:7ffdf000 0012f5b0 00130000 0012d000 00000000
0023:7ffdf010 00001e00 00000000 7ffdf000 00000000
0:000> dd ss:[7ffdf000] l8
0023:7ffdf000 0012f5b0 00130000 0012d000 00000000
0023:7ffdf010 00001e00 00000000 7ffdf000 00000000
0:000> dd fs:[7ffdf000] l8
003b:7ffdf000 ???????? ???????? ???????? ????????
003b:7ffdf010 ???????? ???????? ???????? ????????
0:000> dd gs:[7ffdf000] l8
0000:f000 ???????? ???????? ???????? ????????
0000:f010 ???????? ???????? ???????? ????????