이것은 사용자가 2024-10-30 23:56에 https://maldevacademy.com/modules/6?all_modules=1을(를) 위해 저장한 이중 언어 스냅샷 페이지로, 몰입형 번역에 의해 제공된 이중 언어 지원이 있습니다. 저장하는 방법을 알아보세요?
Module 6 - Windows Memory Management
모듈 6 - Windows 메모리 관리
Progress Toggle
Screen Width
Objectives
Terminal

Windows Memory Management
Windows 메모리 관리

Introduction 소개

This module goes through the fundamentals of Windows memory. Understanding how Windows handles memory is crucial to building advanced malware.
이 모듈에서는 Windows 메모리의 기본 사항을 살펴봅니다. Windows가 메모리를 처리하는 방식을 이해하는 것은 고급 악성 코드를 구축하는 데 중요합니다.

Virtual Memory & Paging 가상 메모리 및 페이징

Memory in modern operating systems is not mapped directly to physical memory (i.e the RAM). Instead, virtual memory addresses are used by processes that are mapped to physical memory addresses.
최신 운영 체제의 메모리는 물리적 메모리(예: RAM)에 직접 매핑되지 않습니다. 대신, 가상 메모리 주소는 실제 메모리 주소에 매핑된 프로세스에서 사용됩니다.

There are several reasons for this but ultimately the goal is to save as much physical memory as possible. Virtual memory may be mapped to physical memory but can also be stored on disk.
여기에는 여러 가지 이유가 있지만 궁극적인 목표는 가능한 한 많은 물리적 메모리를 절약하는 것입니다. 가상 메모리는 실제 메모리에 매핑될 수 있지만 디스크에 저장될 수도 있습니다.

With virtual memory addressing it becomes possible for multiple processes to share the same physical address while having a unique virtual memory address. Virtual memory relies on the concept of Memory paging which divides memory into chunks of 4kb called "pages".
가상 메모리 주소 지정을 사용하면 여러 프로세스가 고유한 가상 메모리 주소를 가지면서 동일한 물리적 주소를 공유하는 것이 가능해집니다. 가상 메모리는 메모리를 "페이지"라고 하는 4kb 덩어리로 나누는 메모리 페이징 개념에 의존합니다.

See the image below from the Windows Internals 7th edition - part 1 book.
Windows Internals 7판 - 1부 책에서 아래 이미지를 참조하세요.

Virtual-Mem

Page State 페이지 상태

The pages residing within a process's virtual address space can be in one of 3 states:
프로세스의 가상 주소 공간 내에 있는 페이지는 다음 세 가지 상태 중 하나일 수 있습니다.

  1. Free - The page is neither committed nor reserved. The page is not accessible to the process. It is available to be reserved, committed, or simultaneously reserved and committed. Attempting to read from or write to a free page can result in an access violation exception.
    무료 - 페이지가 커밋되거나 예약되지 않았습니다. 해당 페이지는 프로세스에 접근할 수 없습니다. 예약, 커밋 또는 예약과 커밋을 동시에 수행할 수 있습니다. 사용 가능한 페이지에서 읽거나 쓰려고 하면 액세스 위반 예외가 발생할 수 있습니다.

  2. Reserved - The page has been reserved for future use. The range of addresses cannot be used by other allocation functions. The page is not accessible and has no physical storage associated with it. It is available to be committed.
    예약됨 - 페이지가 향후 사용을 위해 예약되었습니다. 주소 범위는 다른 할당 기능에서 사용할 수 없습니다. 페이지에 액세스할 수 없으며 페이지와 연결된 물리적 저장소가 없습니다. 커밋 가능합니다.

  3. Committed - Memory charges have been allocated from the overall size of RAM and paging files on disk. The page is accessible and access is controlled by one of the memory protection constants.
    커밋됨 - RAM의 전체 크기와 디스크의 페이징 파일에서 메모리 요금이 할당되었습니다. 페이지에 액세스할 수 있으며 액세스는 메모리 보호 상수 중 하나에 의해 제어됩니다.

    The system initializes and loads each committed page into physical memory only during the first attempt to read or write to that page. When the process terminates, the system releases the storage for committed pages.
    시스템은 해당 페이지를 읽거나 쓰려고 처음 시도하는 동안에만 커밋된 각 페이지를 물리적 메모리에 초기화하고 로드합니다. 프로세스가 종료되면 시스템은 커밋된 페이지에 대한 저장소를 해제합니다.

Page Protection Options 페이지 보호 옵션

