์ค๋ ๋ ํ์ด์ฌํน(Thread Hijacking) ๋์ ์๋ฆฌ ๋ถ์
Windows ์
์ฑ์ฝ๋ ๋ถ์ ์ ์์ฃผ ๊ด์ฐฐ๋๋ ๊ธฐ๋ฒ ์ค ํ๋๊ฐ Thread Hijacking ๊ธฐ๋ฐ ํ๋ก์ธ์ค ์ธ์ ์
์.
์ด๋ ๊ธฐ์กด์ ์ ์ง๋ ์ค๋ ๋๋ฅผ ์ผ์์ ์ผ๋ก ์ค๋จํ ๋ค, ๊ทธ ์ค๋ ๋ ์ปจํ
์คํธ๋ฅผ ์์ ํด ํน์ ํ์ด๋ก๋๋ฅผ ์คํ์ํค๋ ๊ตฌ์กฐ๋ก ๋์.
์ด๋ฒ ๋ถ์์ ใ๋ฆฌ๋ฒ์ฑ ํต์ฌ์๋ฆฌใ์ ํ๋ฆ์ ๋ฐ๋ผ ์คํ ํ๋ ์, ์ ์ด ํ๋ฆ, ๋ ์ง์คํฐ ์ปจํ
์คํธ ๋ณ์กฐ,
PE ๊ตฌ์กฐ ๊ธฐ๋ฐ ํ์ด๋ก๋ ์์น ์ฐ์ , ๋์ API ์กฐํ ๋ฑ์ ์ค์ฌ์ผ๋ก ๊ธฐ๋ก์์ผ๋ก ์ ๋ฆฌํจ.
๋ฆฌ๋ฒ์ฑ ๊ธฐ๋ก
1. ๊ฐ๋ ์ C ์คํ์ผ ๊ตฌ์กฐ(๋น์คํยท๊ณ ์ํ ์์ ์ ๊ฑฐ)
์๋ ์ฝ๋๋ ์ผ๋ฐ์ ์ธ Thread Hijacking์ โ๊ตฌ์กฐโ๋ฅผ ๊ด์ฐฐ ์ฉ๋๋ก๋ง ๋ฐ์ํ ์์.
// ๊ตฌ์กฐ ์์
typedef void* HTHREAD;
typedef struct _CTX { unsigned long regs[8]; } CTX;
void conceptual_thread_hijack(HTHREAD t, unsigned char* payloadBase) {
CTX ctx = {0};
// 1) ์ค๋ ๋ ์ ์ง
suspend_thread(t);
// 2) ์ปจํ
์คํธ ์กฐํ
get_thread_context(t, &ctx);
// 3) ๋ช
๋ น ํฌ์ธํฐ(EIP/RIP) ๋ณ๊ฒฝ
// ์ค์ ์ฃผ์ ๊ณ์ฐ์ ์๋ต๋ ๊ฐ๋
์ ํํ
ctx.regs[0] = (unsigned long)(payloadBase);
// 4) ์์ ๋ ์ปจํ
์คํธ ์ฃผ์
set_thread_context(t, &ctx);
// 5) ์ค๋ ๋ ์ฌ๊ฐ
resume_thread(t);
}
์ด ํจ์๋ ์ค์ ์คํ์ด ๋ถ๊ฐ๋ฅํ๋๋ก ์ค๊ณ๋์์ง๋ง,
์ค์ ๋ถ์ ์ โ๊ด์ฐฐ ํฌ์ธํธโ๊ฐ ๋๋ ํ๋ฆ์ ๊ทธ๋๋ก ๋ํ๋.
2. Assembly ๊ธฐ๋ฐ์ ๊ฐ๋ ์ ์ปจํ ์คํธ ๋ณ์กฐ ํ๋ฆ(๋น์คํ)
์๋ ์ฝ๋๋ ์ผ๋ถ ์ธ๋ถ์ฌํญ์ ์ ๊ฑฐ๋ ๊ตฌ์กฐ ์์.
PSEUDO_HIJACK:
push ebp
mov ebp, esp
; --- ์ค๋ ๋ ์ผ์ ์ ์ง ---
; (๊ตฌ์ฒด์ API ํธ์ถ ์๋ต)
; --- ์ปจํ
์คํธ ์กฐํ ---
; ์ปจํ
์คํธ ๊ตฌ์กฐ์ฒด๊ฐ EAX์ ์ ์ฅ๋๋ค๊ณ ๊ฐ์
mov eax, [ebp-0x20]
; --- ๋ช
๋ น ํฌ์ธํฐ ๋ณ๊ฒฝ ---
; ์๋ EIP๋ฅผ ์ฝ์ด์จ ๋ค ํ์ด๋ก๋ ๊ธฐ์ ์ผ๋ก ๊ฐ์ ํ ๊ฐ์ผ๋ก ์นํ
mov edx, [eax + CTX_EIP] ; ์๋ EIP
mov [eax + CTX_EIP], 0xDEADBEEF ; ๋๋ฏธ ์ฃผ์
; --- ์์ ๋ ์ปจํ
์คํธ ์ฐ๊ธฐ ---
; (๊ตฌ์ฒด์ API ํธ์ถ ์๋ต)
leave
ret
์ด ํ๋ฆ์์ ์ค์ํ ๊ฑด ๋ค์์ ๋๋ค:
- **์ปจํ
์คํธ(์ค๋ ๋ ๋ ์ง์คํฐ ์งํฉ)**๋ ๊ตฌ์กฐ์ฒด์ด๋ฉฐ
๋ด๋ถ ํ๋์ EIP/RIP, ESP/RSP, EFLAGS, general-purpose register๊ฐ ํฌํจ๋จ - ํ์ด๋ก๋ ์คํ์ ์ํด **๋ช ๋ น ํฌ์ธํฐ(RIP/EIP)**๊ฐ ์์ ๋จ
- ํด๋น ์ค๋ ๋๊ฐ ์ฌ๊ฐ๋๋ฉด ์๋ ์ฝ๋๊ฐ ์๋ ์๋ก์ด ์ฃผ์๋ก ํ๋ฆ์ด ์ด๋ํจ
- ์ด๋ ์ ์ด ํ๋ฆ ๊ต๋(Control Flow Subversion)์ ๋ํ ํจํด
3. ์ ์ด ํ๋ฆ ๊ด์ฐฐ ํฌ์ธํธ
Thread Hijacking ๋ถ์ ์ ํฌ๋ ์ยท๋ฆฌ๋ฒ์ฑ ๊ด์ ์์ ์ฃผ๋ก ํ์ธํ๋ ์ง์ ์ ๋ค์๊ณผ ๊ฐ์:
- SuspendThread / GetThreadContext / SetThreadContext / ResumeThread ํธ์ถ ํ์
- API ์ด๋ฆ์ด ๋๋ ํ๋์ด ์์ ์ ์์
- PE์ Import Table์ด ๋น์ด ์๊ณ , Export Directory ํ์ฑ์ผ๋ก ์ง์ API ์ฃผ์๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒฝ์ฐ ๋น๋ฒ
- ๋ ์ง์คํฐ ์ปจํ
์คํธ ๊ตฌ์กฐ ๋ณํ ์ฌ๋ถ
- EIP/RIP๊ฐ ๊ฐ์์ค๋ฝ๊ฒ ๋น์ ์ ์ฃผ์๋ก ์ด๋
- ์คํ ํ๋ ์์ด ์ ํ๋๋ฉฐ ESP/RSP๊ฐ ์์ฐ์ค๋ฝ์ง ์๊ฒ ๋ณ๊ฒฝ
- PE ํ์ด๋ก๋ ๊ตฌ์กฐยถ
- ํจํน๋ PE์
.text์ธ๋ถ์ ์กด์ฌํ๋ ์์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ - RWX ๋ณดํธ ์์ฑ์ ์ธ์ ๊ธฐ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์์ญ(mmap๋ ๊ตฌ๊ฐ ๋ฑ)
- ํจํน๋ PE์
- ์คํ ์ฌ๊ฐ ํ ํ๋ฆ
- ์ฌ๊ฐ ์งํ ๋์ค์ด์
๋ธ๋ฆฌ ํจํด์ด ์ ์ ํจ์ ํ๋กค๋ก๊ทธ๊ฐ ์๋
NOP,JMP, ๋จ์ MOV ์ํ์ค ๋ฑ์ผ๋ก ์์ํ๋์ง ๊ด์ฐฐ
- ์ฌ๊ฐ ์งํ ๋์ค์ด์
๋ธ๋ฆฌ ํจํด์ด ์ ์ ํจ์ ํ๋กค๋ก๊ทธ๊ฐ ์๋
4. ๋์ API ํด๊ฒฐ(PEB ๊ธฐ๋ฐ) ๊ฐ๋ ํ๋ฆ
์ค์ ์
์ฑ์ฝ๋๋ ๋ณดํต Import Table์ ์ ๊ฑฐํ๊ณ PEB ๊ธฐ๋ฐ์ผ๋ก API๋ฅผ ์ง์ ํ์ฑ.
์๋๋ ์ฑ
์ ํํผ๋ฅผ ์ํด ๊ฐ๋
์ ํํ๋ง ์ ์ํ ์์.
// ๋น์คํ ์์
void* resolve_api_conceptually(const char* dllName, const char* funcName) {
// 1) PEB โ LDR ์ ๊ทผ
// 2) InMemoryOrderModuleList ์ํ
// 3) dllName ๋น๊ต
// 4) Export Directory ํ์ฑ
// 5) funcName ํด์ ๋๋ ๋ณตํธํ ํ ๋น๊ต
// 6) ์ฃผ์ ๋ฐํ
return 0;
}
ํฌ์ธํธ:
- ํด์ ๊ธฐ๋ฐ ๋ฌธ์์ด ๋น๊ต
- Export Directory์ AddressOfNames / AddressOfFunctions ์ฌ์ฉ
- ์ ์ฑ์ฝ๋ ํฌ๋ ์์์๋ ์ด ๋ถ๋ถ์์ ์ํธํ ๋ฃจํด์ด ๊ฐ์ฅ ์์ฃผ ๊ด์ฐฐ๋จ
5. ๋ถ์์๊ฐ ํ์ธํด์ผ ํ Windows Internals ํฌ์ธํธ
โ TEB / PEB ๊ตฌ์กฐ
- PEB์์ LDR ์์น
- BeingDebugged flag
- ImageBaseAddress ๊ด์ฐฐ
โ ์ค๋ ๋ ์ปจํ ์คํธ ๊ตฌ์กฐ
- CONTEXT.Eip / Rip
- SegGs ๊ธฐ๋ฐ ์ ๊ทผ(TLS ๋ฑ)
- ์คํ ๊ธฐ๋ฐ ์ฃผ์ ์ ํ ์ฌ๋ถ ํ์ธ
โ ๋ฉ๋ชจ๋ฆฌ ๋งต
- RWX ์น์ ์ถ์
- Unbacked ๋ฉ๋ชจ๋ฆฌ(ํ์ผ ๋งคํ๋์ง ์์ ๊ณต๊ฐ)
โ ํจ์ปค ํ์
- OEP ๋ณต์ ์ stub
- API name ์ํธํ
- ํธ์ถ ๊ท์ฝ ๊ต๋(calling convention confusion)
6. ์กฐ์ฌ ์์ฝ
| ํญ๋ชฉ | ๋ถ์ ํฌ์ธํธ |
|---|---|
| ์ ์ด ํ๋ฆ ๋ถ์ | EIP/RIP ๋ณ์กฐ, OEP ์ ํ, JMP ํจํด |
| ์คํ ํ๋ ์ | Thread Context ๋ณ๊ฒฝ ์ ยทํ ๋น๊ต |
| PE ๊ตฌ์กฐ | Import Table ๋น์ด ์์, Export ์ฌํ์ฑ |
| ๋์ค์ด์ ๋ธ๋ฆฌ ํจํด | ๋น์ ์ ํ๋กค๋ก๊ทธ, ์ธ์์ MOV/JMP |
| ์ํธํ ๋ฃจํด | ํด์ยทXOR ๊ธฐ๋ฐ ์คํธ๋ง ๋ณตํธํ ํ์ |
| API ํํน | Thread Hijack ๋ค CreateRemoteThread์ ๊ตฌ๋ณ ํ์ |
โจ ๋ง๋ฌด๋ฆฌ ํ ์ค
Thread Hijacking์ ํ๋ก์ธ์ค ์ธ์ ์
๊ธฐ๋ฒ ์ค์์๋ ์ ์ด ํ๋ฆ ๊ต๋์ ํต์ฌ ํจํด์ ๊ฐ์ฅ ์ ๋๋ฌ๋ด๋ฉฐ,
์ค๋ ๋ ์ปจํ
์คํธ์ PEB ๊ธฐ๋ฐ ๋์ API ํด์ ํ๋ฆ์ ์ํธ์์ฉ์ ๋ฆฌ๋ฒ์ค ์์ง๋์ด๋ง์์ ๋ฐ๋์ ์ง์ด์ผ ํ ๋ถ์ ์ถ์
๋๋ค.
๐ Written by Code & Compass