반응형
보기:
- 프로그래머가 malloc()과 같은 함수를 이용한다.
- 힙 영역을 오버플로우시켜 특정 코드를 실행하여 공격한다.
- 버스를 통해 전달되는 중요 정보를 엿보고 가로채는 공격이다.
- 프로그램이 실행되면서 메모리를 동적으로 할당하는 영역을 이용한다.
✅ 정답: 3번
🔍 해설
🔸 Heap Overflow란?
- 동적으로 할당된 메모리 공간(Heap)에 버퍼 오버플로우를 일으켜
인접한 메모리 영역을 덮어쓰고, 프로그램의 동작을 조작하는 공격입니다.
주로 malloc(), calloc() 같은 함수로 런타임 중에 할당된 메모리를 다루다가 발생합니다.
🔎 각 보기 해설
✅ 1번: malloc()과 같은 함수를 이용한다.
✔️ 맞는 설명입니다.
→ 힙 메모리는 malloc(), calloc(), realloc() 등의 함수로 동적으로 할당되며,
이 영역에서 버퍼 크기를 초과해 데이터를 쓰면 힙 오버플로우가 발생할 수 있습니다.
✅ 2번: 힙 영역을 오버플로우시켜 특정 코드를 실행한다.
✔️ 맞는 설명입니다.
→ 공격자는 오버플로우를 통해 함수 포인터나 메타데이터를 조작해
자신이 원하는 악성 코드를 실행시킬 수 있습니다.
❌ 3번: 버스를 통해 전달되는 중요 정보를 엿보고 가로채는 공격이다.
❌ 틀린 설명입니다.
→ 이건 스니핑(Sniffing)이나 패킷 가로채기(Interception)에 해당하는 설명입니다.
→ 힙 오버플로우는 메모리 내부 조작과 관련된 공격이지,
통신 데이터를 가로채는 행위와는 관련이 없습니다.
✅ 4번: 프로그램이 실행되면서 메모리를 동적으로 할당하는 영역을 이용한다.
✔️ 맞는 설명입니다.
→ 힙 메모리는 **프로그램 실행 중(runtime)**에 필요한 만큼 메모리를 동적으로 할당하는 공간입니다.
🧠 핵심 요약
보기 내용 정오
① | malloc()로 동적 메모리 할당 | ✅ 맞음 |
② | 힙 영역 오버플로우 후 코드 실행 | ✅ 맞음 |
③ | 버스 통한 정보 가로채기 | ❌ 틀림 (Heap과 무관) |
④ | 실행 중 메모리를 동적으로 할당 | ✅ 맞음 |
🎭 힙 오버플로우 공격, 생활 속 상황극으로 이해하기
🏠 비유: “호텔 체크인 시스템 해킹하기”
등장인물:
- 💼 고객 A: 정상 사용자
- 🕶️ 해커 B: 악성 사용자
- 📋 접수대: 프로그램의 힙 메모리
- 📃 체크인 카드: 구조체(고객 정보 저장 공간)
- 🛎️ 함수 포인터: 고객 호출 시 행동을 정의한 룰
📖 시나리오
✅ 정상 상황
- 고객 A가 체크인할 때, 시스템은 힙에 이런 식으로 메모리를 할당합니다.
struct Customer {
char name[20];
void (*welcomeFunc)(void);
};
- 이름과 환영 메시지 함수를 저장하는 구조체죠.
- welcomeFunc()는 고객에게 “환영합니다”를 출력해줍니다.
- 고객 A: “이름은 Alice입니다”
→ name에 "Alice"가 저장되고, welcomeFunc은 printWelcome()을 가리킵니다.
🧨 공격 상황: 해커 B의 힙 오버플로우
- 해커 B가 체크인하면서 이상하게 긴 이름을 넣습니다:
- 이름: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\x90\x90...<쉘코드>
- 이 데이터는 name[20]을 초과해서 입력되므로,
옆에 있는 welcomeFunc 포인터 값까지 덮어써 버립니다! - 이제 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. 트리거 | 함수 호출 등으로 악성 주소 실행 |
반응형