2014-03-01 1 views
4

를 사용하는 방법 : 나는 64 비트 콜 게이트를 통해 공을 울리도록 전환 할 경우 사용자 코드에서인텔 소프트웨어 개발자 maunal에서 호출 명령 지원 64 비트 콜 게이트

call r/m64 
call m16:32 
call m16:64 

을, selector 47. intel 구문을 사용하여 어셈블리에서 명령어를 작성하는 방법은 무엇입니까? 테스트

:

call far [mem]; wrong 
call qword ptr [mem]; wrong 

메모리 내용 :

[mem + 0]: qword 0x00 
[mem + 8]: word 47 
+0

긴 샷이지만 tword ptr은 10 바이트 구조 (기본적으로 80 비트 길이의 double)를 처리하는 데 사용됩니다. 또한 일부 어셈블러는 long call에'lcall'을 사용합니다. –

+0

난 단지 인터럽트 및 syscalls 링 제로로 전송할 수있을 줄 알았는데? 그것은 단순한 전화가 그것을 바꿀 수 있다면 결국 보안 기능이되지 않을 것입니다. – EOF

+0

아니요, 콜 게이트는 링 x (x> 0)에서 링 0을 입력하는 옵션입니다. 그런데 –

답변

1

올바른 키워드를 사용하기는 fword ptr입니다. 이렇게하면 m16:32 변형이 생성되지만 콜 게이트의 경우 오프셋이 무시되고 RIP의 전체 64 비트가 게이트에서로드되므로 괜찮습니다. 그러나 m16:64 포인터를 유지하려면 rex64 call fword ptr [mem] 또는 rex.w call fword ptr [mem]과 같이 접두어 REX을 수동으로 포함해야합니다.

+0

은 'far far'의 의미가 무엇인지 'call fword ptr [mem]'과 같지 않다는 것을 알았습니다. –

+0

생성 된 기계어 코드로 판단하면, 'far'는 조용히 무시 된 것으로 보이며,이 경우 근처 전화를 생성합니다. – Jester