【问题标题】:What does *%gs:0x10 do in assembler?*%gs:0x10 在汇编器中有什么作用?
【发布时间】:2017-06-01 03:07:07
【问题描述】:

以下语法在 GASM 中的作用是什么?

*%gs:0x10

我知道call *%gs:0x10 会调用__kernel_vsyscall,但我不知道*%register:value 会做什么。

它的 NASM 等效项如下所示:call DWORD PTR gs:0x10

【问题讨论】:

  • call gs:0x10中,gs:0x10是一个内存操作数。 gs:0x10 是存储要跳转的地址的地址。这是对绝对地址的内存间接调用。 GS 是用于进行内存引用的段选择器。

标签: assembly x86 nasm reverse-engineering


【解决方案1】:

这是对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

使用寄存器或内存操作数的分支寻址必须以“*”为前缀。要指定“远”控制传输,必须以“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

【讨论】:

  • 谢谢,我明白了。你知道如何在 x64 系统上call __kernel_vsyscall 吗? x64 中的call *%gs:0x10 等价于什么?
  • @user7428910 在 x64 上更容易,使用指令 syscall。更多信息指南是here
  • 是的,我知道。 syscall 是 x64 上的正常方式,但我对使用 __kernel_vsyscall 很感兴趣,纯粹是好奇
  • @user7428910 vDSO mapped for x64 processes 不导出 __kernel_vsyscall 符号(查看链接的手册页,每个架构都有一个特定的部分)。对于兼容模式下的 32 位进程,您可以像在 x86 上一样进行操作。
  • 好的,我明白了。
猜你喜欢
  • 2012-03-04
  • 2011-04-29
  • 1970-01-01
  • 1970-01-01
  • 2011-11-09
  • 1970-01-01
  • 2013-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多