Study/System

RWX메모리를 만드는 mprotect(), mmap()

imaginefuture-1 2025. 2. 22. 14:47

 

📌 RWX 메모리 생성이란?

RWX 메모리 생성이란, 메모리에서 읽기(Read), 쓰기(Write), 실행(Execute) 모두 가능한 영역을 만드는 것을 의미해.
➡️ 프로그램이 실행 중일 때, 코드(명령어)와 데이터를 저장하는 공간이 필요한데,
RWX 메모리를 사용하면 새로운 코드를 작성한 후 즉시 실행할 수 있어.


🔹 RWX 메모리 생성의 일상 예시

✅ 1️⃣ 프로그램이 스스로 새로운 기능을 추가하는 경우

📌 게임 업데이트 시스템

  • 🎮 예시: 오버워치 같은 게임이 실행 중에 새로운 패치를 다운로드한 후, 즉시 적용(실행)
  • 💻 컴퓨터 동작: 새로운 패치 파일을 메모리에 쓰기(Write) → 그리고 즉시 실행(Execute)
  • ✅ 해결 방법: 게임 업데이트는 RWX 메모리를 생성해서 새 기능을 실행할 수도 있음.

✅ 2️⃣ 자바스크립트 엔진 (JIT, Just-In-Time 컴파일)

📌 웹 브라우저의 성능 최적화

  • 🌐 예시: 크롬 브라우저에서 자바스크립트를 실행할 때, 자주 실행되는 코드를 컴파일하여 속도를 높임.
  • 💻 컴퓨터 동작:
    1. 브라우저가 코드를 읽음. (Read)
    2. 코드를 최적화하여 메모리에 저장. (Write)
    3. 최적화된 코드를 즉시 실행. (Execute)
  • ✅ 해결 방법: 크롬 브라우저의 자바스크립트 엔진도 RWX 메모리를 생성하여 실행 속도를 높일 수 있음.

✅ 3️⃣ 해킹 공격 (Exploit)

📌 쉘코드 실행

  • 🔥 예시: 해커가 프로그램의 BOF(버퍼 오버플로우) 취약점을 이용하여, 악성 코드를 삽입하고 실행.
  • 💻 컴퓨터 동작:
    1. 공격자가 쉘코드를 메모리에 쓰기(Write)
    2. 그 쉘코드를 즉시 실행(Execute)
  • 🚨 보안 문제: 대부분의 보안 시스템에서는 RWX 메모리를 차단하여 공격을 막으려 함.

📌 RWX 메모리를 만드는 mprotect()와 mmap()

RWX 메모리는 운영체제(OS)가 기본적으로 허용하지 않음.
하지만, 프로세스가 특정한 API(mprotect() 또는 mmap())를 호출하면 RWX 메모리를 생성할 수 있어.


🔹 mmap() - 새로운 RWX 메모리 영역을 만드는 함수

📌 💡 mmap()을 쉽게 이해하기 위한 일상 예시

  • 🗂️ 윈도우에서 "메모장"을 열어 새로운 파일을 만드는 것과 비슷함
  • mmap()은 프로그램이 실행 중에 새로운 메모리 공간을 할당할 때 사용됨.
void *mem = mmap(NULL, 4096, PROT_READ | PROT_WRITE | PROT_EXEC, 
                 MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);

💻 설명:

  • mmap(NULL, 4096, PROT_READ | PROT_WRITE | PROT_EXEC, ...)
    • 4096 바이트(RWX) 메모리를 생성함.
    • RWX 권한을 가지므로, 여기에 데이터를 쓰고 바로 실행 가능.

💡 일상 예시

  1. 새로운 노트를 만들고 (mmap()으로 메모리 할당)
  2. 연필로 글씨를 씀 (Write)
  3. 선생님이 그걸 읽고 발표함 (Execute)

🚨 보안 문제

  • 악성 프로그램이 mmap()을 이용하면 메모리에 직접 쉘코드를 적고 실행할 수 있음.

🔹 mprotect() - 기존 메모리의 속성을 변경하는 함수

📌 💡 mprotect()를 쉽게 이해하기 위한 일상 예시

  • 🏡 아파트에서 방의 용도를 변경하는 것과 비슷함
    • 예전에는 창고(읽기/쓰기)였던 방을, 새롭게 **주방(읽기/쓰기/실행 가능)**으로 바꾸는 것.
mprotect(addr, 4096, PROT_READ | PROT_WRITE | PROT_EXEC);

💻 설명:

  • mprotect()는 기존 메모리 영역을 RWX로 변경하는 함수.
  • 특정 메모리 주소를 읽기(R), 쓰기(W), 실행(X) 가능하도록 설정.

💡 일상 예시

  1. 원래 "도서관"이었던 공간이 (읽기 전용)
  2. 사람들에게 "여기서 회의해도 됩니다!" 라고 알림 (RWX 변경)
  3. 이제 사람들이 회의도 하고 토론도 가능 (코드를 실행할 수 있게 됨)

🚨 보안 문제

  • mprotect()를 통해 기존의 메모리를 RWX로 변경하면, 쉘코드를 실행할 수 있음.
  • 따라서 많은 보안 시스템에서는 mprotect() 호출을 차단하거나 제한함.

📌 결론

📢 RWX 메모리는 읽기, 쓰기, 실행이 모두 가능한 위험한 메모리 영역
📢 JIT 컴파일러(크롬 브라우저), 게임 패치 시스템 같은 정당한 사용 사례도 있지만, 해커들이 악용할 가능성이 높음.
📢 mmap()은 새로운 RWX 메모리를 만들고, mprotect()는 기존 메모리의 속성을 변경함.
📢 Exploit을 시도할 때 mprotect()와 mmap()이 사용 가능한지 확인하면 RWX 메모리를 생성할 수 있음! 🚀

'Study > System' 카테고리의 다른 글

GOT(Global Offset Table)  (0) 2025.02.18
보호 기법(Exploit Mitigation)  (0) 2025.02.18
BOF (버퍼 오버플로우, Buffer Overflow)  (0) 2025.02.18
OOB(Out of Bounds)  (0) 2025.02.18