💻 NOP Sled (No-Operation Sled) 설명
NOP Sled는 No-Operation (아무 작업도 하지 않음) 명령어로 구성된 긴 연속된 영역(슬라이드 또는 썰매)을 의미합니다.
-
NOP (No-Operation) 명령어:
- 중앙 처리 장치 (CPU, Central Processing Unit)에게 "아무것도 하지 말고 다음 명령어로 이동하라"고 지시하는 명령어입니다.
- 주로 x86 아키텍처에서는 기계어 코드로
\x90 (헥사값)을 사용합니다.
-
Sled (썰매):
- 공격자는 버퍼를 채울 때 쉘코드 앞에 이 NOP 명령어를 수십~수백 바이트 길이로 삽입합니다. 이 NOP의 긴 연속체를 NOP Sled라고 부릅니다.
❓ 왜 NOP Sled를 사용하나요?
스택 기반 버퍼 오버플로우 공격의 목표는 함수의 Return Address (RET, 복귀 주소)를 공격자가 삽입한 Shellcode (쉘코드)의 시작 주소로 덮어쓰는 것입니다.
하지만 다음과 같은 이유로 쉘코드의 정확한 시작 주소를 알아내기가 어렵습니다.
- 메모리 주소의 부정확성: 운영체제나 환경 변수 등의 영향으로 버퍼가 스택에 할당되는 주소가 실행할 때마다 조금씩 달라지거나(특히 ASLR, Address Space Layout Randomization이 활성화된 경우), 디버거를 사용하지 않으면 정확한 주소를 예측하기 어렵습니다.
- 작은 타겟 영역: 쉘코드 자체의 크기는 상대적으로 작기 때문에, 복귀 주소(RET)를 정확히 쉘코드의 시작점에 맞추는 것이 어렵습니다.
NOP Sled는 이 문제를 다음과 같이 해결합니다:
- 타겟 영역 확장: NOP Sled는 쉘코드보다 훨씬 긴 영역을 차지합니다.
- 실행 흐름 유도: 공격자는 RET를 쉘코드의 정확한 시작 주소가 아니라, NOP Sled 영역 내의 아무 곳으로 덮어씁니다.
- 썰매 타기: RET에 덮어쓴 주소로 프로그램 실행 흐름이 이동하면, CPU는 NOP 명령어를 만나 아무 작업 없이 다음 NOP 명령어로 계속 순차적으로 이동합니다. 마치 썰매를 타듯이 쭉 미끄러져 내려갑니다.
- 쉘코드 실행: NOP Sled의 끝에 도달하면, 바로 그 뒤에 위치한 Shellcode가 실행됩니다.
결론적으로, NOP Sled는 공격자가 복귀 주소를 "NOP Sled 영역 내의 광범위한 주소 중 하나"로만 맞춰도 공격이 성공할 수 있도록 오차 범위를 크게 늘려주는 역할을 합니다.
🛡️ 방어 기법과의 관계
NOP Sled는 매우 유명하고 고전적인 공격 기법이므로, 침입 탐지 시스템 (IDS, Intrusion Detection System)이나 침입 방지 시스템 (IPS, Intrusion Prevention System)과 같은 보안 솔루션들은 메모리에서 긴 \x90 (NOP 명령어)의 연속된 패턴을 탐지하여 공격을 막으려고 시도합니다.
이러한 방어를 우회하기 위해 공격자들은 다음과 같은 변형된 NOP Sled를 사용하기도 합니다.
- 비표준 NOP: 의미 없는 연산(예: 레지스터에 0을 더하는 명령어, 같은 레지스터끼리 데이터를 옮기는 MOV 명령어 등)을 NOP 대신 사용하여 패턴 탐지를 피합니다.
- 랜덤 명령어: 무작위로 선택되었지만, 쉘코드 실행에 영향을 미치지 않는 명령어들을 섞어 사용합니다.