Study/study

Dynamic ์•ˆํ‹ฐ ๋””๋ฒ„๊น…(Anti Debugging) ๊ธฐ๋ฒ•๊ณผ ์šฐํšŒ

์œค์ •_ 2024. 12. 17. 17:00

์˜ค๋Š˜์€ 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 ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

์šฐํšŒ๋œ BP ์˜ˆ์™ธ

 

 

 

 

 

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๋ถ€ํ„ฐ ์‹คํ–‰๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

 

์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์ฝ”๋“œ ์ดํ›„ ์‹คํ–‰๋˜๋Š” 0x401056
๋””๋ฒ„๊น… ํƒ์ง€ ์šฐํšŒ

 

 

 

 

 

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 ์ฝ”๋“œ๋กœ ์ง„ํ–‰๋์„ํ…Œ์ง€๋งŒ ๋””๋ฒ„๊ฑฐ๋กœ ์‹คํ–‰ํ•˜์—ฌ ๋น„์ •์ƒ ์ข…๋ฃŒ๋˜๋Š” ์ฝ”๋“œ๋กœ ์ง„ํ–‰ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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 ํ˜ธ์ถœ ์ „

 

INT 2D(CD 2D) ๋ช…๋ น์„ ์‹คํ–‰ํ•œ ํ›„์˜ ๋‹ค์Œ ๋ช…๋ น์€ 1๋ฐ”์ดํŠธ E8์ด ๋ฌด์‹œ๋œ EB 5D 0000๋กœ ๋ณ€๊ฒฝ๋˜์–ด ๋‹ค๋ฅธ ๋ช…๋ น์œผ๋กœ ์ธ์‹๋˜์–ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

INT 2D ํ˜ธ์ถœ ํ›„

 

์ด๋ ‡๊ฒŒ ์ฝ”๋“œ ๋ฐ”์ดํŠธ ์ˆœ์„œ๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ์›๋ž˜์˜ ๋ช…๋ น๊ณผ ๋‹ค๋ฅธ ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์ฝ”๋“œ ๋‚œ๋…ํ™”(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

 

TF๊ฐ€ 0์ด์—ˆ๋‹ค๋ฉด INT 2D์— ์˜ํ•ด ๋‹ค์Œ 1๋ฐ”์ดํŠธ๊ฐ€ ๋ฌด์‹œ๋˜์–ด ์ง„ํ–‰๋˜๊ฒ ์ง€๋งŒ, TF๊ฐ€ 1์ด๊ธฐ ๋–„๋ฌธ์— ๋ฌด์‹œ๋˜์ง€ ์•Š๊ณ  ์›๋ž˜ ์ฝ”๋“œ๋Œ€๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ ๋ช…๋ น์ธ NOP์ด Single Step ๋ชจ๋“œ์ธ ์ƒํƒœ๋กœ ์‹คํ–‰๋˜๊ณ , ์˜ˆ์™ธ์— ์˜ํ•ด SEH ์ฝ”๋“œ๋กœ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค.

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)

 

์šฐํšŒ๋œ checksum ํƒ์ง€ ๊ธฐ๋ฒ•

 

 

 

Ref) ๋ฆฌ๋ฒ„์‹ฑ ํ•ต์‹ฌ์›๋ฆฌ, ์ด์Šน์›