IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE
에 대해 알아보고, 이것을 통해 Windows 환경에서 ASLR(Address Space Layout Randomization)을 비활성화하는 방법을 알아보자.
IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE
란 PE 구조 의 특정 플래그 이름이다.
구체적으로 IMAGE_NT_HEADERS
아래 IMAGE_OPTIONAL_HEADER
아래 DllCharacteristics
여러 속성 중의 하나의 플래그이다.
해당 플래그가 설정되면,
ImageBase
이다.Dynamic_BASE
플래그가 설정되면, 로드 타임에 ImageBase 주소를 임의로 변경할 수 있다. 따라서 DLL이 로드되는 위치를 특정할 수 없다.아래는 MS에서 직접 제공하는 해당 플래그에 대한 설명.
아래 사진은 DIE(Detect It easy) 프로그램을 통해 DLL 파일을 열어 해당 플래그를 확인한 값이다.
해당 플래그는 2바이트 플래그이고, DYNAMIC_BASE
플래그는 0x40 위치에 있으므로
아래 사진처럼 플래그를 0에서 1로 바꿔준 후에, 해당 영역을 직접 수정해주자.
HxD를 통해 직접 수정하였다.
다시 DIE로 열어본다.
아래 사진처럼 잘 수정된 것을 확인할 수 있다.
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"
winpwn
의 NOPIE
함수를 이용해 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"