-
[리버싱 핵심원리 study] 41장 ASLRReverse Engineering 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_no.exe
위와 같이 코드는 같지만 코드가 처음 실행되는 주소가 다른 것을 확인할 수 있다. ASLR이 적용될 경우 파일이 실행될 때마다 랜덤 한 주소의 메모리 주소에 올라가게 된다.
- 섹션 정보
PEView로 두 파일을 열어보자.
ASLR이 적용된 파일(좌측)의 경우 .reloc 섹션이 하나 추가된 것을 확인할 수 있다.
- IMAGE_FILE_HEADER / Characteristics
ASLR이 적용되지 않은 파일의 경우(하단) IMAGE_FILE_RELOCS_STRIPPED 플래그 값이 IMAGE_FILE_HEADER의 Characteristics 멤버에 추가된다.
- IMAGE_OPTIONAL_HEADER / DLL Characteristics
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기능을 제거하는 것도 좋은 방법인 것 같다.
반응형'Reverse Engineering' 카테고리의 다른 글
[리버싱 핵심원리 study] 46장 TEB & 47장 PEB (0) 2021.02.15 [리버싱 핵심원리 study] 45장 TLS 콜백 함수 (0) 2021.02.13 [리버싱 핵심원리 study] 40장 64비트 디버깅 (0) 2021.02.08 [리버싱 핵심원리 study] 38장 PE32+ (0) 2021.02.02 [리버싱 핵심원리 study] 37장 x64 프로세서 이야기 (0) 2021.02.01