WORD
farcall[3];
farcall[2]
= (selector<<3);
_asm
{
mov ebx,x
push ebx
call fword ptr [farcall]
mov res,eax
}
위의 코드가 뭘 의미하는지 모르겠습니다. opcode는 ff 이고 값은 6바이트입니다. 인텔 매뉴얼 보면 이런 형식이 call m16:32 로 나오는데, 설명을 이해 못하겠습니다. 타입이 두개로 나뉘는데 B ModRM:r/m(r) 입니다. 설명은 다음과 같습니다. In 64-bit mode: if selector points to a gate, then RIP = 64-bit displacement taken from gate else RIP = zero extended 32-bit offset from far point referenced in the instruction. 64-bit mode는 아니니까 RIP = 32-bit offset 으로 확장된 zero 이거나 RIP = zero 이고 32-bit offset 으로 확장된거 둘 중 하나같은데 이 명령어의 정확한 의미를 알려주시면 갑사하겠습니다 ㅠ_ㅠ
댓글 4
-
김태훈
2010.04.13 06:37
-
박한범
2010.04.13 08:52
태훈님이 보신 글에 나오는 내용이 맞습니다.
CALL GATE 와 Data 참조와 Code 참조시에 사용되는 권한 검사는 인텔 매뉴얼을 통해 알게 되었습니다.
이해가 되지 않는 부분은 far call 시에 call m16:32 가 어떤 식으로 동작하는가? 입니다.
조금만 더 알려주실 수 없으실까요? 인텔 매뉴얼을 참고했지만, 위에 나온 설명을 가지고는 이해하기가 어렵네요.
부탁드립니다.
-
김태훈
2010.04.13 09:39
인텔 메뉴얼 vol. 2A/3-5에 관련 내용이 있습니다.
m16:16, m16:32 & m16:64 — A memory operand containing a far pointer
composed of two numbers. The number to the left of the colon corresponds to the
pointer's segment selector. The number to the right corresponds to its offset.'segment selector(16bit):offset(32bit)' 입니다. 'm'은 메모리에 오퍼랜드가 있다는 의미이구요.
64bit 모드이면 위의 selector가 gate(call gate 겠죠?)를 가리키고 gate로 부터 RIP는 64bit로 바뀌고
아니면 RIP 0에서 명령어에서 far pointer가 참조하는 확장된 32bit offset(?)입니다.
(문장이 어렵네요;;)
-
박한범
2010.04.13 09:54
감사합니다 :D
.
Entering the kernel without a driver and getting interrupt information from APIC
검색을 해보니 위 기사의 코드 중 일부인것 같네요. 나쁜 용도로 쓰시는건 아니시겠죠?^^
원래 process가 실행하면서 특권 모드로 실행해야 하는 경우가 발생합니다. 이럴때 System call을 하게되죠. 아키텍처 관점에서는 system call은 software interrupt입니다. (INT 0x80/SYSCALL) 커널 관점에서 system call을 통해서 user mode -> kernel mode로 전환하죠. 아키텍처(INTEL) 관점에서는 ring 3 mode -> ring 0 mode로 전환이 됩니다.
그런데, 다른 방법으로 ring 0 mode로 전환 할 수 있습니다. 바로 CALL GATE 라는 걸 사용해서 할 수 있죠. CALL GATE는 말그대로 '함수를 호출(CALL)하는 문(GATE)' 입니다. 여기서 호출하는 함수가 ring 0 mode에 있는 함수 입니다.
CALL GATE 사용법은 (1) call gate 디스크립터 설정 (2) GDT에 call gate 디스크립터 설정 (3) call far로 호출
형태로 사용합니다. 정확한 사용법은 INTEL이나 AMD 메뉴얼을 참고하십시오.
위 코드는 call far로 call gate를 통해서 ring 0 mode의 함수를 호출하는 루틴입니다. (악의적인 용도로 쓰면...)
RIP는 long mode에서 사용되는 PC(IP)-프로그램 카운터(명령어 포인터) 입니다.
RIP(64bit) - EIP(32bit)
그냥 64bit 모드가 아니면 하위 32bit만 사용하고, 이 떄 그냥 EIP라고 합니다. 참고로 32bit에서 레지스터는 E..으로 불리고, 64bit 레지스터는 R..으로 불립니다.