GASM에서 다음 구문이 수행하는 작업은 무엇입니까?* % gs : 0x10은 어셈블러에서 무엇을합니까?
*%gs:0x10
나는 알고 call *%gs:0x10
호출 __kernel_vsyscall
것입니다,하지만 난 할 *%register:value
모르겠어요.
그건 NASM 동등한은 다음과 같습니다 call DWORD PTR gs:0x10
GASM에서 다음 구문이 수행하는 작업은 무엇입니까?* % gs : 0x10은 어셈블러에서 무엇을합니까?
*%gs:0x10
나는 알고 call *%gs:0x10
호출 __kernel_vsyscall
것입니다,하지만 난 할 *%register:value
모르겠어요.
그건 NASM 동등한은 다음과 같습니다 call DWORD PTR gs:0x10
그것은 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'접두사해야을 지정하려면
감사합니다. 알고 있습니다. x64 시스템에서''__kernel_vsyscall'''을 호출하는 방법을 알고 있습니까? x64에서''''call * % gs : 0x10'''에 해당하는 것은 무엇입니까? – user7428910
@ user7428910 x64에서는 더 쉽지만'syscall' 명령을 사용하십시오. 보다 유익한 가이드는 [here] (https://filippo.io/linux-syscall-table/) –
예, 알고 있습니다. syscall은 x64에서는 정상적인 방법이지만 순수한 호기심 인 __kernel_vsyscall을 사용하고자합니다. – user7428910
은'call gs : 0x10'에서'gs : 0x10'는 메모리 피연산자입니다. 'gs : 0x10 '은 점프 할 주소가 저장된 주소입니다. 이것은 절대 주소에 대한 메모리 간접 호출입니다. _GS_은 메모리 참조를 수행하는 세그먼트 선택기입니다. –