Reverse Engineering

[리버싱 핵심원리 study] 41장 ASLR

maple19out 2021. 2. 8. 19:31

ASLR(Address Space Layout Randomization)은 Windows Vista 이후부터 지원되는 기능으로, PE 파일이 메모리에 로딩될 때 로딩 시작 주소를 랜덤 하게 바꿔주는 기능이다. 이로 인해 프로세스의 스택, 힙의 시작 주소도 랜덤 하게 바뀐다. 모든 실행 파일에 적용되는 기술은 아니며, 아래와 같은 두 가지 조건을 만족해야 한다.

 

(1) OS의 Kernel Version이 6이상 (Vista 이상)

(2) 개발 도구에서 /DYNAMICBASE 옵션 지원

 

위 조건 중 (2)는 Visual C++의 경우 프로젝트 속성의 링커-> 고급 메뉴에서 확인해 볼 수 있다. 만약 ASLR 기능을 원하지 않을 경우 옵션에서 /DYNAMICBASE:NO로 설정해주면 된다.

 

1. ASLR.exe

책에서는 다음과 같은 소스코드를 DYNAMICBASE / DYNAMICBASE:NO 옵션으로 각각 빌드한다.

#include "stdio.h"

void main() {
	printf("ASLR test program...\n");
}

 

두 파일을 각각 OllyDbg로 열어보자.

- ASLR.exe (DYNAMICBASE 적용)

ASLR.exe

- ASLR_no.exe

ASLR_no.exe

위와 같이 코드는 같지만 코드가 처음 실행되는 주소가 다른 것을 확인할 수 있다. ASLR이 적용될 경우 파일이 실행될 때마다 랜덤 한 주소의 메모리 주소에 올라가게 된다.

 

- 섹션 정보

PEView로 두 파일을 열어보자.

PEView(1)

ASLR이 적용된 파일(좌측)의 경우 .reloc 섹션이 하나 추가된 것을 확인할 수 있다.

 

- IMAGE_FILE_HEADER / Characteristics

PEView(2)

ASLR이 적용되지 않은 파일의 경우(하단) IMAGE_FILE_RELOCS_STRIPPED 플래그 값이 IMAGE_FILE_HEADER의 Characteristics 멤버에 추가된다.

 

- IMAGE_OPTIONAL_HEADER / DLL Characteristics

PEView(3)

ASLR이 적용된 파일(상단)에는 DLL Characteristics 멤버에 IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE 플래그가 추가된 것을 확인할 수 있다.

 

2. 실습 - ASLR 기능 제거

HxD로 파일을 열어서 IMAGE_OPTIONAL_HEADER -> DLL Characteristics의 IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE 플래그를 지워주면 간단히 ASLR 기능이 제거된다. 예제 파일에서는 ASLR.exe의 해당 멤버 값이 8140이므로 8100으로 수정해주면 된다.

 

3. Comment

예전에 블로그에 글을 쓰기 위해 직접 작성된 코드로 프로그램을 컴파일 하여 몇 번씩 재실행하면서 디버깅하였는데, 그때마다 주소가 바뀌어 곤란했던 기억이 난다. 프로그램을 디버깅할 때 자주 재실행해야 하는 상황에서는 잠시 ASLR기능을 제거하는 것도 좋은 방법인 것 같다.

반응형