Once the pages are committed, they need to have their protection option set. The list of memory protection constants can be found here but some examples are listed below.
페이지가 커밋되면 보호 옵션을 설정해야 합니다. 메모리 보호 상수 목록은 여기에서 찾을 수 있지만 아래에는 몇 가지 예가 나열되어 있습니다.

  • PAGE_NOACCESS - Disables all access to the committed region of pages. An attempt to read from, write to or execute the committed region will result in an access violation.
    PAGE_NOACCESS - 커밋된 페이지 영역에 대한 모든 액세스를 비활성화합니다. 커밋된 영역에서 읽기, 쓰기 또는 실행을 시도하면 액세스 위반이 발생합니다.

  • PAGE_EXECUTE_READWRITE - Enables Read, Write and Execute. This is highly discouraged from being used and is generally an IoC because it's uncommon for memory to be both writable and executable at the same time.
    PAGE_EXECUTE_READWRITE - 읽기, 쓰기 및 실행을 활성화합니다. 이는 사용을 권장하지 않으며 메모리가 동시에 쓰기 가능하고 실행 가능한 경우가 드물기 때문에 일반적으로 IoC입니다.

  • PAGE_READONLY - Enables read-only access to the committed region of pages. An attempt to write to the committed region results in an access violation.
    PAGE_READONLY - 커밋된 페이지 영역에 대한 읽기 전용 액세스를 활성화합니다. 커밋된 영역에 쓰려고 하면 액세스 위반이 발생합니다.

Memory Protection 메모리 보호

Modern operating systems generally have built-in memory protections to thwart exploits and attacks. These are also important to keep in mind as they will likely be encountered when building or debugging the malware.
최신 운영 체제에는 일반적으로 악용 및 공격을 방지하기 위한 메모리 보호 기능이 내장되어 있습니다. 맬웨어를 구축하거나 디버깅할 때 발생할 가능성이 높으므로 이러한 사항도 염두에 두는 것이 중요합니다.

  • Data Execution Prevention (DEP) - DEP is a system-level memory protection feature that is built into the operating system starting with Windows XP and Windows Server 2003. If the page protection option is set to PAGE_READONLY, then DEP will prevent code from executing in that memory region.
    DEP(데이터 실행 방지) - DEP는 Windows XP 및 Windows Server 2003부터 운영 체제에 내장된 시스템 수준 메모리 보호 기능입니다. 페이지 보호 옵션이 PAGE_READONLY로 설정된 경우 DEP는 코드가 다음에서 실행되는 것을 방지합니다. 그 기억 영역.

  • Address space layout randomization (ASLR) - ASLR is a memory protection technique used to prevent the exploitation of memory corruption vulnerabilities.
    ASLR(주소 공간 레이아웃 무작위화) - ASLR은 메모리 손상 취약점 악용을 방지하는 데 사용되는 메모리 보호 기술입니다.

    ASLR randomly arranges the address space positions of key data areas of a process, including the base of the executable and the positions of the stack, heap and libraries.
    ASLR은 실행 파일의 기본과 스택, 힙 및 라이브러리의 위치를 ​​포함하여 프로세스의 주요 데이터 영역의 주소 공간 위치를 무작위로 정렬합니다.

x86 vs x64 Memory Space
x86 대 x64 메모리 공간

When working with Windows processes, it's important to note whether the process is x86 or x64. x86 processes have a smaller memory space of 4GB (0xFFFFFFFF) whereas x64 has a vastly larger memory space of 128TB (0xFFFFFFFFFFFFFFFF).
Windows 프로세스로 작업할 때 프로세스가 x86인지 x64인지 확인하는 것이 중요합니다. x86 프로세스의 메모리 공간은 4GB( 0xFFFFFFFF )로 더 작은 반면, x64의 메모리 공간은 128TB( 0xFFFFFFFFFFFFFFFF )로 훨씬 더 큽니다.

Allocating Memory Example
메모리 할당 예시

This example goes through small code snippets to better understand how one can interact with Windows memory via C functions and Windows APIs. The first step in interacting with memory is allocating memory.
이 예에서는 C 함수 및 Windows API를 통해 Windows 메모리와 상호 작용하는 방법을 더 잘 이해하기 위해 작은 코드 조각을 살펴봅니다. 메모리와 상호작용하는 첫 번째 단계는 메모리 할당입니다.

The snippet below demonstrates several ways to allocate memory which is essentially reserving a memory inside the running process.
아래 코드 조각은 기본적으로 실행 중인 프로세스 내에서 메모리를 예약하는 메모리 할당 방법을 보여줍니다.

// Allocating a memory buffer of *100* bytes

