소스코드가 컴파일된 후 메모리상에 인스턴스화 될 때 각 코드가 메모리에 위치하는 영역이다. 위치하는 섹션에 따라 변수의 라이프 사이클이 달라진다.
섹션의 이름은 링크 시 변경할 수 있기 때문에 섹션헤더의 Characteristics 필드를 통해 정확한 섹션을 파악해야한다.
시스템은 PE를 로드하기 전에 프로세스를 위한 가상주소 공간을 생성한 후 PE전체를 매핑하기에 충분한 주소 공간(옵셔널헤더->SizeOfImage)을 예약(Reserve)한다. 그리고 각 섹션 헤더의 VirtualAddress 주소에서 VirtualSize만큼만 확정(Commit)한 후 해당하는 코드섹션, 데이터섹션을 매핑하여 역할을 수행하게 한다.
프로세스가 생성되면서 힙과 스택영역은 별도로 생성되는데 옵셔널헤더의 SizeOfStackReserve, Commit, HeapReserve, Commit 필드의 값만큼 생성한다.
PE가 가상주소공간에 매핑이 완료되면 EIP(RIP)레지스터는 옵셔널 헤더의 AddressOfEntryPoint 필드에 지정된 값을 가리키게되며 메인스레드가 EP코드를 실행할 수 있도록 한다.
코드섹션
1. 코드섹션의 명칭은 .text가 아닐수도 있다.
2. 코드섹션 내부에 다른 데이터 디렉터리 정보가 포함될 수 있다.
3. 코드섹션은 하나이상 존재할 수 있다.
코드섹션은 스레드가 실행해야하는 기계어를 담고있는 섹션. 기계어들은 헥사 덩어리로 이뤄져 있으며 이 값을 디스어셈블하여 얻어낸 어셈블리 코드는 1:1 매핑된다. x86에서 0x55는 push 라는 명령어와 매핑되며 push에 해당되는 0x55는 CPU 플랫폼마다 다를 수 있지만 매핑되는 push라는 니모닉(패턴)은 모든 플랫폼에 동일하게 존재한다.
'리버싱 > 윈도우' 카테고리의 다른 글
리버스 엔지니어링 : PE Header (0) | 2020.08.25 |
---|---|
리버스 엔지니어링 1 : PE 공부 전 필요한 기본지식 (0) | 2020.08.23 |
안티 디버깅(Anti-Debugging) (0) | 2020.07.28 |
특정 프로세스를 보호하기 위해서 Hook을 해야 할 API 정리 (0) | 2020.07.28 |
윈도우 리버싱 도구 (0) | 2020.07.28 |