훈, IT 공부/C,C++,MFC

ASLR이란? 왜 계속 주소가 바뀌는건가요!!! (메모리변조)

IT훈이 2018. 1. 3.
반응형

ASLR

ASMR 아니고아니고!


왜 계속 메모리를 보는데 주소가 바뀌는 것인가??

 메모리 주소가 바뀐다는 말이 무엇인지 부터 설명하겠습니다.

C언어를 다루다 보면 Debug모드로 코드에 접근하여 메모리주소를 보는것이 일상화 되듯이 보게 됩니다.

그런데 내가 기억한 메모리의 주소가 계속해서 바뀐다면...?? 아래의 예를 살펴보시겠습니다.



실습을 하고 있는 상황에서 변수의 주소를 기억하기 위해 Debug모드로 접근합니다.

나는 " int 자료형을 가진 nData 변수의 메모리 주소" 를  0x010FF8C0 로 기억하고,

0x010FF8C0 주소를 가지고 포인터에 대하여 실습을 하려 하는데!!!

다시금 Debug 모드로 접근하게 되면 주소가 0x10FF8C0 -> 0x00F5FEA8  으로 변경되어있습니다.. 



이러한 현상은 ASLR 이라는 것 때문에  발생하게 됩니다. 


ASLR 설명 전에 메모리 변조에 대해 잠시 짚고 넘어가겠습니다.

메모리변조??? 메모리해킹?!?


자... 일단 메모리가 바뀌는 이유에 대해서 한번 설명해보죠 

게임을 생각해봅시다!! 초기에는 갓겜 어쌔신 크리드를 가지고!!


다른 의도는 없는 순수한 설명을 위하여 사용합니다. :)



예로써 대부분 RPG게임 속에서 존재하는  입니다.


저 돈이라는 값은 어떠한 메모리의 주소안에 16진수 형태로 들어가 있을 것입니다.


게임상의 저 돈의 주소가 동적이 아니라 고정으로 되어있다고 생각해보세요.


돈의 주소만 알아낸다면 메모리를 변조하여 돈을 변경할 수 있지 않을까요?


어떻게 진행되는지 볼까요?

Visual Studio 2013에서  임의주소 사용 하지 않음으로 설정 후 실습합니다.


Money라는 변수에는 현재 300이 들어있습니다. 


메모리에도 10진수 300을 16진수로 변경한 0x12c 들어있네요. 

( 거꾸로 들어간 것은 Little Endian 참조)


Money 가 위치한 주소는 0x0019FF20 입니다.


주소를 알았으니 그 주소에 값을 999999으로 변경해볼까요?



어떤가요?? Money 변수의 값이 999999 으로 변경 되었죠?? 


이것과 유사한 방법들이 메모리 해킹입니다..


또한 이러한 것을 예방하기 위해  ASLR 입니다.



그래서 ASLR이 먼데??

자 드디어 ASLR을 설명합니다.  

참고로 ASML 이 아니고 ASLR 입니다. ㅋㅋ


ASLR ( Address Space Layout Randomizaition )
간단합니다. 매번 주소를 랜덤하게, 임으로 선정하겠다는 것 입니다.

위의 사례를 보았듯이 메모리 해킹을 방지하기 위해 Windows Vista 에서 부터 지원 되었다고는 하지만

실질적으로는 Windows 7(Kernel v6.1) 부터 제대로 지원이 된다고 생각하시면 됩니다. 

즉!!
 Windows 7 의 경우에는 ASRL을 지원하기 때문에 프로그램이 실행될 때마다 메모리 주소가 변경 되는 것입니다.



알고나니 별거 없죠?? 네 별거없습니다. ;(


임의 주소 사용 봉인 해제 해봅시다 ( VS++2013 )



첫 번째 방식

 1. Visual Studio 2013에서 Alt + F7 를 누릅니다.

 2. 속성 페이지가 나타날 것입니다. 구성 속성 -> 링커 -> 고급 -> 임의기준주소 -> 아니요(/DYNAMICBASE:NO)으로 변경


두 번째 방식  

 1. Visual Studio 2013을 실행하고 상단의 메뉴에서 프로젝트(P) 클릭

 2. 속성(P) 탭 클릭

 3. 속성 페이지가 나타날 것입니다. 구성 속성 -> 링커 -> 고급 -> 임의기준주소 -> 아니요(/DYNAMICBASE:NO)으로 변경





메모리를 만지거나 포인터 실습을 진행 하실때는 


임의 기준 주소를 해제하시고 실습진행하시면 됩니다.





반응형

댓글