'가상메모리'에 해당되는 글 1건

  1. 2010.04.29 [Reversing] 윈도우 가상메모리와 DLL
0x03 Reversing/Reversing2010.04.29 12:39

1. 가상메모리
프로그램이 물리적인 메모리 주소를 사용하게 될 경우 메모리(RAM) 부족으로 인하여 사용하지 않는 부분을 땡긴다거나 하는 작업이 일어날 경우 현재 프로그램이 사용하고 있는 메모리의 주소가 모두 변경될 가능성이 있다. 따라서 프로그램은 논리적인 주소를 이용하여 메모리에 접근하게 된다. 프로그램에서 논리 주소를 쓰면 윈도우의 가상 메모리 관리자는 실제 메모리 주소로 매핑을 해주는 것이다.
x86 가상 주소 변환을 살펴보면 메모리 관리자는 생성하고 유지하는 페이지 테이블이라는 데이터 구조체를 사용하며, CPU는 가상 주소를 실제 주소(물리적 주소)로 변환한다. 각 가상 주소는 페이지 테이블 항목(page table entry, PTE)이라는 시스템 공간 구조체에 연결되어 있는데 이것은 가상 주소가 매핑되는 실제 주소를 갖는다. 아래 그림은 세 개의 연속적인 가상 페이지들이 세 개의 물리적으로 불연속적인 페이지들에 어떻게 매핑되는지 보여준다.
윈도우는 실행되는 모든 프로그램에게 2^32 즉, 4GB의 메모리 할당이 가능하다. 4GB인 이유는 포인터 타입의 변수가 4Byte=32bit의 공간을 가지므로 총 2^32개의 메모리 할당이 가능하다. 포인터 변수의 크기 제한으로 인해서 다른 프로그램 주소를 침범하는 것은 불가능하다. 
물리적인 메모리의 제한을 고려했을 때 상상이 가지 않는 이야기이다. 윈도우는 여기서 두 가지 방법을 사용한다.
① 각 프로그램에게 한 번에 4GB를 할당하는 것이 아니라 필요한 만큼만 메모리를 할당한다.
② 페이징 기법을 이용하여 하드디스크를 메모리처럼 사용한다.

윈도우에서 메모리상의 프로그램을 참조할 경우에는 셀렉터와 오프셋 개념을 이용한다. 셀렉터는 프로그램의 주소를 찾아가는 역할을 하며, 오프셋은 프로그램에 할당된 메모리 내부를 찾아가는 역할을 한다. 그림을 통해 살펴보자.
윈도우에서 각 메모리에 로딩된 프로그램을 찾아갈 경우에는 셀렉터를 이용하며, 프로그램 내부에서는 오프셋을 이용하여 각 세부항목에 대해서 접근하게 된다.

2. DLL(Dynamic Linked Library)
예를 들어 여러 프로그램들이 stdio.h 헤더 파일을 포함하여 프로그래밍 되었을 경우 각각의 프로그램마다 stdio.h에서 지원하는 printf나 scanf 함수를 포함하여 메모리에 로딩해야 한다. 이럴 경우 메모리의 낭비가 생기게 된다. 따라서 stdio.h 파일을 컴파일 한 뒤 메모리에 로딩해 놓고 이를 사용하는 프로그램들은 메모리에 로딩된 stdio.h의 주소값을 갖고 참조하여 사용하게 된다. 이렇게 필요한 기능을 실행할 때 연결시킬 수 있도록 만들어 놓은 것이 DLL(Dynamic Linked Library, 동적 연결 라이브러리)이다.
윈도우의 대표적인 DLL 파일로는 User32.dll, GDI32.dll, Kernel32.dll 등이 있다. User32.dll 파일의 경우 대부분 사용자 입력을 받는 역할을 한다. GDI32.dll은 어디엔가 결과를 표현하는 역할을 하며, Kernel32.dll은 말 그대로 실행을 위한 쓰레드 관리, 메모리 관리 등을 담당하는 핵심 모듈이다.

앞에서 각각의 프로그램들은 다른 프로그램의 존재도 모를만큼 자신의 메모리 공간을 보호받는다고 했는데 그렇다면 A라는 프로그램이 로딩한 DLL 파일을 B라는 프로그램이 어떻게 사용할 수 있을까? 이 부분은 각 메모리에 로딩된 각 프로그램마다 공유 영역을 정해서 해결한다. DLL 파일들은 전부 윈도우가 지정한 공유영역의 메모리에 올라가게 되기 때문에 프로그램 간의 공유가 가능하다.
< Windows 98 / Me 가상 메모리 구조 >
위 그림에서 볼 수 있듯이 윈도우의 경우(위 그림은 Windows 98 / Me의 경우) 프로세스별로 공유메모리 영역에 DLL 파일을 로딩한 후 프로세스 간에 공유해서 사용하게 된다. DLL Injection 공격은 위와 같은 윈도우의 메모리 구조를 이용한 공격으로 임의의 프로세스에 악의적인 목적을 가진 DLL 파일을 Injection 하여 공격하게 된다. (DLL Injection에 대한 내용은 포스팅 예정)

참고자료 : 해킹 파괴의 광학(개정판) / Chapter 2. 시스템 프로그래밍, 그리고 윈도우

                                                                                                    +---------------------------------+
                                                                                                    | Infinite Flow..                              |
                                                                                                    | mail : geekspark@gmail.com         |
                                                                                                    | Blog : http://sinun.tistory.com       |
                                                                                                    | twitter : @unpacker                      |
                                                                                                    | CISSP                                        |
                                                                                                    +----------------------------------+
저작자 표시 비영리 변경 금지
신고
Posted by By. PHR34K

티스토리 툴바