์ค๋์ Dynamic ์ํฐ ๋๋ฒ๊น ๊ธฐ๋ฒ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
Dynamic ์ํฐ ๋๋ฒ๊น ๊ธฐ๋ฒ์ ํต์ฌ ์ฝ๋(OEP)๋ก ๊ฐ์ง ๋ชปํ๋๋ก ํธ๋ ์ด์ฑ์ ์ง์์ ์ผ๋ก ๋ฐฉํดํฉ๋๋ค.
1. ์์ธ (Exception)
์ฒซ ๋ฒ์งธ๋ ์์ธ๋ฅผ ์ด์ฉํ ๋ฐฉ๋ฒ์ ๋๋ค.
์ผ๋ฐ ์คํ๊ณผ ๋๋ฒ๊ฑฐ ์คํ์ ์ฐจ์ด๋ฅผ ์ด์ฉํ๋ ๊ฒ์ ๋๋ค. ์ผ๋ฐ ์คํ์ ์์ธ ๋ฐ์ ์ SEH๋ฅผ ํธ์ถํ์ง๋ง ๋๋ฒ๊น ์ ํตํด ์คํํ๋ฉด ๋๋ฒ๊ฑฐ๊ฐ ์ฒ๋ฆฌํ๋๋ก ๋์๋ฉ๋๋ค. ์์ธ๋ฅผ ๋ง๋๋ฉด ๋๋ฒ๊ฑฐ๊ฐ ์์ฒด์ ์ผ๋ก (๊ฐ๋ก์ฑ์) ์ฒ๋ฆฌํด์ฃผ๊ธฐ ๋๋ฌธ์ ๋๋ค.
1.1. SEH (Structured Exception Handling)
SEH๋ ์์ธ ์ฒ๋ฆฌ ๋ฉ์ปค๋์ฆ์ผ๋ก ์ฒด์ธ ํํ๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค. ์ฒซ ๋ฒ์งธ ์์ธ ์ฒ๋ฆฌ๊ธฐ์์ ํด๋น ์์ธ๋ฅผ ์ฒ๋ฆฌํ์ง ๋ชปํ๋ฉด ๋ค์ ์์ธ ์ฒ๋ฆฌ๊ธฐ๋ก ์์ธ๋ฅผ ๋๊ฒจ์ฃผ๋ ํ์์ ๋๋ค. ์์ธ ์ฒ๋ฆฌ๊ธฐ๋ 4๊ฐ์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ๋ ฅ๋ฐ์ต๋๋ค.
SEH ํจ์(์์ธ ์ฒ๋ฆฌ๊ธฐ) ์ ์
EXCEPTION_DISPOSITION _except_handler
(
EXCEPTION_RECORD *pRecord,
EXCEPTION_REGISTRATION_RECORD *pFrame,
CONTEXT *pContext,
PVOID pValue
);
์คํ๋๋ ํ๋ก์ธ์ค์์ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด SEH๊ฐ ํธ์ถ๋๊ณ , ์ด๋ OS๋ ํด๋น ์ค๋ ๋์ CONTEXT ๊ตฌ์กฐ์ฒด ํฌ์ธํฐ๋ฅผ ์์ธ ์ฒ๋ฆฌ๊ธฐ์ ํ๋ผ๋ฏธํฐ๋ก ๋๊ฒจ์ค๋๋ค. ๋์ค์ ์ฐ์์ด ์๊ธฐ ๋๋ฌธ์ ์ฒซ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ _EXCEPTION_RECORD์ ์ธ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ CONTEXT์ ๊ตฌ์กฐ์ฒด๋ ๋ ์์ธํ ๋ณผ ํ์๊ฐ ์์ต๋๋ค.
_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, *PEXCEPTION_RECORD;
CONTEXT ๊ตฌ์กฐ์ฒด ์ ์ (IA-32)
typedef struct _CONTEXT {
ULONG ContextFlags;
ULONG Dr0; // 04h
ULONG Dr1; // 08h
ULONG Dr2; // 0ch
ULONG Dr3; // 10h
ULONG Dr6; // 14h
ULONG Dr7; // 18h
FLOATING_SAVE_AREA FloatSave;
ULONG SegGs; // 88h
ULONG SegFs; // 90h
ULONG SegEs; // 94h
ULONG SegDs; // 98h
ULONG Edi; // 9ch
ULONG Esi; // A0h
ULONG Ebx; // A4h
ULONG Edx; // A8h
ULONG Ecx; // ACh
ULONG Eax; // B0h
ULONG Ebp; // B4h
ULONG Eip; // B8h
ULONG SegCs; // BCh
ULONG EFlags; // C0h
ULONG Esp; // C4h
ULONG SegSs; // C8h
UCHAR ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];
} CONTEXT;
์ค๋ ๋๋ง๋ค ํ๋์ฉ ๊ฐ์ง๊ณ ์๋ CONTEXT ๊ตฌ์กฐ์ฒด์๋ CPU ๋ ์ง์คํฐ ๊ฐ์ด ๋ฐฑ์ ๋์ด ์ ์ฅ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ฉํฐ ์ค๋ ๋ ํ๊ฒฝ์์๋ ์ค๋ ๋ ๋จ์๋ณ๋ก ์คํํ ์ ์์ต๋๋ค
๋ํ์ ์์ธ(EXCEPTION) ๋ชฉ๋ก
EXCEPTION_DATATYPE_MISALIGNMENT (0x80000002)
EXCEPTION_BREAKPOINT (0x80000003)
EXCEPTION_SINGLE_STEP (0x80000004)
EXCEPTION_ACCESS_VIOLATION (0xC0000005)
EXCEPTION_IN_PAGE_ERROR (0xC0000006)
EXCEPTION_ILLEGAL_INSTRUCTION (0xC000001D)
EXCEPTION_NONCONTINUABLE_EXCEPTION (0xC0000025)
EXCEPTION_INVALID_DISPOSITION (0xC0000026)
EXCEPTION_ARRAY_BOUNDS_EXCEEDED (0xC000008C)
EXCEPTION_FLT_DENORMAL_OPERAND (0xC000008D)
EXCEPTION_FLT_DIVIDE_BY_ZERO (0xC000008E)
EXCEPTION_FLT_INEXACT_RESULT (0xC000008F)
EXCEPTION_FLT_INVALUD_OPERATION (0xC0000090)
EXCEPTION_FLT_OPERATION (0xC0000091)
EXCEPTION_FLT_STACK_CHECK (0xC0000092)
EXCEPTION_FLT_UNDERFLOW (0xC0000093)
EXCEPTION_INT_DIVIDE_BY_ZERO (0xC0000094)
EXCEPTION_INT_OVERFLOW (0xC0000095)
EXCEPTION_PRIV_INSTUCTION (0xC0000096)
EXCEPTION_STACK_OVERFLOW (0xC00000FD)
๊ทธ์ค ๊ฐ์ฅ ๋ํ์ ์์ธ์ธ EXCEPTION_BREAKPOINT๋ฅผ ์ด์ฉํ ์ํฐ ๋๋ฒ๊น ๊ธฐ๋ฒ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
breakpoint๋ก ์ธํ ์์ธ ๋ฐ์ ์, ์ผ๋ฐ์ ์ผ๋ก ์คํ ์ค์ด๋ฉด ๋ฑ๋ก๋ SEH๋ก ๋์ด๊ฐ๊ณ ๋๋ฒ๊น ์ค์ด๋ฉด ๋๋ฒ๊ฑฐ์ ์ํด ์์ธ๊ฐ ์ฒ๋ฆฌ๋ฉ๋๋ค.
INT3(BP)์ ์ํด ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค.
๋๋ฒ๊ฑฐ๋ก ์คํํ๋ค๋ฉด ๋ฏธ๋ฆฌ ๋ฑ๋ก๋ SEH๊ฐ ์คํ๋์ง ์์ต๋๋ค. ๊ทธ๋์ ์์ธ๊ฐ ๋ฐ์ํ ๋ค์ ์ฝ๋๊ฐ ์คํ๋๋๋ฐ ํด๋น ์ฝ๋๋ 0xFFFFFFFF ์ฃผ์๋ก ์ด๋ํ์ฌ ๋น์ ์์ ์ผ๋ก ์ข ๋ฃํ๊ฒ ํฉ๋๋ค.
ollydbg์ debugging options์ INT3 breaks ์ต์ ์ ์ฒดํฌํ๋ฉด ์ฝ๊ฒ ์ฐํํ ์ ์์ต๋๋ค.
INT3 ์์ธ๋ฅผ ๋ฌด์ํ๋๋ก ์ค์ ํ๋ฉด ๋ฑ๋ก๋ SEH ์ฝ๋๊ฐ ์คํ๋ฉ๋๋ค.
1.2. SetUnhandledExceptionFilter()
ํ๋ก์ธ์ค์์ ์์ธ๊ฐ ๋ฐ์ํ์ ๋ SEH์์ ์ฒ๋ฆฌ๋์ง ์๊ฑฐ๋ ๋ฑ๋ก๋ SEH๊ฐ ์์ ๋ ํธ์ถ๋๋ API์ ๋๋ค. ์ด ํจ์๋ Top Level Exception Filter(๋๋ Last Exception Filter)๋ผ๋ ์์ธ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ๋ฑ๋กํ๊ณ , ์์ธ๊ฐ ๋ฐ์ํ์ ๋ ํด๋น ํํฐ ํจ์๊ฐ ํธ์ถ๋๋๋ก ํฉ๋๋ค. ์์คํ ์ ๋ง์ง๋ง ์์ธ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์คํ์ํค๋ ๊ฒ์ ๋๋ค.
SetUnhandledExceptionFilter ์ ์
LPTOP_LEVEL_EXCEPTION_FILTER SetUnhandledExceptionFilter(
LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter
);
- lpTopLevelExceptionFilter
- ์ฒ๋ฆฌ๋์ง ์์ ์์ธ๊ฐ ๋ฐ์ํ ๋ ํธ์ถ๋ ํจ์์ ํฌ์ธํฐ
- Top Level Exception Filter ํจ์ ์ฃผ์๊ฐ ์ ์ฅ๋๋ค.
SetUnhandledExceptionFilter ํจ์์ ๋ฆฌํด๊ฐ์ ์ด์ Top Level Exception Filter ํจ์ ์ฃผ์์ ๋๋ค.
TopLevelExceptionFilter ์ ์
LONG WINAPI TopLevelExceptionFilter(
EXCEPTION_POINTERS *ExceptionInfo
);
- ExceptionInfo
- EXCEPTION_POINTERS ๊ตฌ์กฐ์ฒด์ ๋ํ ํฌ์ธํฐ
- ์์ธ๊ฐ ๋ฐ์ํ ์ ๋ณด(์: ์์ธ ์ฝ๋, ์์ธ ๋ฐ์ ์์น, ๋ ์ง์คํฐ ์ํ ๋ฑ)๋ฅผ ํฌํจํ๋ค.
EXCEPTION_POINTERS ๊ตฌ์กฐ์ฒด๋ ์์ธ๊ฐ ๋ฐ์ํ์ ๋ ์์ธ ์ฒ๋ฆฌ๊ธฐ์๊ฒ ์ ๋ฌ๋๋ ์ค์ํ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋๋ค.
EXCEPTION_POINTER ๊ตฌ์กฐ์ฒด
typedef struct _EXCEPTION_POINTERS {
EXCEPTION_RECORD *ExceptionRecord;
CONTEXT *ContextRecord;
} EXCEPTION_POINTERS;
- ExceptionRecord
- EXCEPTION_RECORD ๊ตฌ์กฐ์ฒด์ ๋ํ ํฌ์ธํฐ๋ก, ํด๋น ๊ตฌ์กฐ์ฒด๋ ์์ธ์ ์ธ๋ถ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ค.
- ์์ธ ์ฝ๋, ์์ธ ๋ฐ์ ์์น, ์์ธ์ ์์ธ ๋ฑ์ ํฌํจ
- ContextRecord
- CONTEXT ๊ตฌ์กฐ์ฒด์ ๋ํ ํฌ์ธํฐ๋ก, ํด๋น ๊ตฌ์กฐ์ฒด๋ ์์ธ ๋ฐ์ ์ CPU ๋ ์ง์คํฐ์ ๊ฐ์ ํ๋ก์ธ์ ์ํ ์ ๋ณด๋ฅผ ํฌํจํ๋ค.
- ํ๋ก๊ทธ๋จ ์นด์ดํฐ(PC), ์คํ ํฌ์ธํฐ, ๋ ์ง์คํฐ ๊ฐ ๋ฑ์ด ํฌํจ๋์ด ์์ด ์์ธ ๋ฐ์ ์ ์์คํ ์ํ๋ฅผ ๋ถ์ํ๋๋ฐ ์ฌ์ฉ๋๋ค.
ํ๋ก๊ทธ๋จ์ ๋จผ์ SetUnhandledExceptionFilter ํจ์ ํธ์ถ ์ ์คํ๋ Top Level Exception Filter(์์ธ์ฒ๋ฆฌ๊ธฐ)๋ฅผ ๋ฑ๋กํฉ๋๋ค. Top Level Exception Filter๋ 0x401000 ์ฃผ์์ ๋๋ค.
๊ณ์ ์คํํ๊ฒ ๋๋ฉด 0x401052 ์ฃผ์์์ Invalid Memory Access Violation ์์ธ(EXCEPTION_ACCESS_VIOLATION)๊ฐ ๋ฐ์ํ์ฌ ๋๋ฒ๊น ์ด ์ค์ง๋ฉ๋๋ค.
์ด๋ฅผ ์ฐํํ๊ธฐ ์ํด์๋ SetUnhandledExceptionFilter ํจ์๋ก ๋ฑ๋ก๋ ์์ธ ์ฒ๋ฆฌ ์ฝ๋๋ก ์ด๋๋์ด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๊ธฐ ์ํด์ ๋จผ์ ๋๋ฒ๊ฑฐ๊ฐ ํด๋น Access Violation ์์ธ๋ฅผ ๋ฌด์ํ๋๋ก ์ค์ ํฉ๋๋ค.
๋๋ฒ๊ฑฐ๊ฐ Access Violation ์์ธ๋ฅผ ๋ฌด์ํ๋ฉด ์ด๋ฏธ ๋ฑ๋ก๋์ด ์๋ ์์ธ ์ฒ๋ฆฌ ์ฝ๋๋ก ์ด๋ํฉ๋๋ค.
์์ธ ์ฒ๋ฆฌ ์ฝ๋๋ 4๋ฅผ ๋ฆฌํดํ์ฌ EIP ์ฃผ์์ 4๋ฅผ ๋ํด ์ค๋๋ค. ์์ธ ๋ฐ์ ์ฝ๋ ์ฃผ์๋ 401052์์ผ๋ฏ๋ก 4๋ฅผ ๋ํ๋ฉด 401056์ ๋๋ค. ์์ธ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ๋ฆฌํดํ๋ฉด 401056๋ถํฐ ์คํ๋๊ฒ ๋ฉ๋๋ค.
2. Timing Check
๋๋ฒ๊ฑฐ ์คํ ์ ์ผ๋ฐ ์คํ๋ณด๋ค ํจ์ฌ ์ค๋ ์๊ฐ์ด ์์๋๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์ธก์ ํ์ฌ ๋๋ฒ๊น ์ฌ๋ถ๋ฅผ ํ๋จํ๋ ๊ธฐ๋ฒ์ ๋๋ค.
์ด๋ ๊ตฌํด์จ ์๊ฐ์ ์กฐ์ํ์ฌ ๊ฐ๋จํ ์ฐํํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ณดํต ๋ค๋ฅธ ์ํฐ ๋๋ฒ๊น ๊ธฐ๋ฒ๋ค๊ณผ ํจ๊ป ์ฌ์ฉ๋ฉ๋๋ค.
์๊ฐ์ ํ์ธํ๋ ๋ฐฉ๋ฒ์ ํฌ๊ฒ ๋ ๊ฐ์ง๋ก ๋๋ฉ๋๋ค.
1. CPU์ ์นด์ดํฐ(Counter) ์ด์ฉ
- RDTSC(Read Time Stamp Counter)
- QueryPerformanceCounter / NtQueryPerformanceCounter
- GetTickCount
2. ์์คํ ์ ์ค์ ์๊ฐ(Time) ์ด์ฉ
- timeGetTime
- _ftime
๊ทธ ์ค ๊ฐ์ฅ ์ ํํ๊ณ ๋ง์ด ์ฌ์ฉ๋๋ RDTSC์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
RDTSC
CPU๋ Clock Cycle์ ์นด์ดํธํ์ฌ 64๋นํธ ๋ ์ง์คํฐ TSC(Time Stamp Counter)์ ์ ์ฅํฉ๋๋ค. RDTSC๋ ๊ทธ TSC ๊ฐ์ EDX์ EAX ๋ ์ง์คํฐ์ ์ ์ฅํ๋ ์ด์ ๋ธ๋ฆฌ ๋ช ๋ น์ ๋๋ค. EDX์ EAX์ ๊ฐ ์/ํ์ 32๋นํธ์ฉ ์ ์ฅํฉ๋๋ค.
์ํฐ๋๋ฒ๊น ์ ์ฃผ๋ก ์ฌ์ฉ๋๋ ์ด์ ๋ ๋งค์ฐ ๋น ๋ฅด๊ณ CPU์ ํด๋ญ ์ฃผ๊ธฐ๋ฅผ ์ง์ ์ฝ๊ธฐ ๋๋ฌธ์ ๋๋ฒ๊น ์ค CPU ์๋๊ฐ ๋๋ ค์ง๊ฑฐ๋ ์ค๋จ์ ์์ ์๊ฐ์ ์ธก์ ํ๋ ๋ฐฉ์์ด ๋ค๋ฅผ ๋ ์ด๋ฅผ ํ์งํ๊ธฐ ์ ๋ฆฌํฉ๋๋ค.
rdtsc๋ฅผ ํตํด ํ์ฌ ์๊ฐ์ ๊ตฌํ๊ณ , 3E8h๋ฒ ๋ฃจํ๋ฅผ ๋๋ ค (์ผ๋ถ๋ฌ) ์๊ฐ์ ์๋ชจํ ํ, ๋ค์ ์๊ฐ์ ์ธก์ ํฉ๋๋ค.
์ธก์ ํ ๋ ์๊ฐ์ ์ฐจ์ด๋ฅผ ๊ตฌํ์ฌ ๋๋ฒ๊น ์ฌ๋ถ๋ฅผ ํ๋ณํฉ๋๋ค.
๋ ์๊ฐ์ ์ฐจ์ด๊ฐ FFFFFFh ๋ณด๋ค ํฌ๋ฉด ๋๋ฒ๊น ์ค์ด๋ผ๊ณ ํ๋จํ์ฌ ์ ํํฉ๋๋ค.
์ด๋ฅผ ์ฐํํ๊ธฐ ์ํด์๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
1. ํธ๋ ์ด์ฑ ์์ด ํด๋น ์ฝ๋ runํ๊ธฐ
- ์๊ฐ ์๋ชจ๋ฅผ ์์ ์๊ฐ์ฐจ๊ฐ ๋ง์ด ์ ๋๋๋ก
2. EAX, EDX ๊ฐ ์์ ํ๊ธฐ
3. Jcc์ ๋ง๊ฒ ํ๋๊ทธ ZF ๋๋ CF ๋ณ๊ฒฝํ๊ธฐ
3. Trap Flag
Trap Flag(TF)๋ EFLAGS ๋ ์ง์คํฐ์ 9๋ฒ์งธ(index 8) ๋นํธ๋ก, Trap Flag๊ฐ ์ค์ ๋๋ฉด Single Step ๋ชจ๋๋ก ๋ณ๊ฒฝ๋์ด ๋ช ๋ น์ด๋ฅผ ํ ๋ฒ์ ์คํํ๋ ๊ฒ์ด ์๋๋ผ ํ ๋ช ๋ น์ด์ฉ ์คํํ๊ฒ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ EXCEPTION_SINGLE_STEP ์์ธ๋ฅผ ๋ฐ์์ํจ ํ Trap Flag๋ 0์ผ๋ก ์๋ ์ด๊ธฐํ๋ฉ๋๋ค.
๋จผ์ TF ๊ฐ์ 1๋ก ์ธํ ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค์ ๋ช ๋ น์ ์คํํ๋ฉด EXCEPTION_SINGLE_STEP ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค.
TF๋ ์๋์ผ๋ก ์ด๊ธฐํ๋์์ต๋๋ค.
์ด๋ EXCEPTION_SINGLE_STEP ๋ฐ์ ํ ์ ์ ์คํ ๋ชจ๋๋ก ์ ํ๋์ด ๊ทธ๋๋ก ๊ณ์ ์งํ๋๋ ๊ฒ์ ๋ปํฉ๋๋ค.
๊ทธ๋๋ก ์งํ๋๋ฉด 0xFFFFFFFF๋ก ์ ํํ์ฌ ํ๋ก์ธ์ค๊ฐ ๋น์ ์ ์ข ๋ฃ๋๊ฒ ๋ฉ๋๋ค.
๋๋ฒ๊ฑฐ ์คํ์ด ์๋๋ผ ์ผ๋ฐ ์คํ ์ค์ด์๋ค๋ฉด ๋ฏธ๋ฆฌ ์ค์ ํด๋ SEH ์ฝ๋๋ก ์งํ๋์ํ ์ง๋ง ๋๋ฒ๊ฑฐ๋ก ์คํํ์ฌ ๋น์ ์ ์ข ๋ฃ๋๋ ์ฝ๋๋ก ์งํํ ๊ฒ์ ๋๋ค.
ollydbg์ debugging options์ Single-step break ์ต์ ์ ์ฒดํฌํ๋ฉด ์ฝ๊ฒ ์ฐํํ ์ ์์ต๋๋ค.
4. INT 2D
INT 2D๋ ์ปค๋ ๋ชจ๋์์ ์๋ํ๋ Break point ์์ธ๋ฅผ ๋ฐ์์ํค๋ ๋ช ๋ น์ด๋ก, ์ ์ ๋ชจ๋์์๋ ์์ธ๋ฅผ ๋ฐ์์ํต๋๋ค. INT 2D ๋ํ ๋๋ฒ๊ฑฐ๋ก ์คํํ๋ฉด ์์ธ๋ฅผ ๋ฐ์์ํค์ง ์๊ณ ๋์ด๊ฐ๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์ด์ฉํ์ฌ ์ํฐ ๋๋ฒ๊น ์ ํ์ฉํฉ๋๋ค.
INT 2D ํน์ง
1. 1๋ฐ์ดํธ ๋ฌด์
๋๋ฒ๊น ๋ชจ๋์์ INT 2D๋ฅผ ์คํํ๋ฉด ๋ค์ ๋ช ๋ น์ด์ ์ฒซ ๋ฐ์ดํธ๋ ๋ฌด์๋๊ณ ๊ทธ ๋ค์ ๋ฐ์ดํธ๋ถํฐ ์คํ๋ฉ๋๋ค.
INT 2D(CD 2D) ๋ช ๋ น์ ์คํํ๊ธฐ ์ , ๋ค์ ๋ช ๋ น์ mov eax,5DEB(E8 EB5D0000)์ด์์ง๋ง
INT 2D(CD 2D) ๋ช ๋ น์ ์คํํ ํ์ ๋ค์ ๋ช ๋ น์ 1๋ฐ์ดํธ E8์ด ๋ฌด์๋ EB 5D 0000๋ก ๋ณ๊ฒฝ๋์ด ๋ค๋ฅธ ๋ช ๋ น์ผ๋ก ์ธ์๋์ด ์คํ๋ฉ๋๋ค.
์ด๋ ๊ฒ ์ฝ๋ ๋ฐ์ดํธ ์์๋ฅผ ๋ณ๊ฒฝํ์ฌ ์๋์ ๋ช ๋ น๊ณผ ๋ค๋ฅธ ๋ช ๋ น์ ์ํํ๋๋ก ํฉ๋๋ค. ์ด๋ฅผ ์ฝ๋ ๋๋ ํ(code obfuscating)์ด๋ผ๊ณ ๋ ํ๋ฉฐ dynamic ์ํฐ ๋๋ฒ๊น ๊ธฐ๋ฒ์ ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค.
2. BP๊น์ง ๊ทธ๋๋ก ์คํ
INT 2D ๋ช ๋ น์ ์คํํ๊ณ ํธ๋ ์ด์ฑํ๋ฉด ๊ทธ ๋ค์ ๋ช ๋ น์ด ์์์์ ๋ฉ์ถ์ง ์๊ณ BP๋ฅผ ๋ง๋ ๋๊น์ง ๊ณ์ ์คํ๋ฉ๋๋ค. 1๋ฒ์งธ ์ด์ ๋๋ฌธ์ ์ฝ๋ ๋ฐ์ดํธ ์์๊ฐ ๋ณ๊ฒฝ๋์ด ๋ฉ์ถ์ง ๋ชปํ๊ณ ๊ทธ๋๋ก ์งํํ๊ฒ ๋ฉ๋๋ค.
INT 2D๋ฅผ ์ด์ฉํ ์ํฐ ๋๋ฒ๊น ์ ์ฐํํ๊ธฐ ์ํด์๋ INT 2D๋ก ์ธํ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ๋ฑ๋ก๋์ด ์๋ SEH ์ฝ๋๋ก ์ด๋ํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ์ํด Trap Flag๋ฅผ ์ด์ฉํด์ SEH๋ก ์ด๋ํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. Single Step ๋ชจ๋๋ก ๋ช ๋ น์ด๊ฐ ์คํ๋๋ฉด EXCEPTION_SINGLE_STEP ์์ธ๊ฐ ๋ฐ์๋์ด SEH ์ฝ๋๋ก ์ด๋ํ๋๋ก ํ๋ ๊ฒ์ ๋๋ค.
๋จผ์ EXCEPTION_SINGLE_STEP ์์ธ๋ฅผ ๋ฌด์ํ๋๋ก ์ค์ ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ INT 2D ๋ช ๋ น ์คํ ์ง์ TF๋ฅผ 1๋ก ์ธํ ํฉ๋๋ค.
INT 2D ๋ช ๋ น์ด ์๋ kernel ๋ช ๋ น์ด์ด๊ธฐ ๋๋ฌธ์ user ๋ชจ๋ ๋๋ฒ๊ฑฐ์์๋ ์ ์์ ์ธ ๋ช ๋ น์ผ๋ก ์ธ์๋์ง ์์ ๋ฐ๋ก ์์ธ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค. ๊ทธ๋์ TF ๊ฐ๋ ๊ทธ๋๋ก์ ๋๋ค.
TF๊ฐ 0์ด์๋ค๋ฉด INT 2D์ ์ํด ๋ค์ 1๋ฐ์ดํธ๊ฐ ๋ฌด์๋์ด ์งํ๋๊ฒ ์ง๋ง, TF๊ฐ 1์ด๊ธฐ ๋๋ฌธ์ ๋ฌด์๋์ง ์๊ณ ์๋ ์ฝ๋๋๋ก ์งํ๋ฉ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ค์ ๋ช ๋ น์ธ NOP์ด Single Step ๋ชจ๋์ธ ์ํ๋ก ์คํ๋๊ณ , ์์ธ์ ์ํด SEH ์ฝ๋๋ก ๋์ด๊ฐ๋๋ค.
5. 0xCC ํ์ง
ํ๋ก๊ทธ๋จ์ ๋๋ฒ๊น ํ ๋ ์ค์นํ๋ Software Breakpoint๋ฅผ ์ด์ฉํ ์ํฐ ๋๋ฒ๊น ๊ธฐ๋ฒ์ด ์์ต๋๋ค.
Breakpoint์ instruction์ธ 0xCC๋ฅผ ํ์งํ์ฌ ๋๋ฒ๊น ์ฌ๋ถ๋ฅผ ํ๋ณํฉ๋๋ค.
5.1. API Break Point
ํ๋ก๊ทธ๋จ์ ๋๋ฒ๊น ํ ๋ ํน์ API์ Breakpoint๋ฅผ ์ค์น ๋ฐ ์คํํ์ฌ ๋ถ์ํ๋ ๋ฐฉ๋ฒ์ด ๋ง์ด ์ฌ์ฉ๋๊ณ ์์ต๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ API์ ์ค์น๋ BP๋ฅผ ํ์ธํด์ ํ์ฌ ๋๋ฒ๊น ์ ๋นํ๋์ง ํ๋ณํ๋ ์ํฐ ๋๋ฒ๊น ๊ธฐ๋ฒ์ด ์กด์ฌํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก API ์์ ๋ถ๋ถ์ BP๋ฅผ ์ค์นํ๋ฏ๋ก ์ฒซ ๋ฐ์ดํธ๊ฐ CC์ธ์ง ๊ฒ์ฌํด์ ๋๋ฒ๊น ์ฌ๋ถ๋ฅผ ํ๋จํฉ๋๋ค. ๋ฆฌ๋ฒ์๋ค์ด ๊ด์ฌ์ ๊ฐ์ง๋ API๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
API ๋ฆฌ์คํธ
[ํ๋ก์ธ์ค]
CreateProcess | CreateProcessAsUser | CreateRemoteThread |
CreateThread | GetThreadContext | SetThreadContext |
EnumProcesses | EnumProcessModules | OpenProcess |
CreateToolhelp32Snapshot | Process32First | Process32Next |
ShellExecuteA | WinExec | TerminateProcess |
[๋ฉ๋ชจ๋ฆฌ]
ReadProcessMemory | WriteProcessMemory | VirtualAlloc |
VirtualAlloEx | VirtualProtect | VirtualProtecEX |
VirtualQuery | VirtualQueryEx |
[ํ์ผ]
CreateFile | ReadFile | WriteFile |
CopyFile | CreateDirectory | DeleteFile |
MoveFile | MoveFileEx | FindFirstFile |
FindNextFile | GetFileSize | GetWindowsDirectory |
GetSystemDirectory | GetFileAttributes | SetFileAttributes |
SetFilePointer | CreateFileMapping | MapViewOfFile |
MapViewOfFileEx | UnmapViewOfFile | _open |
_write | _read | _lseek |
_tell |
[๋ ์ง์คํธ๋ฆฌ]
RegCreateKeyEx | RegDeleteKey | RegDeleteValue |
RegEnumKeyEx | RegQueryValueEx | RegSetValue |
RegSetValueEx |
[๋คํธ์ํฌ]
WSAStartup | socket | inet_addr |
closesocket | getservbyname | gethostbyname |
htons | connect | inet)htoa |
recv | send | HttpOpenRequest |
HttpSendRequest | HttpQueryInfo | InternetCloseHandle |
InternetConnect | InternetGetConnectedState | InternetOpen |
InternetOpenUrl | InternetReadFile | URLDownloadToFile |
[๊ธฐํ]
OpenProcessToken | LookupPrivilegeValue | AdjustTokenPrivileges |
OpenSCManager | CreateService | OpenService |
ControlService | DeleteService | RegisterServiceCtrlHandler |
SetServiceStatus | QueryServiceStatusEx | CreateMutex |
OpenMutex | FindWindow | LoadLibrary |
GetProcAddress | GetModuleFileNameA | GetCommandLine |
OutputDebugString | ... |
์ด๋ฌํ API์ ์์ ์ฒซ ๋ฐ์ดํธ์ BP๋ฅผ ์ค์นํ์ฌ ๋ถ์ํ๊ธฐ ๋๋ฌธ์ API์ ์์ ์ฃผ์๋ฅผ ๊ตฌํด์ ์ฒซ ๋ฐ์ดํธ๋ฅผ ๊ฒ์ฌํด๋ณด๋ฉด ๋๋ฒ๊น ์ฌ๋ถ๋ฅผ ํ๋จํฉ๋๋ค.
์ด๋ฅผ ์ฐํํ๊ธฐ ์ํด์๋ API ์์ ์ฃผ์๋ฅผ ํผํด์ BP๋ฅผ ์ค์นํ์ฌ ๋ถ์ํ๋ ๋ฐฉ๋ฒ์ผ๋ก ํํผํ ์ ์์ต๋๋ค. ๋๋ Hardware BP๋ฅผ ์ค์นํ์ฌ ๋ถ์ํ๋ ๋ฐฉ๋ฒ๋ ์์ต๋๋ค.
5.2. Checksum ๋น๊ต
Software Breakpoint๋ฅผ ํ์ธํ๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ํน์ ์ฝ๋ ์์ญ์ checksum ๊ฐ์ ๋น๊ตํ๋ ๊ฒ์ ๋๋ค. ํน์ ์ฝ๋ ์์ญ์ BP(0xCC)๋ฅผ ํ๋๋ผ๋ ์ค์นํ๋ค๋ฉด ์๋์ checksum ๊ฐ๊ณผ ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์ ๋๋ฒ๊น ์ฌ๋ถ๋ฅผ ํ๋จํ ์ ์์ต๋๋ค.
ํน์ ์์ญ์ ๋ฏธ๋ฆฌ ์ง์ ํฉ๋๋ค. 0x401000(ESI)๋ถํฐ 0x70๋งํผ์ ์์ญ์ ์ง์ ํ์ต๋๋ค.
์ง์ ๋ ์์ญ์ checksum์ ๊ตฌํ๋ ๋ฃจํ๋ฌธ
BP๋ฅผ ์ค์นํ๋ค๋ฉด ๋๋ฒ๊ฑฐ์์๋ ๋ณด์ด์ง ์์ง๋ง, instruction์ด ๋ฌ๋ผ์ก๊ธฐ ๋๋ฌธ์ checksum ๊ฐ์ด ๋ฌ๋ผ์ง๋๋ค.
๋ฏธ๋ฆฌ ๊ณ์ฐํด๋ checksum ๊ฐ์ธ 0xF5934986๊ณผ ๋ฃจํ๋ฌธ์ ํตํด ๊ณ์ฐ๋์ด EAX์ ์ ์ฅ๋ 0x7E0A498B ๊ฐ์ด ๋ค๋ฅด๋ฏ๋ก BP๋ฅผ ์ฌ์ฉํ ๋๋ฒ๊น ์คํ์ค์ด๋ผ๊ณ ํ๋จํฉ๋๋ค.
์ด๋ฐ ์ํฉ์ ์ฐํํ๋ ๋ฐฉ๋ฒ์๋ checksum ๊ฐ์ ๋น๊ตํ๋ ๊ตฌ๋ฌธ์ ํจ์นํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
๋น๊ต ๊ตฌ๋ฌธ(cmp) ๋ค์์ ๋ช ๋ น์ ๋ฌด์กฐ๊ฑด ๋ค๋ฅธ ์ฃผ์๋ก ์ ํํ๋๋ก ๋ฐ๊พธ์ด ์คฌ์ต๋๋ค. (jmp 40105D)
Ref) ๋ฆฌ๋ฒ์ฑ ํต์ฌ์๋ฆฌ, ์ด์น์
'Study > study' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Managed code / Unmanaged code / Native code ์ฐจ์ด (0) | 2025.02.27 |
---|---|
๋ฐ์ด๋๋ฆฌ์์ ์ํธํ๋ ๋ฌธ์์ด ์ถ์ถ(๋ณตํธํ)ํ๊ธฐ (1) | 2025.02.06 |
Static ์ํฐ ๋๋ฒ๊น (Anti Debugging) ๊ธฐ๋ฒ๊ณผ ์ฐํ (1) | 2024.11.29 |
ํค๋ก๊ฑฐ(Keylogger)(C++) ํ๋ก๊ทธ๋จ ๋ฆฌ๋ฒ์ฑ (1) | 2024.11.25 |
ํจ์ ์ค๋ฒ๋ก๋(overload) (1) | 2024.11.14 |