본문 바로가기

NX(No-eXecute) & ASLR(Address Space Layout Randomization)

@eouya22025. 6. 26. 10:21

 

공격자가 특정 프로그램에서 다음과 같은 조건을 만족하여 셸코드를 실행할 수 있었다.

1. 스택 버퍼 오버플로우 취약점을 악용한 return address 조작

2. 버퍼의 주소 값을 쉽게 알 수 있어서 버퍼에 셸코드를 입력 가능

3. 해당 버퍼가 저장된 메모리가 실행권한이 있어서 셸코드를 실행 가능

 

첫번째 조건에 대응하기 위해 스택 카나리(Stack Canary, SSP) 보호기법이 도입되었다.

두번째, 세번째 조건을 대응하기 위해 도입된 보호 기법이 ASLR과 NX 보호기법이다.

 

NX ( No-eXecute )

코드 영역에 쓰기 권한이 있으면 공격자가 코드를 수정하여 원하는 흐름대로 조작할 수 있고,

스택이나 데이터 영역에 실행권한이 있으면 셸코드를 해당 영역에 입력하고 반환 주소를 조작해 셸코드를 실행할 수 있다.

이를 방어하기 위해 도입된 보호기법인 NX는 실행 권한 메모리 영역과 쓰기 권한 메모리 영역을 분리하는 보호기법이다.

 

 

NX enabled 된 바이너리를 gdb에서 vmmap을 통해 확인해보면 stack 영역에 실행권한이 빠져있는 것을 확인할 수 있다.

gcc에서 NX 보호 기법을 적용하지 않도록 하는 옵션은 -zexecstack 이다.

 

 

NX 보호기법 적용 여부는 checksec 명령어를 통해 확인할 수 있다.

 

ASLR ( Address Space Layout Randomization)

ASLR은 커널에서 지원하는 보호 기법이다. 리눅스 시스템에 실제로 적용되어 있는 보호 기법으로,

바이너리가 실행될 때마다 스택, 힙, 라이브러리 등의 주소를 랜덤화 하는 보호 기법이다.

 

같은 바이너리 임에도 실행할 때마다 주소가 매번 다른 값이 나오는 것을 확인할 수 있다.

ASLR이 적용되어 있으면 매 실행마다 변수들이 무작위한 주소에 위치하게 되기 때문이다.

 

ASLR 보호기법 적용 후에는 다음과 같은 특징을 가진다.

1. 코드 영역의 main함수를 제외한 다른 영역의 주소들은 실행할 때 마다 변경되기 때문에, 실행하기 전에 해당 영역 주소를 예측할 수 없다.

2. 리눅스에 ASLR이 적용될 때 파일을 page단위로 임의 주소에 매핑하는데, page 크기인 12비트 이하로는 주소가 변경되지 않는다.

3. ASLR이 적용되면 라이브러리는 임의 주소에 매핑되는데, 다른 심볼들까지의 거리인 offset은 변하지 않는다.

 

 

 

 

eouya2
@eouya2 :: eouya2

개인공부 기록 / 틀린거 있으면 돌팔매질 부탁드립니다

목차