ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 0x1. PC 내부구조
    System hacking training/Windows 2017. 12. 6. 09:42

    참고 서적 : 윈도우 시스템 해킹 가이드 / 김현민 지음


    해킹을 공부하고 Exploit 코드를 작성하기 위해


    pc 내부구조, 어셈블리어, 기계어 등을 알아야합니다.


    윈도우는 현재 많은 공격자들의 타겟이 되고 있는 운영체제 중 하나 입니다.


    해킹을 하기 위해서 많은 기반 지식을 요구하는데요.


    먼저 cpu, 레지스터에 대해 설명드리겠습니다.




    [CPU]


    윈도우 운영체제에서 동작하는 프로그램을 공격하기 위해 컴퓨터의 두뇌라고 할 수 있는 CPU에 대해서 알아야합니다.


    CPU 는 연산장치, 제어장치, 레지스터로 구성되어있고, 연산장치는 수학적 연산을 하는 장치(논리연산), 제어장치는 메모리에서 기계어 코드를 읽고, 해석한 뒤 실행, 레지스터는 연산을 위한 데이터를 저장하는 역할을 합니다.


    레지스터에 대해서 좀 더 깊게 들어가보면


    [레지스터]


    레지스터는 cpu 가 연산을 하기 위해 사용하는 임시 저장소입니다.

    비유하자면 변수라고 볼 수 있습니다. 혹은 특정한 값 혹은 주소를 저장할 수 있는 그릇이라고 표현을 합니다.

    32 bit 레지스터는 32 bit 이며, 8 byte의 공간이라고 생각하시면 됩니다.


    물론 최근 64 bit 환경이 더 많다고 하지만 레지스터는 그릇일뿐 좀 더 크고, 작고의 차이라고 생각하시면 될것같습니다.


    레지스터에서도 용도에 따라서 분류가 되는데요.


    1) 범용 레지스터

    2) 명령 포인터

    3) 세그먼트 레지스터

    4) 플래그 레지스터


    이렇게 4가지로 나뉘는데 깊게 알아보는건 나중에 포스팅하겠습니다. 일단 레지스터는 메모리 주소 혹은 값이 들어있고, cpu 가 연산을 하기 위해 사용한다 정도만 알고갑시다. ㅎㅎ


    책이 있으신 분들은 읽다보면 세그먼트 레지스터의 설명 부분에 오프셋이라는 단어가 나오는데요.

    이는 어셈블리에서 상대주소라고 부른다고 알고계시면 됩니다.

    +

    ex) char A[] = {'a','b','c','d','e','f'}; 라는 값을 가진 배열 A 가 존재하는데, 'c' 는 시작점에서 2의 오프셋을 가집니다. 


    운영체제를 이해함에 있어 메모리 구조는 상당히 중요합니다.

    모든 프로그램은 동작하기 위해 메모리에 로드되어야하고, 그렇기 때문에 취약점은 메모리에서 발생합니다.

    그렇다면 프로그램이 동작할때의 메모리 구조를 알아야겠죠?


    [메모리 구조]


    윈도우 운영체제의 메모리 구조는 32 bit 의 경우 기본적으로 프로세스(실행중인 프로그램)별로 4GB로 구성됩니다.

    하지만 일반적으로 PC의 메모리는 2~8GB 정도입니다.


    그렇다면 여기서 의문이 생기죠. 


    어떻게 프로세스별로 4GB를 할당해 줄 수 있는가?


    비밀은 바로 윈도우 운영체제의 가상메모리에 있었는데요.

    프로세스별로 유저영역 2GB, 커널영역 2GB로 총 4GB의 독립된 메모리 공간을 가지고 있으며,

    커널영역은 모든 프로세스가 공유하게됨으로서 프로세스별 4GB를 할당해 줄 수 있는것입니다.

    각 가상메모리에 대한 물리메모리는 윈도우 운영체제가 매핑(1대1 대응)해줍니다.


    이런 메모리 가상화는 장점이 있는데요.

    장점은 이러합니다.


    1) 오류발생시 타 프로세스의 메모리와 격리되어있으므로 안정성이 높다.

    2) 자신이 모든 메모리를 소유한 것처럼 주소값을 신경쓰지 않고 사용할 수 있다. 


    이런 프로세스의 메모리 사용에 대해 알기 위해 디버거를 이용하여 확인 해보면 유저모드 2GB 영역에 로드된 다양한 PE 파일, 이미지, 스택등을 확인 할 수 있습니다.


    또 공용으로 사용되는 kernel32.dll, user32.dll 등 DLL 을 확인 할 수 있는데요.

    여기서 DLL은 Dynamic linking library로 동적 링크 라이브러리 입니다. 이는 마이크로소프트에서 구현된 동적라이브러리입니다.

    내부에는 다른 프로그램이 불러서 쓸 수 있는 다양한 함수가 존재합니다. c언어로 생각해보면 stdio.h 와 같은 헤더파일이라고 생각합니다.


    이러한 점은 Exploit 하기 위해 유용한데요.

    공격코드 작성시 공격대상 파일에 바이트코드가 없더라도 함께 로딩된 다른 모듈 내에서 찾아서 쓸 수 있기 때문입니다.


    메모리를 살펴보면 스택, 힙 영역, PE 파일, DLL, 공유영역을 확인 할 수 있고

    중요하게 볼점은 스택 메모리는 높은 주소에서 낮은 주소로, 힙 메모리는 낮은 주소에서 높은 주소로 할당 한다는 점입니다. (기억합시다!)


    스택과 힙에 대해서 간단히 정리를 해보았습니다.


    [스택/힙]


    스택 -> 후입선출(push,pop), 메모리 관리를 위해 사용(지역변수->메모리에 남으면 쓸데없음), ESP, EBP 레지스터 사용.

    힙 -> 힙 관리자, 힙 구조체를 통해 관리, 프로그래머가 API를 통해 할당하고 해제할 수 있다, 스택보다 큰 메모리가 요구될때 사용.


    [함수 호출, 리턴]


    각 함수는 호출 된 후 필요한 만큼 메모리를 할당 받아 사용하고, 함수가 종료된 후에는 메모리를 반환하고 종료됩니다.

    각 함수마다 별도의 공간 == 스택프레임을 가집니다.

    별도의 공간을 갖는 이유는 호출 전후 스택 변경이 없어야하기 때문입니다. else if 호출된 후 메모리값 엉망이 되어 에러가 발생합니다.


    이상 PC 내부구조에 대한 포스팅을 마칩니다.


    윈도우 시스템 해킹 가이드 : http://hyunmini.tistory.com/77

    반응형
Designed by Tistory.