chap 47. PEB
47.1. PEB
<PEB 접근 방법>
TEB에 있는 멤버 중 TEB.ProcessEnvironmentBlock 은 PEB 구조체의 주소를 나타낸다. ProcessEnvironmentBlock 은 TEB 구조체 시작으로부터 30오프셋 만큼 떨어져 있다. TED 구조체는 FS 세그먼트 셀렉터가 가리키고 있다. 따라서 다음과 같이 표현할 수 있다.
위의 공식을 어셈블리어로 표현하면 다음 두가지 방법으로 나타낼 수 있다. (두가지 방법 모두 TEB.ProcessEnvironmentBlock 멤버를 참조하고 있음)
47.2. PEB 중요 멤버 설명
PEB의 내용은 OS에 따라서 달라지고 멤버가 많기 때문에 리버싱에 있어서 중요한 멤버들만 살펴본다.
<PEB.BeingDebugged>
Kernel32!IsDebuggerPeresent()라는 API가 있다. 이 API는 현재 프로세스가 디버깅을 당하는지를 판단하여 0 또는 1을 리턴하는 함수이다. 이 함수가 참조하는 PEB의 멤버가 바로 PEB.BeingDebugged이다. (IsDebuggerPresent()는 Windows7에서는 Kernelbase.dll에 구현되어 있고, Windows XP 이하에서는 Kernel32.dll에 구현되어 있음) 이 값은 주로 리버싱 분야에서 안티 디버깅에 쓰인다. 예를 들어 이 값을 조사하여 디버깅중이라고 판단되면 프로세스를 종료시킨다.
Kernel32!IsDebuggerPresent()함수를 Ollydbg로 살펴보면 다음과 같다.
위의 두 줄을 통해 PEB의 주소를 얻고 세번째 줄에서는 +002 만큼 이동하여 PEB.BeingDebugged 멤버를 참조하는 것을 알 수 있다.
실제로 notepad.exe를 실행시켜서 첫 줄을 "MOV EAX,DWORD PTR FS:][30]"으로 바꾼 뒤 한 줄 실행시키면 EAX에 PEB 주소가 들어오며, hex dump에서 PEB를 살펴보면 +002 위치(PEB.BeingDebugged 멤버)에 1이 들어있는 것을 확인할 수 있다.
<PEB.ImageBaseAddress>
* ImageBase : PE파일이 메모리에 로딩되는 시작 주소
* GetModuleHandle() API : 모듈의 이름을 인자로 받아서 해당 모듈의 handle을 리턴하는 함수
Kernel32!GetModuleHandleA() API 내부를 살펴보면 다음과 같다.
PEB를 찾은 뒤 +008에 있는 ImageBase 멤버를 참조하는 것을 알 수 있다.
<PEB.Ldr>
PEB.Ldr 멤버는 _PEB_LDR_DATA 구조체의 포인터이다.
PEB.Ldr을 통해 프로세스에 로딩된 모듈(DLL)의 로딩 베이직 주소를 직접 구할 수 있다.
_PEB_LDR_DATA 구조체는 다음과 같다.
이 구조체에서 InLoadOrderMoudleList, InMemoryOrderModuleList, InInitializationOrderModuleList 세개의 멤버는 _LIST_ENTRY 구조체 타입이다. _LIST_ENTRY 구조체는 프로세스에 로딩된 DLL모듈마다 각각 생성성되며 양방향 연결 리스트로 연결된다. 즉, _PEB_LDR_DATA 구조체에서 알 수 있듯이 모듈들의 연결 방식을 세가지 지원한다.
_LIST_ENTRY 구조체는 다음과 같다.
_LIST_ENTRY 를 통해서 연결 리스트를 제공하고, 저장되는 정보는 _LDR_DATA_TABLE_ENTRY 구조체이다.
<PEB.ProcessHeap & PEB.NtGlobalFlag>
PEB.ProcessHeap 과 PEB.NtGlobalFlag 는 안티 디버깅에서 주로 쓰인다.
PEB.ProcessHeap은 HEAP 구조체를 가리키는 포인터이다.
HEAP 구조체는 다음과 같다.
이 중 Flags와 ForceFlags는 디버깅 중 특정한 값으로 세팅된다.
PEB.NtGlobalFlag는 0x70으로 세팅된다. (윈도우 XP 에서만 효과가 있는 기법이며, 실행중인 프로세스를 attach시킨 경우에도 이 특성이 나타나지 않음)
'리버싱핵심원리' 카테고리의 다른 글
Reverse Engineering Chap 49 (0) | 2016.02.11 |
---|---|
Reverse Engineering Chap 48 (0) | 2016.02.03 |
Reverse Engineering Chap 46 (0) | 2016.02.03 |
Reverse Engineering Chap 50-51 (0) | 2016.02.03 |
Reverse Engineering Chap 21-22 (0) | 2016.02.03 |