본문 바로가기

Security/Reverse Engineering

[Reversing] ASLR 기능 제거하기

이번엔 PE 조작으로 ASLR 우회하는 방법에 대해서 알아보겠습니다. 


1. ASLR ( Address Space Layout Randomization ) 

 ASLR 은 PE 파일이 메모리에 로딩될 때 로딩 시작 주소 값을 랜덤하게 바꾸는 기술입니다.

또한 DLL 파일도 초기에 로딩되는 주소가 매 실행마다 달라집니다. 

 

윈도우에서는 Vista 버전부터 적용이 됬고 리눅스는 고대 때 부터 적용이 됬던 기술이죠 

(원도우는 역시 열발 늦어 ㅋㅋ) 

 

커널 버전으로 보면 

1
2
3
4
5
6
7
8
9
10
11
12
OS                           Kernal version
Windows 2000                 5.0
Windows XP                   5.1
Windows Server 2003          5.2
Windows Vista                6.0 ------------ ASLR 기술 적용 시작
Windows Server 2008          6.0
Windows Server 2008 R2       6.1
Windows 7                    6.1
Windows Server 2012          6.1 ??
Windows 8                    6.2
Windows 8.1                  6.3
Windows 10                   10  <----------- 6.4가 아니라 10으로 점핑! 
cs

즉 커널 6.0 버전 이후부터 적용된 스킬이네요.

 

는 커널 버전 5하고 6버전 출시 기간 차가 무려 약 7년 인게 함정

 

그럼 직접 예시를 보면서 설명을 계속 하겠습니다.

 

2. ASLR 기술의 적용 

이 기술은 모든 실행파일에 적용되는 기술이 아닙니다.

이 기술을 적용하려면 , 일단 윈도 OS 커널 버전이 6.0 이상이여야 되고, 컴파일을 할 때 컴파일 옵션으로 /DYNAMICBASE 옵션을 줘야 합니다.


코드를 2개를 작성해 준 후 옵션을 다르게 해 컴파일을 해 봅시다.

 

저기 희미하게 Yes 된거 보이시죠? ㅋㅋ

다른 하나는 저 기능을 끄고 컴파일 해주세요

이렇게 만들어 줍니다.

뭐 디버깅 해 보면 ASLR-on 프로그램은 랜덤한 시작 주소를 가질 겁니다.

 

3. ASLR 기능 제거 

 PEView 프로그램으로 두 파일을 한번 비교 해 봅시다.

 

보면 ASLR-on 프로그램과 ASLR-off 프로그램과 차이점을 찾아보면 

 

ASLR-on 프로그램은 reloc 섹션이 추가되 있네요 

 

PE 섹션에 대해서 나중에 강의로 설명하겠지만

 

reloc 섹션만 설명하면 : .reloc 섹션은 PE 파일이 메모리에 로딩되는 순간 재배치가 이뤄질 때 참고하는 섹션입니다. 즉 다른말로는 제거해도 무방한 섹션이죠. ( DLL 파일은 항상 재배치를 고려해야 하므로 제거하면 안되요 )!


다음으로 중요한 차이점은

IMAGE_FILE_HEADER 에 Characteristics 와  IMAGE_OPTIONAL_HEADER 에 DLL Characteristics 입니다.

체크 해 놓은 부분을 보면

ASLR 기술이 적용된 프로그램을 보면 .reloc 이 있고 아래는 스트립 됬다는 걸 알수 있습니다.

즉 IMAGE_FILE_RELOCS_STRIPPED 플래그 하나 차이네요


또 다른 차이는 

 

ASLR-on 프로그램은 IMAGE_DLLCHARACTERSTICS_DYNAMIC_BASE (40) 플래그가 설정되어있네요 

이제 직접 PE 를 수정해 ASLR 기능을 제거해 봅시다. 

 

4. ASLR 기능 제거하기 

IMAGE_OPTIONAL_HEADER - DLL Characterstics 값에서 IMAGE_DLLCHARACTERISTICS_DYNAMICS_BASE (40) 플래그를 없애면

ASLR 기능이 간단히 제거됩니다.

즉 DLL Characterisitcs 값을 8140에서 8100 으로 바꿔주면 됩니다

40 81 이였던 것을 00 81 로 수정 해 주시면 됩니다.


그리고 저장 하신 후 디버거로 실행해 보면 ASLR 기능이 제거된 것을 확인하실 수 있습니다.