*%gs:0x10在汇编程序中做了什么?

时间:2017-01-17 06:43:52

标签: assembly x86 nasm reverse-engineering

以下语法在GASM中做了什么?

*%gs:0x10

我知道call *%gs:0x10来电__kernel_vsyscall,但我不知道*%register:value做了什么。

它的NASM等价物如下所示:call DWORD PTR gs:0x10

1 个答案:

答案 0 :(得分:2)

gs:0x10中指针的目标进行near absolute indirect (FF /2)调用。
请注意,gs是选择器寄存器,而不是通用寄存器(请参阅Protected mode) 该指令在偏移量0x10处读取DWORD(相对于段gs)并调用其值。
直接调用会产生另一种影响,可能涉及呼叫门。

gs:0x10libc copies the address of __kernel_vsyscall during its initialization.

的地方

AT&T syntax for the control transfer instructions

  

使用寄存器或存储器操作数的分支寻址必须以' *'为前缀。指定"远"控制转移,a' l'必须加上前缀,例如ljmplcall等。例如,

GAS syntax          NASM syntax
==========          ===========

jmp *100            jmp  near [100]
call *100           call near [100]
jmp *%eax           jmp  near eax
jmp *%ecx           call near ecx
jmp *(%eax)         jmp  near [eax]
call *(%ebx)        call near [ebx]
ljmp *100           jmp  far  [100]
lcall *100          call far  [100]
ljmp *(%eax)        jmp  far  [eax]
lcal *(%ebx)        call far  [ebx]
ret                 retn
lret                retf
lret $0x100         retf 0x100
     

使用以下格式指定段偏移指针:

jmp $segment, $offset