상세 컨텐츠

본문 제목

010 고급 리버싱

본문

I. TLS 콜백 함수

: Thread Local Storage Callback Function

: 스레스 생성 및 종료 시 호출, EP 코드보다 먼저 실행

       i. TLS(Thread Local Storage)

             : 스레드별로 독립된 데이터 저장 공간

             : 스레드 내에서 프로세스의 전역(Global) 데이터나 정적(Static) 데이터를 마치 지역(Local) 데이터처럼 독립적으로 취급하고 싶을 때 사용

             : TLS 기능을 사용하도록 프로그래밍하면, PE 헤더에 TLS Table 항목이 세팅됨

             : IMAGE_OPTIONAL_HEADER의 IMAGE_DATA_DIRECTORY[9]에 IMAGE_TLS_DIRECTORY 생성됨

             : 프로세스가 시작될 때 시스템에서 배열에 저장된 함수를 하나씩 호출

IMAGE_TLS_DIRECTORY Structure from ReverseCore

                    AddressOfCallbacks : TLS 콜백 함수 주소(VA 형태) 배열, 끝은 NULL로 표시

                          → 프로그램에 TLS 콜백 함수 여러 개 등록 가능

       ii. TLS Callback Function

             : 프로세스의 스레드가 생성/종료될 때마다와 메인 스레드가 생성될 때 자동으로 호출되는 Callback Function

            DllHandle : 모듈의 핸들, 로딩 주소

            Reason : TLS 콜백 함수가 호출된 이유

 

II. TEB

: Thread Environment Block

: 프로세스에서 실행되는 스레드에 대한 정보를 담고 있는 구조체, 스레드별로 하나씩 할당, OS 별로 상이

: Windbg로 Binary를 여러 !teb, dt_teb를 하면 상세 정보 열람 가능

       i. TEB Structure

TEB Structure from ReverseCore
TEB Structure contents of Windows7 from ReverseCore

            ProcessEnvironmentBlock : PEB(Process Environment Block) 구조체의 포인터, PEB는 프로세스 별로 하나만 생성

             NtTib : _NT_TIB 구조체, Tib(Thread Information Block), SEH에 사용

_NT_TIB Structure from ReverseCore

                  ExceptionList : _EXCEPTION_REGISTRATION_RECORD 구조체 연결 리스트

                  Self : NT_TIB 구조체의 셀프 포인터, TEB 구조체 포인터

 

       ii. TEB 접근 방법

             : OS에서 제공하는 API 사용

            Ntdll.NtCurrentTeb()

                    : 현재 스레드의 TEB 구조체 주소 리턴

             FS Segment Register

                    : 현재 스레드의 TEB 주소를 가지고있는 Segment Descriptor Table의 Index를 가지고있음

                          ※Segment Descriptor Table : 커널 메모리에 존재, GDTR(Global Descriptor Table Register)에 주소 저장

                    : 32bit의 경우 4GB의 가상 메모리, 64bit의 경우 8TB의 가상 메모리 할당 & GS 레지스터

FS Segment Register from ReverseCore
FS:[0x18] = TEB 시작 주소
FS:0 - FS 레지스터가 Indexing하는 Segment Descriptor가 가리키는 Segment Memory의 시작 주소
FS Segment Register & GS Segment Register from idioth

II. PEB(Process Environment Block)

       : 프로세스 정보를 담고 있는 구조체

       i. PEB 접근 방법

             : FS 세그먼트 셀렉터가 가리키는 세그먼트 메모리의 시작 주소에 위치

 

       ii. PEB Structure

             : TEB.ProcessEnvironmentBlock 멤버가 PEB 구조체의 주소, mov eax, DWORD PTR FS:[30]

             : TEB 구조체는 FS Segment Selector가 가리키는 Segment Memory 시작 주소에 위치

PEB Strucutre from ReverseCore
PEB Structure contents from ReverseCore
Important members of PEB Structure from idioth

                        BeingDebugged : 프로그램이 디버깅당하고 있는 지 여부를 판단하여 디버깅 확인되면 1(True), 아니면 0(False)

                        ImageBaseAddress : 프로세스의 ImageBase

                            GetModuleHandle() : ImageBase를 얻어내는 API, lpModuleName에 NULL을 입력한 후 호출하면 프로세스가 로딩된 ImageBase를 리턴

GetModuleHandle API from ReverseCore

                        Ldr : _PEB_LDR_DATA 구조체의 포인터

PEB Ldr DATA Structure from ReverseCore

                             → 프로세스에 로딩된 DLL의 로딩 베이스 주소를 직접 구할 수 있는 방법 제공

                              _LIST_ENTRY : 양방향 연결 리스트 매커니즘 제공

_LDR_DATA_TABLE_ENTRY Structure from ReverseCore

                        ProcessHeap, NtGlobalFlag : 프로세스가 디버깅 중일 때 특정한 값

 

III. SEH

: Structured Exception Handler, Windows 운영 체제에서 제공하는 예외 처리 시스템

: 소스 코드에서 __try, __except, __finally 키워드로 구현 가능

: 체인 형태, _EXCEPTION_REGISTRATION_RECORD 구조체 연결 리스트의 형태로 구성

_EXCEPTION_REGISTRATION_RECORD Structure from ReverseCore
SEH chain from ReverseCore
SEH function from ReverseCore

'Reversing > Project - 악성 코드, 진실의 방으로' 카테고리의 다른 글

012 DLL Injection  (0) 2020.09.26
011 Anti Debugging  (0) 2020.09.25
009 Packer  (0) 2020.09.20
008 IAT & EAT  (0) 2020.09.20
007 PE File Format  (0) 2020.09.20

관련글 더보기