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(""); } |
참고 : 리버싱 핵심원리(책), 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 |