2016-11-23 4 views
0

다음 어셈블리 명령이 발생했습니다 and rax, qword ptr [0xff5ff098]Qword ptr로 표시된 주소 위치 이해?

내가 알고 싶은 것은 다음 명령어에서 액세스 할 메모리 주소입니다. 메모리 주소 0xff5ff098이 0으로 확장되거나 최상위 비트만큼 확장됩니까?

도구에서 api IARG_MEMORYREAD_EA은 1만큼 확장을 제공합니다. 즉, 다음 주소는 0xffffffffff5ff098입니다. 이 주소가 가능한 주소입니까?

64 비트 시스템에서 작업하고 있습니다.

+0

32 비트 절대 주소가 0인지 부호 확장인지에 대한 질문이 지난 한 해 동안 있었지만, 어쨌든 정확한 중복이 아닐 수 있습니다. 나는 Jester가 그것을 대답했다는 것을 기억하는 것 같다. –

답변

3

인코딩 방법은 무엇입니까? RIP 상대 또는 절대?

absolute 인 경우 sign-extended-disp32 주소 지정 모드를 사용합니다 (관련 레지스터가없는 경우에도 32-bit displacements in addressing modes are always sign extended이기 때문에).

RIP 상대라면 디스어셈블러가 RIP + rel32에서 계산 한 정확한 최종 주소를 표시해야합니다.

디스어셈블러 나 PIN이 실제로 부호가 64 비트로 확장 되었기 때문에 디스어셈블러가 잘못 표시하고 있습니다.


예, x86-64에서는 RIP- 상대 주소 지정과 절대 주소 지정이 모두 가능합니다.

x86-32에는 레지스터가없는 어드레싱 모드 [disp32]을 인코딩하는 두 가지 중복 방법이 있습니다. x86-64는 RIP 상대 주소로 더 짧은 주소를 사용하고 더 긴 주소는 [sign-extended-disp32] 절대 주소로 지정합니다.

예를 들어 NASM 구문을 사용합니다. 당신은 RIP 상대 기본적으로 사용하는 default rel을 사용할 수 있으며,이 같은 사례별로 대체 할 수 있습니다 :이 주소는 가능한 주소

MOV  RAX, [abs FS:_start] ; _start just as something that assembles 
    MOV  RAX, [rel FS:_start] ; RIP-rel for thread-local is usually not useful! 

64 48 8b 04 25 b5 00 40 00 mov rax,QWORD PTR fs:0x4000b5 
64 48 8b 05 e7 fe ff ff  mov rax,QWORD PTR fs:[rip+0xfffffffffffffee7] # 4000b5 <_start> 

인가?

예, 표준 범위의 상반부에있는 주소가 사용됩니다. 예 : 주소 즉, 비트 47의 복사본입니다 [63:48] 비트는 부호 연장 낮은 48 비트에서 얻을 것이 무엇이라고

ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0     [vsyscall] 

정식 주소가 의미 less /proc/self/maps는 리눅스가 높은 주소 공간에 내보내는 vsyscall 페이지를 매핑하는 것을 보여줍니다 . 비표준 주소는 현재 하드웨어에서 항상 오류가 발생하므로 이러한 중복 비트가 포함 된 태그가있는 포인터를 구현하려는 경우 역 참조하기 전에 부호 확장을 다시 실행해야합니다. qword ptr 당신 피연산자 크기가 아닌 어드레싱 모드를 인코딩하는 방법에 대해 아무것도 알 수 있다는


참고.