1. Heap 영역


1) Heap 영역이란?

 - 동적으로 메모리를 할당하는 영역


2) Heap 영역이 왜 필요한가?

 - 메모리를 효율적으로 사용하기 위해서 필요하다.


※추가설명 : 가상 메모리에서 메모리를 할당할 때에는 페이지 단위(4096byte)단위로 할당하는데, 만약 256byte 만큼의 적은 메모리만 사용하고 싶다고 했을때에도 4096byte를 할당해야하는 문제가 있다. 이러한 단점을 보안하기 위해서 Heap 메모리가 필요다.


※나중에 추가로 공부해야할 내용 : malloc, calloc, realloc 동적 메모리 할당


2. FS Register, TEB, PEB


1) FS Register

 - 커널 모드에서는 KPCR 구조체를 가리킨다.

 - 유저 모드에서는 TEB 구조체를 가리킨다.


2) TEB(Thread Envrionment Block)

 - 프로세스에서 실행되는 스레드에 대한 정보를 담고 있는 구조체

 - TIB(Thread Information Block)라고도 한다.

 - TEB 구조체는 OS마다 달라짐(Windows 7의 경우, Windows XP SP3보다 확장됨)

 - 시작 주소 : FS:[0x00], FS:[0x18] (유저 모드)


※ 왜 FS:[0x18]은 Self Field를 참조하고 있는걸까?

 - 미래에 TEB가 아닌 다른 구조체가 FS:[]로 바뀌어도, 0x18 오프셋은 TEB의 포인터를 가리키므로 후방 호환성이 유지되기 때문이라고 추측할 수 있다.


 - TEB 접근 방법

   Ntdll.NtCurrentTeb() : 현재 스레드의 TEB 구조체 주소를 리턴하는 함수

   Ntdll.NtCurrentTeb() API를 이용하면 된다.


3) PEB(Process Environment Block)

 - 프로세스의 정보를 저장하는 구조체

 - PEB 구조체는 OS마다 달라짐(Windows 7의 경우, Windows XP SP3보다 확장됐다.)

 - 시작주소는 OS마다 다르다.

   SP2 미만 → 0x7FFDF000

   SP2 이상 → fs:[0x30]

   win7 유저 모드 → fs:[0x30]

   win7 커널 모드 → fs:[0x18]

 

 - PEB 접근 방법

   TEB.ProcessEnvironmentBlock : PEB 구조체의 주소

   (FS:[30] = TEB.ProcessEnvironmentBloc = Address of PEB)

※Tip. OllyDbg로 디버깅을 시작할 때 EBX 레지스터에 PEB 주소가 저장되어있다.



[C언어로 TEB, PEB주소값 구하기 - NtCurrentTeb]


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <windows.h>
 
int main(){
    FARPROC pProc = NULL;
    LPBYTE pTEB = NULL;
    LPBYTE pPEB = NULL;
 
    pProc = GetProcAddress(GetModuleHandle("ntdll.dll"), "NtCurrentTeb");
    pTEB = (LPBYTE)(*pProc)();
    pPEB = (LPBYTE)*(LPDWORD)(pTEB+0x30);
 
    printf("TEB : %x\n", pTEB);
    printf("PEB : %x\n", pPEB);
 
    puts("");
}

cs





참고 : 리버싱 핵심원리(책), Windows 구조와 원리(책), MSDN

'Reversing' 카테고리의 다른 글

Static Anti-Debugging 0x02. LDR  (0) 2016.07.06
Static Anti-Debugging 0x01. IsDebuggerPresent()  (0) 2016.07.06
Anti-Debugging  (0) 2016.07.06
PEB 구조  (2) 2016.07.05
TEB 구조  (0) 2016.07.05

+ Recent posts