在这个screenshot中,我可以看到下面的反汇编代码:
... mov eax, gs:0x14 ... call 0x8058210 <close> ...
<close>在这里做什么?什么是gs:?谢谢你的帮忙
<close>
gs:
jgzswidk1#
这里的<close>是什么意思?它仅仅是地址0x8058210(由call指令调用的函数的地址)是函数close的地址的信息:这意味着指令call 0x8058210调用函数close()。什么是gs:?在16位和32位x86 CPU上,每当访问内存时,都会使用所谓的“选择器”。简单地说,这些“选择器”指定要访问的存储区。寄存器cs、ds、es、fs、gs和ss保存“选择器”值,因此指定了存储区。默认情况下,指令mov eax, [0x14]将访问ds寄存器指定的内存区域中的地址0x14。gs:表示不访问ds寄存器指定的内存区域,而是访问gs寄存器指定的内存区域。(By顺便说一句:我希望指令显示为mov eax, [gs:0x14]或mov eax, gs:[0x14]。)与16位x86操作系统不同,大多数(但不是全部)32位操作系统将所有代码和数据存储在同一内存区域中。因此,在这类操作系统的代码中,通常看不到类似mov ax, ss:[ebp-0x10]的指令。然而,许多操作系统使用一个或两个额外的内存区域(由寄存器fs和/或gs指定)。在Linux下,由gs指定的内存区域保存所谓的线程本地存储。
0x8058210
call
close
call 0x8058210
close()
cs
ds
es
fs
gs
ss
mov eax, [0x14]
0x14
mov eax, [gs:0x14]
mov eax, gs:[0x14]
mov ax, ss:[ebp-0x10]
1条答案
按热度按时间jgzswidk1#
这里的
<close>
是什么意思?它仅仅是地址
0x8058210
(由call
指令调用的函数的地址)是函数close
的地址的信息:这意味着指令
call 0x8058210
调用函数close()
。什么是
gs:
?在16位和32位x86 CPU上,每当访问内存时,都会使用所谓的“选择器”。
简单地说,这些“选择器”指定要访问的存储区。寄存器
cs
、ds
、es
、fs
、gs
和ss
保存“选择器”值,因此指定了存储区。默认情况下,指令
mov eax, [0x14]
将访问ds
寄存器指定的内存区域中的地址0x14
。gs:
表示不访问ds
寄存器指定的内存区域,而是访问gs
寄存器指定的内存区域。(By顺便说一句:我希望指令显示为
mov eax, [gs:0x14]
或mov eax, gs:[0x14]
。)与16位x86操作系统不同,大多数(但不是全部)32位操作系统将所有代码和数据存储在同一内存区域中。
因此,在这类操作系统的代码中,通常看不到类似
mov ax, ss:[ebp-0x10]
的指令。然而,许多操作系统使用一个或两个额外的内存区域(由寄存器
fs
和/或gs
指定)。在Linux下,由
gs
指定的内存区域保存所谓的线程本地存储。