我正在反转32位的ELF可执行文件。

我看到类似以下内容: xxxxx在这里是什么意思?

评论

是的,但是地址是绝对的,所以我不明白为什么会有分段的概念

段寄存器在保护模式(32位)中有不同的用途。大多数段的基地址为0,但具有控制保护。

因此,您的意思是,如果我将ds更改为其他细分,则不会更改地址,而仅更改限制吗?如何更改ds值?

@ Bob5421 mov ds,ax应该适用于ds和其他段寄存器。 cs只能通过远jmp /远距离调用/远距离ret / iret来操作

堆栈溢出时重复:2 1

#1 楼

此答案只是为了解决注释中的查询


例如TIb结构上win32点上的fs [0]。还有
获取此地址的另一种方法吗? (我的意思是它在进程的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  ???????? ???????? ???????? ????????


#2 楼

只是为了澄清备忘录的答案(缺少一个很好的例子)。

当谈到段寄存器(csdsesss)时,语法cs:0xdeadbeef的语义必须解释为存储在cs中的前缀的串联及其附加的值。但是,如果我们退后一步看大图,它可以看作是:


0xdeadbeef指向的内存段中的地址cs


实际上,从Intel 8086开始,这些CPU的内存模型是基于段的,这意味着每个段寄存器都为该内存地址存储了一个前缀,这将允许到达特定用途的一块内存。
如您在下面的图片中所见(有关Wiki xia Intel x86内存分段的信息,请参见Wikipedia页面),主内存被切成几个内存段,并通过调用多个段寄存器来访问(不在图片中,但您可以猜想这些寄存器是用LDT初始化的。)



在您的情况下:可能意味着您正在将变量从数据段移至al寄存器。

但是,由于ds寄存器通常设置为零(在那样使用时无效),因此在正常模式下不需要这种代码。相反,在保护模式下,将需要ds段寄存器指向正确的存储器段。并且,这可能是来自以保护模式执行的汇编代码的一行(除非对其进行了模糊处理,否则它们始终会违反规则,并且我们无法在不知道其值的情况下再说出什么意图)代表ds)。

我希望这样子更清楚!

#3 楼

在保护模式下,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-manual.html

评论


我不明白:在32位x86系统上,该进程的地址空间为4GB,从000000开始到FFFFFFFF。例如,如果我写动议,字节ptr 12341234,我不明白选择器的这个概念...

–Bob5421
18年8月6日在8:41

@ Bob5421即使大多数操作系统使用平面内存布局,处理器仍支持选择器。并且,例如,fs和gs选择器通常具有非零基数。

–伊戈尔·斯科钦斯基♦
18年8月6日在9:56

例如,win32上的fs [0]指向TIb结构。还有另一种获取此地址的方法吗? (我的意思是它在进程的4Gb地址空间中的什么位置?)

–Bob5421
18年8月6日在16:43