본문 바로가기
정보보안기사 도전

힙 오버플로우(Heap Overflow) 공격에 대한 설명으로 틀린 것은?

by all-but 2025. 4. 10.
반응형

보기:

  1. 프로그래머가 malloc()과 같은 함수를 이용한다.
  2. 힙 영역을 오버플로우시켜 특정 코드를 실행하여 공격한다.
  3. 버스를 통해 전달되는 중요 정보를 엿보고 가로채는 공격이다.
  4. 프로그램이 실행되면서 메모리를 동적으로 할당하는 영역을 이용한다.

 

 

 

 

 

 

✅ 정답: 3번


🔍 해설

🔸 Heap Overflow란?

  • 동적으로 할당된 메모리 공간(Heap)에 버퍼 오버플로우를 일으켜
    인접한 메모리 영역을 덮어쓰고, 프로그램의 동작을 조작하는 공격입니다.

주로 malloc(), calloc() 같은 함수로 런타임 중에 할당된 메모리를 다루다가 발생합니다.


🔎 각 보기 해설

✅ 1번: malloc()과 같은 함수를 이용한다.

✔️ 맞는 설명입니다.
→ 힙 메모리는 malloc(), calloc(), realloc() 등의 함수로 동적으로 할당되며,
이 영역에서 버퍼 크기를 초과해 데이터를 쓰면 힙 오버플로우가 발생할 수 있습니다.


✅ 2번: 힙 영역을 오버플로우시켜 특정 코드를 실행한다.

✔️ 맞는 설명입니다.
→ 공격자는 오버플로우를 통해 함수 포인터나 메타데이터를 조작
자신이 원하는 악성 코드를 실행시킬 수 있습니다.


❌ 3번: 버스를 통해 전달되는 중요 정보를 엿보고 가로채는 공격이다.

틀린 설명입니다.
→ 이건 스니핑(Sniffing)이나 패킷 가로채기(Interception)에 해당하는 설명입니다.
→ 힙 오버플로우는 메모리 내부 조작과 관련된 공격이지,
통신 데이터를 가로채는 행위와는 관련이 없습니다.


✅ 4번: 프로그램이 실행되면서 메모리를 동적으로 할당하는 영역을 이용한다.

✔️ 맞는 설명입니다.
→ 힙 메모리는 **프로그램 실행 중(runtime)**에 필요한 만큼 메모리를 동적으로 할당하는 공간입니다.


🧠 핵심 요약

보기 내용 정오

malloc()로 동적 메모리 할당 ✅ 맞음
힙 영역 오버플로우 후 코드 실행 ✅ 맞음
버스 통한 정보 가로채기 ❌ 틀림 (Heap과 무관)
실행 중 메모리를 동적으로 할당 ✅ 맞음

 

 

 

 

 


🎭 힙 오버플로우 공격, 생활 속 상황극으로 이해하기


🏠 비유: “호텔 체크인 시스템 해킹하기”

등장인물:

  • 💼 고객 A: 정상 사용자
  • 🕶️ 해커 B: 악성 사용자
  • 📋 접수대: 프로그램의 힙 메모리
  • 📃 체크인 카드: 구조체(고객 정보 저장 공간)
  • 🛎️ 함수 포인터: 고객 호출 시 행동을 정의한 룰

📖 시나리오

✅ 정상 상황

  1. 고객 A가 체크인할 때, 시스템은 힙에 이런 식으로 메모리를 할당합니다.

struct Customer {
  char name[20];
  void (*welcomeFunc)(void);
};

  • 이름과 환영 메시지 함수를 저장하는 구조체죠.
  • welcomeFunc()는 고객에게 “환영합니다”를 출력해줍니다.
  1. 고객 A: “이름은 Alice입니다”
    → name에 "Alice"가 저장되고, welcomeFunc은 printWelcome()을 가리킵니다.

🧨 공격 상황: 해커 B의 힙 오버플로우

  1. 해커 B가 체크인하면서 이상하게 긴 이름을 넣습니다:
  2. 이름: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\x90\x90...<쉘코드>
  3. 이 데이터는 name[20]을 초과해서 입력되므로,
    옆에 있는 welcomeFunc 포인터 값까지 덮어써 버립니다!
  4. 이제 welcomeFunc()를 호출하면? → 원래는 printWelcome()이 나와야 하는데...
    해커가 입력한 쉘코드가 실행됨!! 😱

💣 결과

💥 “환영합니다” 대신 시스템 쉘이 열리고 루트 권한 획득!
🎉 호텔은 뚫렸고 해커는 내부 시스템에 침입!


🧠 핵심 요약 (진짜 코드로!)

