0Pricing
Ethical Hacking Academy · 강의

메모리와 스택

오버플로 작동 원리

메모리와 스택은(는) CoddyKit의 무료 Ethical Hacking Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Ethical Hacking Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Ethical Hacking Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

프로세스 메모리 구조

프로그램이 실행되면 운영 체제는 프로그램에 서로 구분되는 영역으로 구성된 메모리 구조를 할당합니다. 여기에는 텍스트(코드), 데이터/BSS(전역 변수), 힙(동적 할당), 스택이 있습니다.

버퍼 오버플로는 대부분 스택을 악용하므로 스택을 이해하는 것이 필수적입니다.

스택이란 무엇인가요

스택은 함수 호출에 사용되는 메모리 영역입니다. 지역 변수, 함수 인자, 반환 주소를 저장합니다.

x86에서 스택은 아래쪽으로 자랍니다. 데이터를 푸시하면 스택 포인터가 더 낮은 주소를 향해 이동합니다. 오버플로가 발생할 때 이 방향이 중요합니다.

스택 프레임

함수가 호출될 때마다 스택 프레임이 생성됩니다. 프레임에는 일반적으로 지역 변수, 저장된 베이스 포인터(EBP), 반환 주소(저장된 EIP)가 포함됩니다.

반환 주소는 함수가 끝난 후 CPU가 어디에서 실행을 계속할지 알려 줍니다. 반환 주소를 제어하는 것이 스택 오버플로 익스플로잇의 핵심입니다.

주요 레지스터

32비트 x86에서 중요한 레지스터는 다음과 같습니다.

  • ESP: 스택 포인터, 스택의 최상단
  • EBP: 베이스 포인터, 현재 프레임의 기준점
  • EIP: 명령어 포인터, 다음 명령어의 주소

EIP를 제어할 수 있다면 실행 흐름을 제어할 수 있습니다.

버퍼란 무엇인가요

버퍼는 고정 크기의 메모리 블록이며, 지역 문자 배열이 그 예입니다. 프로그램은 데이터가 버퍼 안에 들어갈 것으로 예상합니다.

프로그램이 길이를 확인하지 않고 버퍼가 담을 수 있는 양보다 많은 데이터를 복사하면, 초과한 데이터가 인접한 메모리로 넘쳐흐릅니다.

char buffer[64];
strcpy(buffer, user_input); // no bounds check

오버플로

버퍼 오버플로는 입력이 버퍼의 크기를 초과하여 스택에서 인접한 데이터를 덮어쓸 때 발생합니다.

저장된 EBP와 반환 주소는 지역 버퍼 바로 뒤에 있으므로, 충분히 큰 입력은 반환 주소를 덮어써 제어 흐름을 탈취할 수 있습니다.

위험한 함수

오버플로는 대개 길이를 확인하지 않는 안전하지 않은 C 함수에서 발생합니다.

  • strcpy, strcat, sprintf, gets.

strncpy나 snprintf 같은 더 안전한 대안은 크기 제한을 사용하지만, 오래된 코드에는 위험한 함수가 가득합니다.

gets(buffer); // never use: no length limit at all

EIP를 덮어쓰면 얻는 것

취약한 함수가 반환할 때 CPU는 (이제 공격자가 제어하는) 반환 주소를 꺼내 EIP에 넣고 해당 주소로 이동합니다.

EIP가 직접 주입한 기계어 코드인 셸코드를 가리키도록 하면 CPU는 프로그램의 권한으로 이를 실행합니다.

리틀 엔디언 주소 지정

x86은 리틀 엔디언 방식입니다. 여러 바이트로 이루어진 값은 최하위 바이트부터 저장됩니다. 반환 주소를 0x080414C3으로 덮어쓰려면 바이트를 역순으로 작성해야 합니다.

엔디언 방식을 잘못 처리하는 것은 초보자가 흔히 하는 실수이며, 이 경우 익스플로잇이 아무런 오류 없이 실패할 수 있습니다.

address 0x080414C3 -> bytes \xc3\x14\x04\x08

최신 보호 기능

최신 시스템은 익스플로잇을 더 어렵게 만드는 방어 기능을 추가합니다.

  • DEP/NX: 스택을 실행 불가능한 영역으로 표시합니다.
  • ASLR: 메모리 주소를 무작위화합니다.
  • 스택 카나리: 반환하기 전에 덮어쓰기를 감지합니다.

이 과정에서는 기본 원리를 가르치기 위해 고전적인 사례(보호 기능이 꺼진 상태)에 집중합니다.

이것이 여전히 중요한 이유

최신 방어 기능으로 고전적인 스택 오버플로를 악용하기는 더 어려워졌지만, 기본 원리는 여전히 필수적입니다. 임베디드 시스템, 사물 인터넷, 오래된 소프트웨어에는 이러한 보호 기능이 전혀 없는 경우가 많습니다.

기본 사례를 완전히 익히는 것은 최신 완화 기능을 우회하는 ROP 같은 고급 기법을 배우기 위한 전제 조건이기도 합니다.

빠른 확인

공격자가 최종적으로 제어하려는 값이 무엇인지 떠올려 보세요.

복습

이제 기초를 이해하셨습니다.

  • 스택에는 지역 변수, 저장된 EBP, 반환 주소가 저장되며 아래쪽으로 확장됩니다.
  • ESP, EBP, EIP는 x86의 핵심 레지스터입니다. EIP를 제어하면 실행을 제어할 수 있습니다.
  • strcpy와 gets 같은 안전하지 않은 함수는 오버플로를 일으킵니다.
  • x86은 리틀 엔디언 방식이며, 최신 방어 기능에는 DEP, ASLR, 카나리가 있습니다.

다음에는 프로그램을 퍼징하여 충돌 오프셋을 찾습니다.

자주 묻는 질문

“메모리와 스택” 강의는 무료인가요?

네 — “메모리와 스택” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Ethical Hacking Academy 강의 전체를 잠금 해제할 수 있습니다. Ethical Hacking Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“메모리와 스택”에서 뭘 배우나요?

오버플로 작동 원리 브라우저에서 직접 실행하는 실습 코드로 Ethical Hacking Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Ethical Hacking Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Ethical Hacking Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“메모리와 스택” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Ethical Hacking Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Ethical Hacking Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 메모리와 스택
  2. 충돌을 찾는 퍼징
  3. EIP 제어하기
  4. 셸코드와 익스플로잇
← Ethical Hacking Academy(으)로 돌아가기