본문 바로가기

My Study/Reversing

Windows 7,Vista Random Imagebase

이것에 대해서 공부를 해 본것은.. 하나의 프로그램을 가지고 친구와 리버싱 토론을 하고 있었습니다.
친구의 환경은 XP SP3 이었고 전 Windows7 이었습니다.
같이 공부하던 도중.. 서로 말하는 주소가 다른 겁니다. 저도 이 때까지 XP 에서만 분석을 많이 해왔기 때문에 프로그램의 Imagebase는 0x400000 으로 항상 생각하고 있었지요.. DLL같은 경우는 재배치가 일어나기 때문에 주소값이 바뀌지만요.
이게 왜이런가 해서 파일을 실행시키지 않은 상태로 ImageBase주소를 봐보았습니다.

전혀 이상이 없더군요. 그러면 이제 파일이 메모리에 올라와 있는 상태에서 Imagebase를 봐보겠습니다.

파일이 메모리에 올라오자 Imagebase주소가 바뀌었습니다. 그리고 EntryPoint로 가보겠습니다.

역시나 Imagebase주소가 다르네요. 제가 해당 프로그램의 ImageBase주소를 구하는 프로그램을 하나 만들었습니다.
연속해서 실행을 해보겠습니다.

ImageBase주소가 계속해서 바뀌는 것을 볼 수 있습니다.
뭐 저 Imagebase주소의 최대 최소 범위까지는 모르겠습니다; 여러번 해본결과 20000 이하로는 안내려가는거 같기도 하네요.

이러한 현상이 Vista부터 발생하는거 같습니다.
해당 프로그램을 XP에서 실험해 보도록 하겠습니다.
Imagebase주소가 0x400000 이군요. XP에서는 적용이 안된다는 것입니다.

그러면 이러한 기능을 어디서 추가하는 걸까요?? OS가 해줄까요?? 
당연히 이렇게 랜덤 Imagebase로 나오게 하는데 OS의 역할도 필요하지만 
적용을 시켜주기 위해선 컴파일러에서도 지정을 해줘야된다는 것입니다.
 
속성 페이지에서 - 링커 - 고급 으로 오시면 위와 같은 선택창이 있습니다. ( VS 2008 )
임의 기준 주소라고 해가지고 디폴트로 " 이미지를 임의로 선택합니다. " 라고 되어 있습니다.
그러면 해당 옵션 값을 " 이미지를 임의로 선택하지 않습니다. " 로 바꾸고 다시 테스트 하도록 하겠습니다.
( 테스트 환경 : Windows 7 )

Imagebase주소가 바뀌질 않습니다.

이제 저 옵션값을 주었을 때와 주지 않았을 때의 파일을 비교해보도록 하겠습니다.
그래서 다른 부분을 찾아서 해당 부분을 없애버리는 방법을 생각해 봐야겠죠.
왜냐하면 컴파일 시 개발자가 저런 옵션을 주었다면 Windows7에선 분석하기가 힘들태니까요.

두 프로그램의 다른 점을 먼저 찾아보았습니다.

비교를 해보니 적용된 곳에서 섹션이 하나가 더 있었습니다.
하지만 저 섹션은 그닦 프로그램에 영향을 주는 섹션은 아니라서 바로 넘겼습니다.
뒤에 Characteristics 42000040 인데요. 저 값의 뜻은

Initialized Data

Discardable          // 버려도 된다! 이 섹션은 지워버려도 됩니다.

(no align specified)

Read Only


입니다.


또 다시 다른 부분을 찾도록 하겠습니다.

PE 구조에서 IMAGE_FILE_HEADER 에서 Characteristics 부분이 또 달랐습니다.


옵션을 적용시킨 파일 입니다. 옵션 적용 안시킨 파일보다 값이 하나 더 있었습니다.

저 특징을 봐보겠습니다.

Relocation info stripped from file.

파일로부터 재배치 정보가 지워진다.. 라는 뜻입니다.

이것도 아닌거 같네요. 다른 부분을 또 찾아보겠습니다.


IMAGE_OPTIONAL_HEADER에서 DLLCharacteristics 부분이 또한 달랐습니다.


빨간색 네모쳐진 부분이 또 하나 있었습니다.

뭐하는 부분인지 인터넷에서 찾아보았습니다. 그 결과 많은 정보를 얻을 수 있었습니다.


몰랐던 사실인데 이런게 ASLR 이라고 하는군요. 아무튼 저 부분을 클리어 해주면 적용이 안된다고 나와있습니다.

중요한 것은 저 부분을 클리어 해도 힙과 스택은 여전히 랜덤하다고 나오는 군요. 

일단은 Imagebase주소만 고정되나 봅니다.

한번 해보도록 하겠습니다.


위와 같이 저 부분을 00으로 수정시켜주고 해당 파일을 실행해보도록 하겠습니다.


ASLR이 적용이 안되었네요.


대부분 상용프로그램을 봐보니 ASLR이 적용이 안되어 있었습니다. 비록 이렇게 우회가 되긴 하지만 

VS에서 옵션을 주어서 컴파일 하는 습관을 들이면 좋겠습니다. 요샌 Windows7을 많이 사용하니까요.

그러면 왜 저러한 옵션을 주어야 하는지...에 대한것을 말해보라면 보통 쉘코드를 만들 때 주소를 직접 넣어서 공격을 합니다. 하지만 저렇게 주소가 랜덤하면 공격 성공 확율이 0%로 되겠죠. 주소가 틀리니까요. 주소만 틀린 것이 아니라 스택 주소도 다릅니다. 그래서 공격하기 더 힘든 이유가 보통 쉘코드로 공격할 때 스택에 값을 넣어서 오버플로우를 시켜 공격을 하니까 말이죠. 이미 리눅스는 랜덤 스택을 적용시킨지 오래 됬고 스택에서 코드 실행하는 것 조차 전부 막아놨습니다. 뭐 바이러스 분석을 한다고 했을 때 ASLR이 적용되어 있으면 짜증이 날 탠데요. 그럴 땐 역시 이렇게 우회를 해주고 분석을 하면 될꺼같습니다.

위에서 이렇게 우회하면 Imagebase주소는 고정되지만 힙과 스택은 여전히 랜덤하다고 나왔는데요. 제가 실험해본 결과

스택 주소도 고정이 되는거 같더군요. 궁금하신 분들은 직접 해보세요 ^^ 제가 실험한 환경은 XP, 7 이라서 Vista에서는 어떻게 될련지 확실히는 모르겠네요. ㅜ ㅜ