상대 오프셋 대신 hexdump에서 절대 메모리 주소를 가져옵니다.

상대 오프셋 대신 hexdump에서 절대 메모리 주소를 가져옵니다.

나는 메모리 주소를 더 잘 이해하려고 노력하고 있습니다. 방금 hexdump.Ex 출력으로 바이너리를 확인하기 시작했습니다 .

0000000 cf fa ed fe 07 00 00 01 03 00 00 80 02 00 00 00
0000010 0e 00 00 00 b0 03 00 00 85 00 00 00 00 00 00 00
0000020 19 00 00 00 48 00 00 00 5f 5f 50 41 47 45 5a 45
0000030 52 4f 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0000040 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00

내가 이해한 바에 따르면 각 줄의 시작 부분에 표시되는 코드는 기본 주소의 오프셋으로 표현된 상대 메모리 주소입니다. 절대주소를 알 수 있는 방법이 있는지 궁금합니다.

이러한 주소를 명시적으로 표시하거나 해당 주소가 상대적인 기본 주소를 파악하여 직접 계산할 수 있도록 도와주는 솔루션이 있으면 기쁠 것입니다.

답변1

Hexdump는 주소(또는 메모리)에 대해 아무것도 모릅니다. 단지 바이트 스트림을 인쇄하고 지금까지 본 바이트 수를 앞에 추가합니다. 입력이 파일에서 오는 경우 이 숫자는 파일의 위치에 해당합니다.

파일이 로드된 후 이러한 바이트가 메모리에서 끝나는 위치를 파악하려면 파일의 메타데이터를 살펴봐야 합니다. ELF 파일의 경우 이는 섹션 헤더(경우에 따라 프로그램 헤더)를 의미합니다.

readelf -S path/to/your/binary다음과 같이 표시합니다.

Section Headers:
  [Nr] Name              Type             Address           Offset
       Size              EntSize          Flags  Link  Info  Align
  [13] .text             PROGBITS         000000000050eac0  0010eac0
       0000000001833275  0000000000000000  AX       0     0     16

여기서 "Offset" 값은 파일에서 특정 섹션이 시작되는 위치이고, "Address" 값은 해당 가상 주소(메모리에서 끝나는 위치)입니다. hexdump주소를 얻으려면 이 둘의 차이를 숫자에 더하면 됩니다 .

objdump -h path/to/your/binary다음을 사용하여 동일한 데이터를 얻을 수도 있습니다 .

Sections:
Idx Name          Size      VMA               LMA               File off  Algn
 12 .text         01833275  000000000050eac0  000000000050eac0  0010eac0  2**4
                  CONTENTS, ALLOC, LOAD, READONLY, CODE

마찬가지로 "File off"는 파일의 오프셋이고 "VMA"는 해당 가상 주소입니다. "LMA"가 무엇인지 궁금하다면 살펴보세요여기.

답변2

제가 이해한 바로는 절대 물리적 주소는 매우 안전합니다. 하지만 논리 주소를 찾는 방법이 있습니다. 학습 목적으로 무한 루프를 포함하고 백그라운드에서 실행되는 간단한 C 프로그램을 작성할 수 있습니다. 프로그램이 실행되는 동안 Linux 유틸리티인 "pmap"을 사용하여 프로그램의 가상 주소를 우회할 수 있습니다. Linux zsh의 백그라운드에서 실행 파일을 실행하는 명령:

실행 파일 이름 및
pmap -x process_id

관련 정보