以下语法在GASM中做了什么?
*%gs:0x10
我知道call *%gs:0x10
来电__kernel_vsyscall
,但我不知道*%register:value
做了什么。
它的NASM等价物如下所示:call DWORD PTR gs:0x10
答案 0 :(得分:2)
对gs:0x10
中指针的目标进行near absolute indirect (FF /2)调用。
请注意,gs
是选择器寄存器,而不是通用寄存器(请参阅Protected mode)
该指令在偏移量0x10处读取DWORD(相对于段gs
)并调用其值。
直接调用会产生另一种影响,可能涉及呼叫门。
gs:0x10
是libc copies the address of __kernel_vsyscall
during its initialization.
AT&T syntax for the control transfer instructions是
使用寄存器或存储器操作数的分支寻址必须以' *'为前缀。指定"远"控制转移,a' l'必须加上前缀,例如
ljmp
,lcall
等。例如,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