SEH ํจ์
- ์์ธ ์ฒ๋ฆฌ๊ธฐ๋ 4๊ฐ์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ๋ ฅ ๋ฐ๊ณ , ์ด๊ฑฐํ(enum) EXCEPTION_DISPOSITION์ ๋ฆฌํด
EXCEPTION_DISPOSITION _except_handler
(
EXCEPTION_RECORD *pRecord,
EXCEPTION_REGISTRATION_RECORD *pFrame,
CONTEXT *pContext,
PVOID pValue
);
- SEH ํจ์ ์ฒซ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ EXCEPTION_RECORD
typedef struct _EXCEPTION_RECORD {
DWORD ExceptionCode; //์์ธ ์ฝ๋
DWORD ExceptionFlags;
struct _EXCEPTION_RECORD *ExceptionRecord;
PVOID ExceptionAddress; //์์ธ ๋ฐ์ ์ฃผ์
DWORD NumberParameters;
ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
} EXCEPTION_RECORD;
- ExceptionCode: ๋ฐ์ํ ์์ธ์ ์ข ๋ฅ
- ExceptionAddress: ์์ธ๊ฐ ๋ฐ์ํ ์ฝ๋ ์ฃผ์
- SEH ํจ์ ์ธ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ CONTEXT
typedef struct _WOW64_CONTEXT {
DWORD ContextFlags;
DWORD Dr0;
DWORD Dr1;
DWORD Dr2;
DWORD Dr3;
DWORD Dr6;
DWORD Dr7;
WOW64_FLOATING_SAVE_AREA FloatSave;
DWORD SegGs;
DWORD SegFs;
DWORD SegEs;
DWORD SegDs;
DWORD Edi;
DWORD Esi;
DWORD Ebx;
DWORD Edx;
DWORD Ecx;
DWORD Eax;
DWORD Ebp;
DWORD Eip;
DWORD SegCs;
DWORD EFlags;
DWORD Esp;
DWORD SegSs;
BYTE ExtendedRegisters[WOW64_MAXIMUM_SUPPORTED_EXTENSION];
} WOW64_CONTEXT;
- CONTEXT ๊ตฌ์กฐ์ฒด๋ CPU ๋ ์ง์คํฐ ๊ฐ์ ๋ฐฑ์
ํ๋ ์ฉ๋๋ก ์ฌ์ฉ
- ๋ฉํฐ ์ค๋ ๋ ํ๊ฒฝ ๋๋ฌธ
- ์ค๋ ๋๋ ๋ด๋ถ CONTEXT ๊ตฌ์กฐ์ฒด๋ฅผ ํ๋์ฉ ๊ฐ์ง๊ณ ์๊ณ CPU๊ฐ ๋ค๋ฅธ ์ค๋ ๋ ์คํ์ ์ํด ๋ ๋ ๋ ํ์ฌ ์ค๋ ๋์ ๋ ์ง์คํฐ ๊ฐ์ CONTEXT์ ๋ฐฑ์ , ๊ทธ ํ CPU๊ฐ ๋ค์ ์์ ์ค๋ ๋๋ฅผ ์คํํ๋ฌ ์ค๋ฉด ๊ทธ ์ค๋ ๋์ CONTEXT์ ์ ์ฅ๋ ๋ ์ง์คํฐ ๊ฐ๋ค์ ์ค์ CPU ๋ ์ง์คํฐ์ ๋ฎ์ด์ฐ๊ณ ์คํ
- ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ์ค๋ ๋๋ ์คํ์ด ์ค์ง๋๊ณ SEH๊ฐ ์คํ๋๋๋ฐ, ์ด๋ OS๋ ์์ธ ์ฒ๋ฆฌ๊ธฐ ํ๋ผ๋ฏธํฐ์ ํด๋น ์ค๋ ๋์ CONTEXT ๊ตฌ์กฐ์ฒด ํฌ์ธํฐ๋ฅผ ๋๊ฒจ์ค
- CONTEXT.Eip
- ์์ธ ์ฒ๋ฆฌ๊ธฐ์์๋ ํ๋ผ๋ฏธํฐ๋ก ๋์ด์จ CONTEXT.Eip๋ฅผ ๋ค๋ฅธ ์ฃผ์๋ก ์ค์ ํ ํ ๋ฆฌํด, ์๊น ์ค์ง๋ ์ค๋ ๋๋ ์๋ก ์ค์ ๋ EIP ์ฃผ์์ ์ฝ๋๋ฅผ ์คํ
→ ์ํฐ ๋๋ฒ๊น ์ ์์ฃผ ์ฌ์ฉ๋๋ ํน์ง
- ์์ธ ์ฒ๋ฆฌ๊ธฐ์์๋ ํ๋ผ๋ฏธํฐ๋ก ๋์ด์จ CONTEXT.Eip๋ฅผ ๋ค๋ฅธ ์ฃผ์๋ก ์ค์ ํ ํ ๋ฆฌํด, ์๊น ์ค์ง๋ ์ค๋ ๋๋ ์๋ก ์ค์ ๋ EIP ์ฃผ์์ ์ฝ๋๋ฅผ ์คํ
- SEH ํจ์ ๋ฆฌํด ๊ฐ EXCEPTION_DISPOSITION
typedef enum _EXCEPTION_DISPOSITION
{
ExceptionContinueExecution = 0, //์์ธ ์ฝ๋ ์ฌ์คํ
ExceptionContinueSearch = 1, //๋ค์ ์์ธ ์ฒ๋ฆฌ๊ธฐ ์คํ
ExceptionNestedException = 2, //OS ๋ด๋ถ์์ ์ฌ์ฉ๋จ
ExceptionCollidedUnwind = 3 //OS ๋ด๋ถ์์ ์ฌ์ฉ๋จ
} EXCEPTION_DISPOSITION;
- ExceptionContinueExecution(0): ์์ธ๊ฐ ๋ฐ์ํ ์ฝ๋๋ถํฐ ์ฌ์คํ
- ExceptionContinueSearch(1): ์์ธ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ ๋ SEH ์ฒด์ธ์์ ๋ค์ ์์ธ ์ฒ๋ฆฌ๊ธฐ์์ ์ฒ๋ฆฌํ๋๋ก ํจ
SEH ์ฒด์ธ์ ์ ๊ทผ
- TEB ๊ตฌ์กฐ์ฒด์ NtTib ๋ฉค๋ฒ ๋ฐ๋ผ๊ฐ๊ธฐ
- TEB๋ FS ์ธ๊ทธ๋จผํธ ๋ ์ง์คํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ์ธ๊ทธ๋จผํธ ๋ฉ๋ชจ๋ฆฌ์ ์์ ์ฃผ์์ ์์น
- TEB.NtTib.ExceptionList = FS:[0]
TEB, Thread Environment Block
- ํ๋ก์ธ์ค์์ ์คํ๋๋ ์ค๋ ๋์ ๋ํ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ๊ตฌ์กฐ์ฒด
- TIB(Thread Information Block)์ด๋ผ๊ณ ๋ ํจ
- ์ค๋ ๋๋ณ TEB ๊ตฌ์กฐ์ฒด๊ฐ ํ๋์ฉ ํ ๋น๋จ
- TEB ๊ตฌ์กฐ์ฒด (msdn)
typedef struct _TEB {
PVOID Reserved1[12];
PPEB ProcessEnvironmentBlock;
PVOID Reserved2[399];
BYTE Reserved3[1952];
PVOID TlsSlots[64];
BYTE Reserved4[8];
PVOID Reserved5[26];
PVOID ReservedForOle;
PVOID Reserved6[4];
PVOID TlsExpansionSlots;
} TEB, *PTEB;
- TEB ๊ตฌ์กฐ์ฒด - Windows 7 (WinDbg)
+0x000 NtTib : _NT_TIB
+0x01c EnvironmentPointer : Ptr32 Void
+0x020 ClientId : _CLIENT_ID
+0x028 ActiveRpcHandle : Ptr32 Void
+0x02c ThreadLocalStoragePointer : Ptr32 _PEB
+0x030 ProcessEnvironmentBlock : Ptr32 _PEB
...
- TEB ๊ตฌ์กฐ์ฒด ์ฃผ์ ๋ฉค๋ฒ
- ProcessEnvironmentBlock
- PEB ๊ตฌ์กฐ์ฒด์ ํฌ์ธํฐ
- NtTib
- _NT_TIB ๊ตฌ์กฐ์ฒด
- ExceptionList: _EXCEPTION_REGISTRATION_RECORD ๊ตฌ์กฐ์ฒด ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์์
- Self: NT_TIB ๊ตฌ์กฐ์ฒด์ ์ ํ ํฌ์ธํฐ. ์ฆ, TEB ๊ตฌ์กฐ์ฒด ํฌ์ธํฐ
- _NT_TIB ๊ตฌ์กฐ์ฒด
- ProcessEnvironmentBlock
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;
PEB, Process Environment Block
- ํ๋ก์ธ์ค ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ๊ตฌ์กฐ์ฒด
- PEB ๊ตฌ์กฐ์ฒด (msdn)
typedef struct _PEB {
BYTE Reserved1[2];
BYTE BeingDebugged;
BYTE Reserved2[1];
PVOID Reserved3[2];
PPEB_LDR_DATA Ldr;
PRTL_USER_PROCESS_PARAMETERS ProcessParameters;
PVOID Reserved4[3];
PVOID AtlThunkSListPtr;
PVOID Reserved5;
ULONG Reserved6;
PVOID Reserved7;
ULONG Reserved8;
ULONG AtlThunkSListPtr32;
PVOID Reserved9[45];
BYTE Reserved10[96];
PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine;
BYTE Reserved11[128];
PVOID Reserved12[1];
ULONG SessionId;
} PEB, *PPEB;
- PEB ๊ตฌ์กฐ์ฒด - Windows 7 (WinDbg)
+000 InheritedAddressSpace : UChar
+001 ReadImageFileExecOptions : Uchar
+002 BeingDebugged : Uchar
+003 BitField : UChar
+003 ImageUsesLargePages : Pos 0, 1 Bit
...
+008 ImageBaseAddress : UChar
...
+00c Ldr : Ptr32 _PEB_LDR_DATA
...
+018 ProcessHeap : Ptr32 Void
...
+068 NtGlobalFlag : Uint4B
...
- PEB ๊ตฌ์กฐ์ฒด ์ฃผ์ ๋ฉค๋ฒ
- PEB.BeingDebugged
- ํ์ฌ ํ๋ก์ธ์ค๊ฐ ๋๋ฒ๊น ๋นํ๋์ง ํ๋จ
- IsDebuggerPresent ํจ์๊ฐ ์ฐธ์กฐํ๋ ์ ๋ณด
- ๋๋ฒ๊น ์ค์ด๋ฉด 1, ์๋๋ฉด 0์ ๋ฆฌํด
- ์ผ๋ฐ ์์ฉ ํ๋ก๊ทธ๋จ ๊ฐ๋ฐ์๋ ์ ์ฌ์ฉ๋์ง ์๊ณ , ์ฃผ๋ก ์ํฐ ๋๋ฒ๊น ์ ์ด์ฉ
- PEB.ImageBaseAddress
- ํ๋ก์ธ์ค์ ImageBase๋ฅผ ํ์
- GetMoaduleHandle ํจ์๊ฐ ์ฐธ์กฐํ๋ ์ ๋ณด
* GetMoaduleHandle: ํ๋ก์ธ์ค์ ImageBase๋ฅผ ์ป์ด๋ด๋ API
- PEB.Ldr
- _PEB_LDR_DATA ๊ตฌ์กฐ์ฒด์ ํฌ์ธํฐ
- ํ์ฌ ํ๋ก์ธ์ค์์ ๋ก๋๋ ๋ชจ๋๋ค์ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์
- ํ๋ก์ธ์ค์ ๋ก๋ฉ๋ ๋ชจ๋(DLL)์ ๋ก๋ฉ ๋ฒ ์ด์ค ์ฃผ์๋ฅผ ๊ตฌํ ์ ์๊ธฐ ๋๋ฌธ!
- _PEB_LDR_DATA ๊ตฌ์กฐ์ฒด์ _LIST_ENTRY ํ์ ์ ๋ฉค๋ฒ(InLoadOrderModuleList, InMemoryOrderModuleList, InInitializationOrderModuleList)๋ฅผ ํตํด ์์๋ผ ์ ์์
- _LIST_ENTRY๋ ์๋ฐฉํฅ ์ฐ๊ฒฐ ๋ฆฌ์คํธ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ๋๋ฐ, ์ด ์ฐ๊ฒฐ ๋ฆฌ์คํธ์๋ _LDR_DATA_TABLE_ENTRY ๊ตฌ์กฐ์ฒด ์ ๋ณด๊ฐ ์ ์ฅ.
- ํ๋ก์ธ์ค์ ๋ก๋ฉ๋ DLL ๋ชจ๋๋ง๋ค _LDR_DATA_TABLE_ENTRY ๊ตฌ์กฐ์ฒด๊ฐ ํ๋์ฉ ์์ฑ๋๊ณ , ์ด๋ค์ _LIST_ENTRY ์๋ฐฉํฅ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ก ์ฐ๊ฒฐ๋์ด ์๊ธฐ ๋๋ฌธ์ DLL ๋ชจ๋์ ๋ก๋ฉ ๋ฒ ์ด์ค ์ฃผ์๋ฅผ ๊ตฌํ ์ ์๊ฒ ๋จ
- PEB.ProcessHeap, PEB.NtGlobalFlag
- ํ๋ก์ธ์ค๊ฐ ๋๋ฒ๊น ์ค์ด๋ผ๋ฉด ํน์ ํ ๊ฐ์ ๊ฐ์ง
- ์ฃผ๋ก ์ํฐ ๋๋ฒ๊น ์ ์ด์ฉ
- PEB.BeingDebugged
FS ๋ ์ง์คํฐ๋ฅผ ํตํ TEB, PEB, SEH ์์ ์ฃผ์
- FS ์ธ๊ทธ๋จผํธ ๋ ์ง์คํฐ: ํ์ฌ ์ค๋ ๋์ TEB๋ฅผ ์ง์
- FS ๋ ์ง์คํฐ์ ํฌ๊ธฐ: 16๋นํธ
- ์ฌ์ค, IA32 ์์คํ ์ ํ๋ก์ธ์ค ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ๋ 4GB์ด๋ฏ๋ก 32๋นํธ ํฌ๊ธฐ์ ํฌ์ธํฐ๋ฅผ ์ด์ฉํด์ผ ์ ์ฒด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ ๊ทผ ๊ฐ๋ฅ
- ๊ทธ๋ฌ๋ FS ๋ ์ง์คํฐ๋ ์ง์ TEB ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฒ์ด ์๋๋ผ, ์ค์ TEB ์ฃผ์๋ฅผ ๊ฐ์ง๊ณ ์๋ Segment Descriptor Table์ Index ๊ฐ์ ๊ฐ์ง๊ณ ์์
(Segment Descriptor Table์ ์ปค๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์กด์ฌํ๋ฉฐ, ๊ทธ ์ฃผ์๋ ํน์ ๋ ์ง์คํฐ GDTR(Global Descriptor Table Register)์ ์ ์ฅ๋์ด ์์) - ๊ทธ๋์ "Segment Selector"๋ผ๊ณ ๋ ํ๋ค.
- TEB ์์ ์ฃผ์
- FS:[0x18] = TEB.NtTib.Self = address of TEB(TIB) = FS:0
- Self์ ์์น๊ฐ TEB ๊ตฌ์กฐ์ฒด ์์์ผ๋ก๋ถํฐ 018 ์ต์ ๋จ์ด์ง ์์น์
- Self ํฌ์ธํฐ ๋ณ์: _NT_TIB ๊ตฌ์กฐ์ฒด ์์ ์์น = TEB ์์ ์์น
- PEB ์์ ์ฃผ์
- FS:[0x30] = TEB.ProcessEnvironmentBlock = address of PEB
- ์ฃผ๋ก ์ํฐ ๋๋ฒ๊น ์์ ๋ง์ด ์ฌ์ฉ
- SEH ์์ ์ฃผ์
- FS:[0] = TEB.NtTib.ExceptionList = address of SEH
- ์ฃผ๋ก ์ํฐ ๋๋ฒ๊น ์์ ๋ง์ด ์ฌ์ฉ
- ์ด์
๋ธ๋ฆฌ ์ฝ๋๋ก ์ ๊ทผ
1) ๋ฐ๋ก PEB ์ฃผ์ ๊ตฌํ๊ธฐ
mov eax, dword ptr fs:[30]
2) TEB ์ฃผ์๋ฅผ ๊ตฌํ๊ณ ProcessEnvironmentBlock ๋ฉค๋ฒ(+30 ์ต์ )๋ฅผ ์ด์ฉ (์ ์!)
mov eax, dword ptr fs:[18]
mov, dword ptr ds:[eax+30]
Ref.
[1] ์ด์น์, "๋ฆฌ๋ฒ์ฑ ํต์ฌ์๋ฆฌ"
[2] Learn Microsoft, "EXCEPTION_RECORD (winnt.h)"
[3] Learn Microsoft, "WOW64_CONTEXT structure (winnt.h)"
[4] NirSoft, "EXCEPTION_DISPOSITION"
[5] Learn Microsoft, " TEB structure (winternl.h)"
[6] Learn Microsoft, "PEB structure (winternl.h)"
'Study > study' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋งํฌ ๋ฐฉ์์ ๋ฐ๋ฅธ ๋์ค์ด์ ๋ธ๋ฆฌ ์ฝ๋ ํน์ง (1) | 2024.11.07 |
---|---|
์๋ ์คํ ๋ฑ๋ก ํ๋ก๊ทธ๋จ(C++) ๋ฆฌ๋ฒ์ฑ (0) | 2024.11.05 |
SEH, ์์ธ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ (0) | 2024.05.13 |
TLS, TLS ์ฝ๋ฐฑํจ์ (0) | 2024.05.09 |
SEH, ๊ตฌ์กฐ์ ์์ธ ์ฒ๋ฆฌ (2) | 2024.05.07 |