// 원래 구조체
struct Customer {
    char name[20];
    void (*welcomeFunc)(void);
};

// 공격자 입력
strcpy(customer.name, "AAAAAAAAAAAAAAAAAAAAAAAABBBB<쉘코드>");

// 결과
customer.welcomeFunc(); // → 해커의 쉘코드 실행!

🎮 현실에서의 힙 오버플로우 사용 사례

  • 예전 웹 브라우저, 멀티미디어 재생기에서 버그 악용
  • C/C++ 기반 서버 애플리케이션에서 입력 검증 미흡 시 발생
  • CTF(Capture The Flag) 대회에서도 자주 출제됨!

 

 

 

 

 


🛠️ 1. 힙 오버플로우 공격이란?

  • 힙 영역은 런타임 중 malloc(), new 등을 통해 동적으로 할당된 메모리입니다.
  • 힙 오버플로우란 이 메모리에 데이터를 쓸 때, 할당된 범위를 초과하여 인접한 메모리를 덮어쓰는 공격입니다.
  • 특히, 구조체 안의 함수 포인터, vtable 포인터, 혹은 힙 메타데이터를 조작하여 임의 코드 실행을 유도합니다.

🔓 2. 공격 준비 단계

🔍 ① 취약한 프로그램 분석

  • 대상 바이너리를 IDA, Ghidra, gdb 등의 도구로 역공학합니다.
  • malloc, free를 사용하는 부분과 사용자 입력이 들어가는 흐름을 확인합니다.
  • 힙 할당 구조를 파악하고, 인접 구조체나 포인터를 찾아냅니다.

📜 예시 코드 (취약한 프로그램)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
    char *name;
    void (*func)(void);
} User;

void greet() {
    printf("Hello, user!\n");
}

int main() {
    User *user1 = malloc(sizeof(User));
    user1->name = malloc(32);
    user1->func = greet;

    char input[64];
    printf("Enter your name: ");
    gets(input);  // 취약점: 입력 길이 제한 없음

    strcpy(user1->name, input);  // 버퍼 오버플로우 발생 가능

    user1->func();  // 함수 포인터 실행

    free(user1->name);
    free(user1);
    return 0;
}

🧨 3. 실제 공격 시나리오

💣 목표:

  • user1->func를 덮어써서, 쉘코드 또는 ROP를 실행하도록 조작

🔗 단계별 진행

① 힙 배치 조작 (Heap Feng Shui)

  • malloc/free 순서를 조정하여 특정 메모리 배치를 유도합니다.
  • 예를 들어, name 다음에 함수 포인터가 오도록 정렬.

② 오버플로우 입력 생성

  • 오버플로우 구간까지 정확한 오프셋 계산 (ex. 36바이트 → func 포인터 위치)
  • 덮어쓸 주소: 쉘코드 주소, system("/bin/sh"), 혹은 ROP 가젯 주소

③ 익스플로잇 수행

  • gdb, pwndbg, gef 등으로 동작을 관찰하며 페이로드 조정
  • 적절한 입력값을 넣고, func() 호출 시 악성 코드 실행되도록 유도

🧠 예시 페이로드 (간단화된 형태)

python3 -c 'print("A"*36 + "\x90\x90\x90\x90" + "\xef\xbe\xad\xde")' | ./vuln
  • "A"*36: name 버퍼 채우기
  • \xef\xbe\xad\xde: 덮어쓸 함수 포인터 주소 (ex. 쉘코드 위치 또는 ROP 주소)
  • \x90\x90...: NOP sled

최신 시스템에서는 NX, ASLR, PIE, Stack Canary 등이 적용되어 있어 이 방식만으로는 우회가 어렵습니다.
따라서 ROP(Return-Oriented Programming) 또는 tcache poisoning 등의 기법과 결합해 사용합니다.


🧪 4. 실전 예시: CTF 스타일 문제

  • picoCTF, HackTheBox, ROPemporium 등에서 종종 등장합니다.
  • 힙 오버플로우를 통해 __free_hook, __malloc_hook, vtable 등을 조작해 system("/bin/sh") 실행하는 문제

🔐 5. 방어 기법

  • 힙 메타데이터 보호 (Safe Linking, Heap Integrity Check)
  • ASLR: 메모리 주소 무작위화
  • RELRO: GOT 덮어쓰기 방지
  • FORTIFY_SOURCE: 위험 함수 보강
  • 사용자 입력 검증 강화

📌 정리

단계 설명

1. 분석 취약한 입력과 힙 구조 파악
2. 배치 힙 메모리 배치를 조정
3. 페이로드 작성 오버플로우로 포인터 덮어쓰기
4. 트리거 함수 호출 등으로 악성 주소 실행

 

반응형