// Method 1 - Using malloc()
PVOID pAddress = malloc(100);

// Method 2 - Using HeapAlloc()
PVOID pAddress = HeapAlloc(GetProcessHeap(), 0, 100);

// Method 3 - Using LocalAlloc()
PVOID pAddress = LocalAlloc(LPTR, 100);

Memory allocation functions return the base address which is simply a pointer to the beginning of the memory block that was allocated. Using the snippets above, pAddress will be the base address of the memory block that was allocated. Using this pointer several actions can be taken such as reading, writing, and executing. The type of actions that can be performed will depend on the protection assigned to the allocated memory region.
메모리 할당 함수는 단순히 할당된 메모리 블록의 시작 부분에 대한 포인터인 기본 주소를 반환합니다. 위의 코드를 사용하면 pAddress 할당된 메모리 블록의 기본 주소가 됩니다. 이 포인터를 사용하여 읽기, 쓰기, 실행과 같은 여러 작업을 수행할 수 있습니다. 수행할 수 있는 작업 유형은 할당된 메모리 영역에 할당된 보호에 따라 달라집니다.

The image below shows what pAddress looks like under the debugger.
아래 이미지는 디버거에서 pAddress 어떻게 보이는지 보여줍니다.

image

When memory is allocated, it may either be empty or contain random data. Some memory allocation functions provide an option to zero out the memory region during the allocation process.
메모리가 할당되면 비어 있거나 임의의 데이터가 포함될 수 있습니다. 일부 메모리 할당 함수는 할당 프로세스 중에 메모리 영역을 0으로 만드는 옵션을 제공합니다.

image

Writing To Memory Example
메모리에 쓰기 예제

The next step after memory allocation is generally writing to that buffer. Several options can be used to write to memory but for this example, memcpy is used.
메모리 할당 후 다음 단계는 일반적으로 해당 버퍼에 쓰는 것입니다. 여러 옵션을 사용하여 메모리에 쓸 수 있지만 이 예에서는 memcpy 사용되었습니다.

PVOID pAddress	= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 100);

CHAR* cString	= "MalDev Academy Is The Best";

memcpy(pAddress, cString, strlen(cString));

HeapAlloc uses the HEAP_ZERO_MEMORY flag which causes the allocated memory to be initialized to zero. The string is then copied to the allocated memory using memcpy. The last parameter in memcpy is the number of bytes to be copied. Next, recheck the buffer to verify that the data was successfully written.
HeapAlloc 할당된 메모리를 0으로 초기화하는 HEAP_ZERO_MEMORY 플래그를 사용합니다. 그런 다음 문자열은 memcpy 사용하여 할당된 메모리에 복사됩니다. memcpy 의 마지막 매개변수는 복사할 바이트 수입니다. 그런 다음 버퍼를 다시 확인하여 데이터가 성공적으로 기록되었는지 확인합니다.

image

Freeing Allocated Memory 할당된 메모리 해제

When the application is done using an allocated buffer, it is highly recommended to deallocate or free the buffer to avoid memory leaks.
할당된 버퍼를 사용하여 애플리케이션이 완료되면 메모리 누수를 방지하기 위해 버퍼 할당을 해제하거나 해제하는 것이 좋습니다.

Depending on what function was used to allocate memory, it will have a corresponding memory deallocation function. For example:
메모리를 할당하는 데 사용된 함수에 따라 해당 메모리 할당 해제 함수가 있습니다. 예를 들어:

  • Allocating with malloc requires the use of the free function.
    malloc 으로 할당하려면 free 함수를 사용해야 합니다.

  • Allocating with HeapAlloc requires the use of the HeapFree function.
    HeapAlloc 사용하여 할당하려면 HeapFree 함수를 사용해야 합니다.

  • Allocating with LocalAlloc requires the use of the LocalFree function.
    LocalAlloc 사용하여 할당하려면 LocalFree 기능을 사용해야 합니다.

The images below show HeapFree in action, freeing allocated memory at address 0000023ADE449900. Notice the address 0000023ADE449900 still exists within the process but its original content was overwritten with random data. This new data is most likely due to a new allocation performed by the OS inside the process.
아래 이미지는 주소 0000023ADE449900 에서 할당된 메모리를 해제하는 HeapFree 작동 모습을 보여줍니다. 주소 0000023ADE449900 프로세스 내에 여전히 존재하지만 원래 내용은 임의의 데이터로 덮어쓰여졌습니다. 이 새로운 데이터는 프로세스 내부에서 OS가 수행한 새로운 할당으로 인해 발생했을 가능성이 높습니다.

IMAGE

IMAGE