반응형
TEB란?
프로세스에서 실행되는 스레드에 대한 정보를 담고 있는 구조체
스레드 별로 TEB 구조체가 하나씩 할당됨.
TEB 구조체는 OS 종류별로 모양이 달라짐
TEB 구조체 정의
typedef struct _TEB {
BYTE Reserved1[1952];
PVOID Reserved2[412];
PVOID TlsSlots[64];
BYTE Reserved3[8];
PVOID Reserved4[26];
PVOID ReservedForOle;
PVOID Reserved5[4];
PVOID TlsExpansionSlots;
} TEB, *PTEB;
MSDN의 TEB 구조체 설명이다.
구조체 내용을 자세히 보기 위해 WinDbg사용(커널 디버거 사용)
WinDbg로 비교해보면 Windows XP보다 Windows7의 TEB 구조가 더 커진걸 확인할 수 있음
+0x000 NtTib : _NT_TIB
...
+0x030 ProcessEnvironmentBlock : Ptr32 _PEB
중요 멤버만 보면 위와 같다.
ProcessEnvironmentBlock멤버
옵셋 30에 있는데 PEB 구조체의 포인터 이다.. PEB는 프로세스별로 하나만 생성된다.
NtTib멤버
TEB 구조체의 첫번째 멤버는 _NT_TIB 구조체임
typedef struct _NT_TIB {
struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;
PVOID StackBase;
PVOID StackLimit;
PVOID SubSystemTib;
union {
PVOID FiberData;
DWORD Version;
};
PVOID ArbitraryUserPointer;
struct _NT_TIB *Self;
} NT_TIB;
typedef NT_TIB *PNT_TIB;
ExceptionList멤버는 _EXCEPTIONS_REGISTRATION_RECORD 구조체 연결 리스트 가리킴 -> SEH라고 하는 윈도우 운영체제의 예외 처리 매커니즘에 사용
Self멤버는 NT_TIB 구조체의 셀프 포인터 -> TEB 구조체 포인터
그럼 유저모드에서 TEB구조체 접근은?
-> OS에서 제공하는 API를 사용
NtCurrentTeb 함수
- ntdll.NtCurrentTeb API는 현재 스레드의 TEB (Thread Environment Block) 주소를 반환
- 내부적으로 FS:[0x18] 레지스터를 참조해 TEB의 시작 주소를 반환
FS 세그먼트 레지스터
- FS 레지스터는 직접 TEB 주소를 가리키지 않고, Segment Descriptor Table (SDT)의 인덱스를 통해 TEB를 참조
- FS:[0x18] → TEB 시작 주소
- FS:[0x30] → PEB (Process Environment Block) 주소
- FS:[0] → SEH (Structured Exception Handler) 주소
중요 오프셋
- FS:[0x18] → TEB.NtTib.Self → TEB 시작 주소
- FS:[0x30] → TEB.ProcessEnvironmentBlock → PEB 주소
- FS:[0] → TEB.NtTib.ExceptionList → SEH 시작 주소
기본 개념
- FS:[0x18] → 현재 스레드의 TEB
- FS:[0x30] → 프로세스의 PEB
- FS:[0] → 예외 처리 체인(SEH)
정리...
- FS 레지스터는 TEB와 PEB 접근에 중요한 역할을 함
- 주로 디버깅 우회(Anti-Debugging) 및 메모리 구조 분석에 사용
반응형
'공부해요 > 리버싱_핵심원리' 카테고리의 다른 글
48. SEH (0) | 2025.01.08 |
---|---|
47. PEB (1) | 2025.01.02 |
45. TLS 콜백 함수 (0) | 2025.01.02 |
44. InjDll.exe-DLL 인젝션 전용 도구 (0) | 2024.12.26 |
43. DLL Injection in Kernel 6 (0) | 2024.12.26 |