2017-01-17 2 views
1

GASM에서 다음 구문이 수행하는 작업은 무엇입니까?* % gs : 0x10은 어셈블러에서 무엇을합니까?

*%gs:0x10 

나는 알고 call *%gs:0x10 호출 __kernel_vsyscall 것입니다,하지만 난 할 *%register:value 모르겠어요.

그건 NASM 동등한은 다음과 같습니다 call DWORD PTR gs:0x10

+1

은'call gs : 0x10'에서'gs : 0x10'는 메모리 피연산자입니다. 'gs : 0x10 '은 점프 할 주소가 저장된 주소입니다. 이것은 절대 주소에 대한 메모리 간접 호출입니다. _GS_은 메모리 참조를 수행하는 세그먼트 선택기입니다. –

답변

2

그것은 gs:0x10에서 포인터의 대상에 대한 near absolute indirect (FF /2) 전화입니다.
gs은 선택 레지스터이며 범용 레지스터가 아닙니다 (Protected mode 참조).
명령은 (세그먼트 gs에 상대적인) 오프셋 0x10에서 DWORD를 읽고 해당 값을 호출합니다.
직접 호출은 전적으로 호출 게이트와 관련된 다른 영향을 미칩니다. libc copies the address of __kernel_vsyscall during its initialization.

AT&T syntax for the control transfer instructions 레지스터 또는 메모리 오퍼랜드를 사용하여 어드레싱

분기가 '*'로 붙여야이다


gs:0x10이다.

jmp $segment, $offset 
다음 형식을 사용하여, 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 

세그먼트 오프셋 포인터가 지정됩니다는 "지금까지"제어 tranfers하는 'L'접두사해야을 지정하려면

+0

감사합니다. 알고 있습니다. x64 시스템에서''__kernel_vsyscall'''을 호출하는 방법을 알고 있습니까? x64에서''''call * % gs : 0x10'''에 해당하는 것은 무엇입니까? – user7428910

+0

@ user7428910 x64에서는 더 쉽지만'syscall' 명령을 사용하십시오. 보다 유익한 가이드는 [here] (https://filippo.io/linux-syscall-table/) –

+0

예, 알고 있습니다. syscall은 x64에서는 정상적인 방법이지만 순수한 호기심 인 __kernel_vsyscall을 사용하고자합니다. – user7428910

관련 문제