IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE (PE 파일 ASLR 비활성화)

Hunjison·2024년 1월 18일
0

Reverse Engineering

목록 보기
9/9

IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE에 대해 알아보고, 이것을 통해 Windows 환경에서 ASLR(Address Space Layout Randomization)을 비활성화하는 방법을 알아보자.

1. DYNAMIC_BASE 플래그


IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASEPE 구조 의 특정 플래그 이름이다.
구체적으로 IMAGE_NT_HEADERS 아래 IMAGE_OPTIONAL_HEADER 아래 DllCharacteristics 여러 속성 중의 하나의 플래그이다.

해당 플래그가 설정되면,

  • DLL이 로드되는 주소는 기본적으로 ImageBase 이다.
  • Dynamic_BASE 플래그가 설정되면, 로드 타임에 ImageBase 주소를 임의로 변경할 수 있다. 따라서 DLL이 로드되는 위치를 특정할 수 없다.
  • DLL이 로드되는 위치가 실행 때마다 바뀌면 exploit이 정상적으로 동작하지 않기 때문에, 뒤에서 설명할 방법을 통해 로드되는 위치를 고정한다.

아래는 MS에서 직접 제공하는 해당 플래그에 대한 설명.

아래 사진은 DIE(Detect It easy) 프로그램을 통해 DLL 파일을 열어 해당 플래그를 확인한 값이다.

2. 플래그 직접 수정하기


해당 플래그는 2바이트 플래그이고, DYNAMIC_BASE 플래그는 0x40 위치에 있으므로
아래 사진처럼 플래그를 0에서 1로 바꿔준 후에, 해당 영역을 직접 수정해주자.

HxD를 통해 직접 수정하였다.

다시 DIE로 열어본다.
아래 사진처럼 잘 수정된 것을 확인할 수 있다.

3. Winpwn으로 쉽게 수정하기


Winpwn이라고 불리는 Windows 용 pwntools에서는 더욱 쉽게 수정할 수 있다.
(winpwn 설치가 조금 까다로운데, 다른 포스팅에서 다루도록 하겠다)

winchecksec 이라는 도구를 이용해서 아래와 같이 ASLR 적용 여부를 확인했다.

> winchecksec Project1.exe
Warn: undersized load config, probably missing fields
Results for: Project1.exe
Dynamic Base    : "Present"
ASLR            : "Present"				// 여기!
High Entropy VA : "NotPresent"
Force Integrity : "NotPresent"
Isolation       : "Present"
NX              : "Present"
SEH             : "Present"
CFG             : "NotPresent"
RFG             : "NotPresent"
SafeSEH         : "NotPresent"
GS              : "Present"
Authenticode    : "NotPresent"
.NET            : "NotPresent"

winpwnNOPIE 함수를 이용해 ASLR을 해제했다.

>>> from winpwn import *
>>> NOPIE("Project1.exe")		# 여기에서 동작
>>> exit()

다시 확인해보자. 수정이 정상적으로 되었다.

> winchecksec Project1.exe
Warn: undersized load config, probably missing fields
Results for: Project1.exe
Dynamic Base    : "NotPresent"
ASLR            : "NotPresent"			// 여기!
High Entropy VA : "NotPresent"
Force Integrity : "NotPresent"
Isolation       : "Present"
NX              : "Present"
SEH             : "Present"
CFG             : "NotPresent"
RFG             : "NotPresent"
SafeSEH         : "NotPresent"
GS              : "Present"
Authenticode    : "NotPresent"
.NET            : "NotPresent"
profile
비전공자 출신 화이트햇 해커

0개의 댓글