나는 메모리 주소를 더 잘 이해하려고 노력하고 있습니다. 방금 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