🧭 메모리 주소의 높낮이 기준
컴퓨터 메모리에서 "높다" 또는 "낮다"는 주소 값(Address Value)의 크기를 의미합니다.
1. 주소가 높다 (High Address)
- 의미: 주소 값이 큰 숫자입니다.
- 예시: 0xFFFFFFF0 (가장 높은 주소에 가까움)
- 물리적 비유: 아파트의 고층이나 건물의 옥상과 같습니다.
2. 주소가 낮다 (Low Address)
- 의미: 주소 값이 작은 숫자입니다.
- 예시: 0x00000010 (가장 낮은 주소에 가까움)
- 물리적 비유: 아파트의 저층이나 건물의 지하와 같습니다.
📈 스택(Stack)에서의 높낮이와 ESP
스택 메모리는 데이터가 쌓이는 방식 때문에 이 높낮이 개념이 특히 중요합니다.
1. 스택의 시작과 성장 방향
대부분의 x86 아키텍처(OSCP 타겟 환경)에서 스택 메모리는 높은 주소에서 시작하여 데이터를 저장할 때마다 낮은 주소 쪽으로 성장합니다.
| 위치 | 메모리 주소 | 저장된 데이터 (시간 순) |
|---|
| 시작 지점 | 높은 주소 | 오래된 함수 정보 (메인 함수 등) |
| ↓ 성장 | ↓ | EBP, 반환 주소 (EIP), 지역 변수... |
| 현재 최상단 | 낮은 주소 | 가장 최근에 추가된 데이터 |
2. ESP (스택 포인터)의 역할
ESP (Extended Stack Pointer)는 이 성장하는 스택의 '현재 최상단'을 항상 가리킵니다.
- 따라서 ESP가 가리키는 주소는 현재 스택에서 가장 낮은 주소 값을 가지며, 이곳이 가장 최근에 사용된 메모리입니다.
- 우리가 Shellcode와 NOP 슬라이드를 스택에 넣으면, 그것들은 ESP가 가리키는 가장 낮은 주소 근처에 위치하게 됩니다.
✅ 최종 정리:
- 가장 낮은 주소 ≈ 스택의 현재 입구 ≈ ESP가 가리키는 곳 ≈ 가장 최근 데이터 위치
- 버퍼 오버플로우는 낮은 주소 쪽으로 성장하는 스택에서 버퍼가 높은 주소에 있는 EIP를 덮어쓰는 공격입니다.