what is Imagebase
항상 IDA로 분석을 하면서 의문점을 가지면서 공부하지 않았던 것이 있다. 바로 Imagebase 이다.

이 Imagebase란 정확히 뭘까?

그럼 elf 파일은?

그전에 윈도우 실행 파일 PE 파일의 구조를 알아보고 가도록 하자
원도우에서는 각각의 영역을 섹션이라고 한다. 또한 당연히 헤더들이 존재하는데 원도우는 이전에 MS-DOS 운영체제를 계승했기에 이를 호환하기 위해서 DOS header와 DOS stub이 존재한다.
그리고 NT header가 본격적인 시작인데 PE00 라는 magic으로 시작하고,
Machine , NumberOfSections , Characteristics 등 여러 필드가 존재한다.
여기서 추가적인 필드를 붙이는데 그중 하나가 ImageBase와 AddressOfEntryPoint 이다.
그럼 이 두개가 정확히 뭘 하는 필드인지에 대해 설명해보자면,
ImageBase 는 ASLR이 꺼져있을 때를 기준으로 virtual memory에서 시작하는 주소를 가리킨다. Windows에서는 실행 파일이 기본적으로 0x00400000(32비트) 또는 0x140000000(64비트)가 기본 imagebase로
설정되어 있다.
근데 ASLR이 꺼져있을 때가 요즘 같은 보안이 강력한 시대에는 존재하지 않는다. 따라서,
일반적으로 ASLR이 활성화된 경우 실행 파일은 64비트 주소 공간의 중간쯤(0x00007FFxxxxxxxx) 에 랜덤으로
들어가게 된다. ( ImageBase 를 무시한다. )

실제로 notepad.exe도 00007FF6AC500000 에 올라감을 알 수 있다. 따라서 우리가 아는 base주소가 이처럼 Imagebase를 따르지 않고 바뀌게 되는 것이다.
그런데 이상한점을 발견했다. 아무리 프로그램을 껐다 켜도 ASLR이 적용이 되지 않는 것처럼 같은 위치에 올라가는 것을 발견했다. 이를 아는 지인에게 물어보니 window는 전원이 꺼지고 켜짐을 기준으로 ASLR이 바뀐다고 한다.
이에 대해 자세한 official은 찾지 못했다.
부록 KUSER_SHARED_DATA

virtual memory 시작 부분에 다음과 같은 KUSER_SHARED_DATA가 존재한다.
모든 프로세스에서 공통으로 존재하며, 고정된 위치(0x7FFE0000)에 배치된다.
이는 Windows의 커널과 사용자 모드 간 공유 데이터를 저장하는 고정된 메모리 주소이며,
Windows 운영 체제의 특징이며, 모든 Windows 프로세스에서 동일한 위치에 존재한다.