TEB(Thread Environment Block)
-> 프로세스에서 실행되는 스레드에 대한 정보를 담고 있는 구조체
-> 스레드 별로 TEB 구조체가 하나씩 할당된다.
-> OS 별로 모양이 조금씩 달라진다.
중요멤버
-> ProcessEnvironmentBlock : PEB 구조체 포인터 (프로세스 별로 하나씩 생성)
-> NtTib : _NT_TIB 구조체(Thread information Block)
_NT_TIB 구조체
-> ExceptionList : _EXCEPTION_REGISTRATION_RECORD 구조체 연결 리스트를 가르키고 있다.(SEH에 사용됨)
-> Self : _NT_TIB 구조체의 셀프 포인터 (TEB의 첫번째 멤버가 _NT_TIB 구조체 이기 때문에 Self는 TEB 구조체 포인터이다.)
TEB 접근 방법
-> 유저모드로 접근하는 법(WinDbg 커널 모드 디버깅을 이용해 TEB 구조체에 접근하면 쉽다.)
-> OS 에서 제공하는 API 사용! (Ntdll.NtCurrentTeb() API 사용)
Ntdll.NtCurrentTeb() API
-> 현재 스레드의 TEB 구조체 주소를 리턴하는 함수
FS 세그먼트 레지스터
-> FS레지스터는 직접 TEB 주소를 가리키는 것이 아니라 실제 TEB 주소를 가지고 있는 Segment Descriptor Table의 Index를 가지고 있다.
-> FS:[0] : SEH의 시작주소
-> FS:[0x18] : TEB의 시작주소
-> FS:[0x30] : PEB의 시작주소
-> FS:0 : TEB의 시작주소
'Reversing(리버싱 핵심 원리) > 고급 리버싱' 카테고리의 다른 글
PEB (Process Environment Block) (0) | 2018.09.06 |
---|---|
TLS 콜백 함수 (0) | 2018.09.04 |