맨위로가기

스택

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

스택은 컴퓨터 과학에서 사용되는 자료 구조로, 앨런 튜링에 의해 처음 소개되었다. 스택은 '푸시'와 '팝' 연산을 통해 데이터를 저장하고 관리하며, 후입선출(LIFO) 원칙을 따른다. 배열이나 연결 리스트를 사용하여 구현할 수 있으며, 하드웨어와 소프트웨어 모두에서 활용된다. 하드웨어 스택은 메모리 할당 및 접근에 사용되며, 소프트웨어 스택은 프로그래밍 언어에서 함수 호출, 수식 평가, 백트래킹, 알고리즘 구현 등 다양한 용도로 사용된다. 스택은 보안 취약점의 대상이 될 수 있으며, 스택 스매싱과 같은 공격에 주의해야 한다.

더 읽어볼만한 페이지

  • 추상 자료형 - 리스트 (컴퓨팅)
    리스트는 컴퓨터 과학에서 항목들을 순서대로 저장하고 관리하는 기본적인 자료 구조이며, 다양한 연산을 지원하고 연결 리스트나 동적 배열 등으로 구현되며 큐, 스택 등 다른 자료형의 기반이 된다.
  • 추상 자료형 - 그래프 (자료 구조)
    그래프는 정점과 간선으로 구성되어 정점 간의 관계를 표현하는 비선형 자료 구조로, 방향, 무방향, 가중치 그래프 등 다양한 형태로 존재하며, 인접 리스트, 인접 행렬 등으로 표현되고, DFS, BFS, 다익스트라, 플로이드-워셜 알고리즘 등을 통해 탐색 및 문제 해결에 활용된다.
  • 자료 구조 - 라우팅 테이블
    라우팅 테이블은 네트워크에서 데이터 전송 시 최적 경로를 결정하는 핵심 데이터베이스로, 라우터가 목적지 IP 주소를 기반으로 다음 홉을 결정하며 직접 연결 및 원격 네트워크 경로 정보를 저장하고 동적 라우팅 또는 수동 설정으로 관리된다.
  • 자료 구조 - 문자열
    문자열은 사람이 읽을 수 있는 텍스트를 저장하고 정보를 전달하거나 받는 데 사용되는 순서가 있는 문자들의 시퀀스로, 다양한 형태의 데이터를 표현하며 유한한 길이를 가지고, 프로그래밍 언어에서 기본 또는 복합 자료형으로 제공되고, 문자 집합과 인코딩 방식에 따라 표현 방식이 달라진다.
스택
개요
자료 구조 유형추상적 자료형
시간 복잡도접근: O(n)
탐색: O(n)
삽입: O(1)
삭제: O(1)
정의
설명스택은 컴퓨터 과학에서 사용되는 추상적 자료형으로, 제한적으로 접근할 수 있는 정렬된 요소의 모음임.
스택에서는 요소의 추가 및 제거가 스택의 맨 위에서만 가능함.
스택은 후입선출 (LIFO) 또는 선입후출 (FILO) 방식으로 동작함.
기본 연산
push (밀어넣기)스택의 맨 위에 요소를 추가함.
pop (꺼내기)스택의 맨 위에서 요소를 제거함.
peek 또는 top (엿보기 또는 꼭대기)스택의 맨 위 요소를 제거하지 않고 반환함.
isEmpty (비어 있음)스택이 비어 있는지 확인함.
스택의 구현
설명스택은 배열이나 연결 리스트를 사용하여 구현할 수 있음.
배열 기반 스택은 크기가 고정되어 있지만, 연결 리스트 기반 스택은 크기가 동적으로 변할 수 있음.
활용 분야
함수 호출 스택프로그램에서 함수 호출 시 복귀 주소와 지역 변수를 저장하는 데 사용됨.
연산자 우선순위 파싱수식의 연산자 우선순위를 처리하는 데 사용됨.
재귀 알고리즘재귀 호출을 관리하는 데 사용됨.
웹 브라우저의 방문 기록사용자가 방문한 페이지를 저장하는 데 사용됨.
실행 취소 (Undo) 기능편집기나 소프트웨어에서 사용자의 작업을 되돌리는 데 사용됨.
예시
설명웹 브라우저에서 "뒤로" 버튼을 클릭하면, 스택에서 이전 페이지가 꺼내져 표시됨.
텍스트 편집기에서 "실행 취소"를 클릭하면, 스택에서 마지막 작업이 꺼내져 취소됨.
장점
설명구현이 간단함.
빠른 삽입 및 삭제 연산 (O(1)).
단점
설명스택의 크기가 제한될 수 있음 (배열 기반 구현).
스택 중간에 있는 요소에 접근하기 어려움 (O(n)).

2. 역사

앨런 튜링은 1946년에 "묻기"와 "풀기"라는 용어를 사용하여 서브루틴을 호출하고 반환하는 수단으로 스택을 컴퓨터 과학 문헌에 처음 등장시켰다. 콘라트 추제의 Z4에서는 이미 1945년에 서브루틴과 2단계 스택 머신이 구현되었다.

1955년 뮌헨 공과대학교의 클라우스 자멜슨과 프리드리히 L. 바우어는 Operationskeller|운영 지하실de라는 스택의 아이디어를 제안하고 1957년에 특허를 출원했다. 1988년 3월, 자멜슨이 사망한 후 바우어는 스택 원리 발명으로 IEEE 컴퓨터 개척자상을 받았다. 찰스 레너드 햄블린은 1954년 전반기에, 빌헬름 켬머러는 1958년에 automatisches Gedächtnis|자동 메모리de라는 유사한 개념을 독립 발견하였다.

3. 스택의 기본 연산

스택은 추상 자료형으로서, 주로 다음 두 가지 기본 연산을 가진다.


  • '''push(푸시)''': 데이터를 스택의 맨 위(top)에 추가한다.
  • '''pop(팝)''': 스택의 맨 위 데이터를 제거하고 반환한다.


이는 식당에서 접시를 쌓는 모습과 유사하다. 새 접시(push)는 맨 위에, 맨 위 접시(pop)만 사용할 수 있다. 이러한 방식은 후입선출(LIFO) 원칙을 따르며, 스택의 맨 위를 제외한 내용은 숨겨진다.

3. 1. 추가 연산

많은 스택 구현은 필수적인 "push(푸시)" 및 "pop(팝)" 연산 외에 다른 연산들을 지원한다. "top of stack(스택 탑)" 또는 "peek(피크)" 연산은 스택의 최상위 요소를 제거하지 않고 관찰하는 연산으로, 필수적이지는 않다. 이는 "pop(팝)" 연산을 수행하고, 동일한 데이터를 스택에 다시 "push(푸시)"하는 것으로 구현할 수 있기 때문이다. 스택이 비어 있을 때 "stack top(스택 탑)" 또는 "pop(팝)" 연산을 실행하면 언더플로우(underflow)가 발생한다. 많은 구현에서 스택이 비어 있는지 확인하는 기능과 스택의 크기를 반환하는 연산도 제공한다.

스택의 크기(길이), 꼭대기가 아닌 n번째 원소를 참조·조작하거나 교체하는 연산 등도 구현될 수 있다. 이러한 연산은 연결 리스트에서는 ''O''(''n'')이지만, 배열을 이용한 구현에서는 ''O''(''1'')인 경우도 있고, 그 반대의 경우도 있는 등 다양하다.

4. 스택의 구현

스택은 배열 또는 연결 리스트를 통해 쉽게 구현할 수 있다.[1] 자료 구조를 스택으로 식별하는 것은 구현이 아니라 인터페이스인데, 사용자는 배열 또는 연결 리스트에 항목을 넣거나(push) 빼는(pop) 것만 허용되며, 그 외 몇 가지 도우미 연산만 가능하다.

스택은 *n*개의 요소를 가질 때 O(*n*)의 메모리 용량을 필요로 하며, 이는 스택의 길이에 비례한다. 각 연산이 일정한 시간 O(1)에 완료되는 구현은 배열이나 연결 리스트를 사용하여 쉽게 구현할 수 있다.[1]

추상 자료형으로서의 스택은 노드(어떠한 데이터를 가지며, 다른 노드를 가리킬 수 있는 구조)의 컨테이너(데이터를 모아 저장하는 추상 자료형의 총칭)이며, '''푸시''' ('''push''') 와 '''팝''' ('''pop''')의 2개의 기본 연산을 가진다. Push는 지정된 노드를 스택의 선두(톱)에 추가하고, 기존 노드는 그 아래에 그대로 둔다. Pop은 스택의 현재 톱 노드를 제거하고 그것을 반환한다.

스택의 작동 방식은 식당에서 스프링이 달린 받침대에 접시를 쌓는 것에 비유할 수 있다. 새로운 접시(Push)는 스택 맨 위에 놓이고, 접시를 꺼낼 때(Pop)는 맨 위의 접시부터 꺼내게 된다. 이러한 방식은 후입선출(LIFO: Last In First Out)의 원칙을 따르며, 스택의 내용은 맨 위(톱)만 볼 수 있도록 숨겨져 있다.

4. 1. 배열을 이용한 구현

배열을 사용하면 구현이 간단하고 속도가 빠르지만, 스택의 크기가 고정될 수 있다는 단점이 있다. 하지만 동적 배열을 사용하면 필요에 따라 스택의 크기를 조절할 수 있으므로 이러한 문제를 해결할 수 있다.

프로그램은 스택의 크기(길이)를 추적하는 변수 'top'을 사용하여, 다음에 삽입할 배열의 위치를 가리킨다. (0 기반 인덱스 규칙 가정) 따라서 스택은 다음 세 가지 요소 구조로 효과적으로 구현할 수 있다.

'''구조''' 스택:

  • maxsize : 정수
  • top : 정수
  • items : 항목 배열


'''절차''' 초기화(stk : 스택, 크기 : 정수):

  • stk.items ← 처음에 비어 있는 ''size'' 항목의 새 배열
  • stk.maxsize ← 크기
  • stk.top ← 0


''push'' 연산은 오버플로를 확인한 후 요소를 추가하고 ''top'' 인덱스를 증가시킨다.

'''절차''' 푸시(stk : 스택, x : 항목):

  • '''만약''' stk.top = stk.maxsize:
  • * 오버플로 오류 보고
  • '''그렇지 않으면''':
  • * stk.items[stk.top] ← x
  • * stk.top ← stk.top + 1


''pop'' 연산은 언더플로를 확인한 후 ''top'' 인덱스를 감소시키고 이전에 맨 위였던 항목을 반환한다.

'''절차''' 팝(stk : 스택):

  • '''만약''' stk.top = 0:
  • * 언더플로 오류 보고
  • '''그렇지 않으면''':
  • * stk.top ← stk.top − 1
  • * r ← stk.items[stk.top]
  • * '''반환''' r


동적 배열을 사용하면 필요에 따라 늘리거나 줄일 수 있는 스택을 구현할 수 있다. 스택의 크기는 동적 배열의 크기일 뿐이며, 동적 배열의 끝에 항목을 추가하거나 제거하는 데 분할 상환 O(1) 시간이 필요하므로 스택의 매우 효율적인 구현이다.

''n''개의 요소를 가진 스택이 필요로 하는 메모리 용량은 ''O''(''n'')이며, 이는 스택 길이에 비례한다. 각 연산이 일정한 시간 ''O''(''1'')에 완료되는 구현은 배열이나 연결 리스트를 사용하여 쉽게 실현할 수 있다.

4. 2. 연결 리스트를 이용한 구현

연결 리스트를 사용하여 스택을 구현할 수 있다. 스택은 목록의 "머리"를 가리키는 포인터로 표현되며, 목록의 크기를 추적하는 카운터를 추가할 수 있다.

구조내용
프레임자료 : 항목
스택머리 : 프레임 또는 닐



'''절차''' 초기화(stk : 스택):

: stk.머리 ← 닐

: stk.크기 ← 0

항목을 넣고(push) 빼는(pop) 작업은 목록의 머리에서 이루어진다. 이 구현에서는 메모리가 소진되지 않는 한 오버플로(overflow)가 발생하지 않는다.

'''절차''' 넣기(stk : 스택, x : 항목):

: 새로운머리 ← 새로운 프레임

: 새로운머리.자료 ← x

: 새로운머리.다음 ← stk.머리

: stk.머리 ← 새로운머리

: stk.크기 ← stk.크기 + 1

'''절차''' 빼기(stk : 스택):

: '''만약''' stk.머리 = 닐:

:: 언더플로우 오류 보고

: r ← stk.머리.자료

: stk.머리 ← stk.머리.다음

: stk.크기 ← stk.크기 - 1

: '''반환''' r

''n''개의 요소를 가진 스택이 필요로 하는 메모리 용량은 ''O''(''n'')이며, 이는 스택 길이에 비례한다. 각 연산(넣기, 빼기)이 일정한 시간 ''O''(''1'')에 완료되는 구현은 배열이나 연결 리스트를 사용하여 쉽게 실현할 수 있다.[1]

5. 하드웨어 스택

하드웨어 수준에서 스택은 주로 메모리 할당 및 접근을 위한 수단으로 사용된다. 일반적인 스택은 고정된 시작점과 가변 크기를 가진 메모리 영역이며, 스택 포인터 레지스터가 스택의 맨 위를 가리킨다.[1] CPU 설계에서 x86, Z80, 6502 등은 전용 레지스터를 스택 포인터로 사용한다. PDP-11, 68000과 같은 일부 프로세서는 특수 주소 지정 모드를 통해 스택을 구현한다. RISC CPU는 일반적으로 전용 스택 명령이 없으며, 레지스터를 스택 포인터로 활용한다.

스택 머신은 산술 및 논리 연산을 위해 하드웨어 스택을 사용한다. 예를 들어 Burroughs 대형 시스템, HP 3000 등이 있다.

6. 소프트웨어 스택

소프트웨어 스택은 운영체제, 프로그래밍 언어, 가상 머신 등 다양한 곳에서 활용된다.

프로그래밍 언어에서 스택의 활용은 하위 섹션에서 자세히 다루며, 스택 기반 메모리 할당에 대한 내용은 아래와 같다.

일반적인 콜 스택은 여러 단계의 프로시저 호출에 대한 로컬 데이터와 호출 정보를 저장한다. 이 스택은 시작 지점으로부터 아래로 확장된다. 스택 포인터는 스택에서 현재 가장 위에 있는 데이터를 가리킨다. 푸시 연산은 포인터를 감소시키고 데이터를 스택에 복사한다. 팝 연산은 스택에서 데이터를 복사한 다음 포인터를 증가시킨다. 프로그램에서 호출된 각 프로시저는 프로시저 반환 정보(노란색)와 로컬 데이터(다른 색상)를 스택에 푸시하여 저장한다. 이러한 유형의 스택 구현은 매우 일반적이지만 버퍼 오버플로우 공격에 취약하다.


일부 프로그래밍 언어는 스택을 사용하여 프로시저에 로컬인 데이터를 저장한다. 로컬 데이터 항목에 대한 공간은 프로시저가 입력될 때 스택에서 할당되고 프로시저가 종료될 때 할당 해제된다. C 프로그래밍 언어는 일반적으로 이러한 방식으로 구현된다. 데이터와 프로시저 호출에 동일한 스택을 사용하면 프로그래머가 프로그램에 심각한 보안 버그를 도입하지 않기 위해 인식해야 하는 중요한 보안적 의미가 있다. 호출 스택 내에서 함수 호출마다 만들어지는 프레임을 스택 프레임이라고 하며, 이를 따라가면서(추적하여) 얻을 수 있는 호출 정보를 '''스택 트레이스'''라고 한다.

6. 1. 프로그래밍 언어에서의 스택

Perl, LISP, JavaScript 및 Python과 같은 일부 언어는 표준 리스트/배열 유형에서 스택 연산(push, pop)을 사용할 수 있도록 지원한다. 특히 Forth 계열(PostScript 포함)의 언어는 언어 정의 스택을 기반으로 설계되어 프로그래머가 직접 보고 조작할 수 있다.[1]

C++ 표준 라이브러리는 `push_back` 및 `pop_back` 연산을 제공하며, `stack` 템플릿 클래스는 기존 컨테이너를 조정하여 push/pop 연산만 있는 제한된 API를 제공한다. Java 라이브러리에는 Vector의 특수화인 Stack 클래스가 있다.[1]

고수준 언어에서는 스택을 배열이나 선형 리스트를 사용하여 효율적으로 구현할 수 있다. LISP에서는 스택을 구현할 필요가 없는데, 임의의 리스트에 대해 'push'와 'pop'에 해당하는 함수(cons가 push, cdr이 pop)를 사용할 수 있기 때문이다.[1]

몇몇 프로그래밍 언어는 스택 지향적이다. 스택 지향 언어는 기본 연산에서 스택으로부터 인수를 가져오고, 결과를 스택에 반환하도록 설계된 언어이다. 대개 여러 개의 스택을 사용하도록 설계되어 있으며, 전형적인 Forth는 인수 전달을 위한 스택과 서브루틴의 반환 주소를 위한 스택을 가지고 있다. 포스트스크립트는 반환 스택과 오퍼랜드 스택을 가지며, 그래픽스 상태 스택과 사전 스택도 가지고 있다. 일본어 프로그래밍 언어의 Mind도 Forth 기반이다.[1]

6. 2. 스택 기반 메모리 할당



일부 프로그래밍 언어는 스택을 사용하여 프로시저에 로컬인 데이터를 저장한다. 로컬 데이터 항목에 대한 공간은 프로시저가 입력될 때 스택에서 할당되고 프로시저가 종료될 때 할당 해제된다. C 프로그래밍 언어는 일반적으로 이러한 방식으로 구현된다. 데이터와 프로시저 호출에 동일한 스택을 사용하면 프로그래머가 프로그램에 심각한 보안 버그를 도입하지 않기 위해 인식해야 하는 중요한 보안적 의미가 있다.

호출 스택 내에서 함수 호출마다 만들어지는 프레임을 스택 프레임이라고 하며, 이를 따라가면서(추적하여) 얻을 수 있는 호출 정보를 '''스택 트레이스'''라고 한다.

7. 스택의 응용

스택은 다양한 알고리즘 및 소프트웨어 개발에 활용된다.

역 폴란드 표기법 계산기나 컴파일러의 구문 분석 과정에서 스택이 사용된다.[1] 백트래킹 알고리즘(예: 깊이 우선 탐색)에서 이전 상태로 돌아갈 때도 스택이 쓰인다.

그레이엄 스캔, SMAWK 알고리즘, 모든 가장 가까운 작은 값 문제, 가장 가까운 이웃 체인 알고리즘 등 여러 효율적인 알고리즘에서도 스택은 중요한 역할을 한다.

7. 1. 수식 평가 및 구문 분석

역 폴란드 표기법 계산기는 스택을 사용하여 값을 저장하고 연산을 수행한다.[1] 수식은 전위 표기법, 중위 표기법, 후위 표기법으로 표현될 수 있으며, 스택을 사용하여 한 표기법에서 다른 표기법으로 변환할 수 있다. 많은 컴파일러는 저수준 코드로 변환하기 전에 구문 분석을 위해 스택을 사용한다. 대부분의 프로그래밍 언어는 문맥 자유 언어이므로 스택 기반 머신으로 구문 분석이 가능하다.[1]

예를 들어, 중위 표기법 ((1 + 2) * 4) + 3 은 교환 법칙과 괄호 우선 규칙을 통해 다음과 같이 후위 표기법(역 폴란드 표기법)으로 변환할 수 있다.

: 1 2 + 4 * 3 +

이 식은 피연산자 스택을 사용하여 왼쪽에서 오른쪽으로 평가할 수 있다. 연산자를 만나면 피연산자 스택에서 두 개의 피연산자를 꺼내(pop) 연산을 수행하고, 그 결과를 다시 스택에 넣는다(push).

수식 평가 과정
입력작업피연산자 스택
1피연산자 Push1
2피연산자 Push1, 2
+덧셈3
4피연산자 Push3, 4
*곱셈12
3피연산자 Push12, 3
+덧셈15



최종 연산 결과는 15이며, 연산 종료 시 피연산자 스택의 맨 위에 위치한다.

7. 2. 백트래킹

스택은 백트래킹에 응용된다. 미로에서 올바른 경로를 찾을 때, 잘못된 경로를 따라갔을 경우 해당 경로의 시작점으로 돌아가야 한다. 이때 스택을 사용하여 마지막으로 올바른 지점을 스택에 푸시하고, 잘못된 경로의 경우 스택에서 팝하여 이전 상태로 복귀할 수 있다.

깊이 우선 탐색은 백트래킹 알고리즘의 대표적인 예시이다. 깊이 우선 탐색은 지정된 시작 정점으로부터 도달할 수 있는 그래프의 모든 정점을 찾는다. 백트래킹은 최적화 문제에 대한 잠재적 솔루션을 나타내는 공간을 검색하는 데에도 활용된다. 분기 한정법은 이러한 공간에서 모든 잠재적 솔루션을 완전하게 검색하지 않고 백트래킹 검색을 수행하는 기술이다.

탐색 문제를 해결할 때, 전수 조사, 백트래킹과 같은 무차별 대입 방식이나 분기 한정법, 휴리스틱과 같은 최적화된 방식 모두 스택을 필요로 하는 경우가 많다. 알고리즘에서 발견했지만 탐색하지 않은 탐색 노드를 기억하는 데 스택이 사용된다. 스택 외에 재귀를 사용할 수도 있지만, 이는 컴파일러가 생성하는 코드가 내부적으로 스택을 사용하는 것으로 대체될 뿐이다. 스택을 사용한 탐색은 트리 구조의 깊이 우선 탐색, 크로스워드 퍼즐 자동 풀이 프로그램, 컴퓨터 체스 게임 등에서 폭넓게 사용된다.

7. 3. 효율적인 알고리즘

그레이엄 스캔은 2차원 점 시스템의 볼록 껍질을 구하는 알고리즘으로, 입력의 부분 집합의 볼록 껍질을 스택에 유지하며, 새로운 점이 껍질에 추가될 때 경계의 오목점을 찾고 제거하는 데 사용된다. SMAWK 알고리즘의 일부는 단조 행렬의 행 최소값을 찾는 데 사용되며, 그레이엄 스캔과 유사한 방식으로 스택을 사용한다.

모든 가장 가까운 작은 값 문제는 배열의 각 숫자에 대해 자신보다 작으면서 가장 가까운 앞에 오는 숫자를 찾는 문제이다. 이 문제에 대한 한 알고리즘은 가장 가까운 작은 값에 대한 후보 컬렉션을 유지하기 위해 스택을 사용한다. 배열의 각 위치에 대해 스택은 스택 맨 위에 더 작은 값이 발견될 때까지 팝되고, 새 위치의 값이 스택에 푸시된다.

가장 가까운 이웃 체인 알고리즘은 각 클러스터가 스택에서 이전 클러스터의 가장 가까운 이웃인 클러스터 스택을 유지하는 것을 기반으로 하는 응집적 계층적 클러스터링 방법이다. 이 방법은 서로 가장 가까운 이웃인 클러스터 쌍을 찾으면, 해당 클러스터를 팝하고 병합한다.

8. 스택과 보안

보안 침해 및 공격에 스택이 사용되어 취약해질 수 있다. 이러한 환경에서 작업하는 프로그래머는 이러한 함정을 피하기 위해 특별한 주의를 기울여야 한다.[1]

일부 프로그래밍 언어는 호출된 프로시저에 로컬 데이터와 프로시저가 호출자에게 반환할 수 있도록 하는 연결 정보를 모두 저장하기 위해 공통 스택을 사용한다. 이는 프로그램이 프로시저 호출에 대한 중요한 반환 주소를 포함하는 동일한 스택 안팎으로 데이터를 이동한다는 것을 의미한다. 데이터가 스택의 잘못된 위치로 이동하거나, 너무 큰 데이터 항목이 이를 담을 만큼 충분히 크지 않은 스택 위치로 이동하면 프로시저 호출에 대한 반환 정보가 손상되어 프로그램이 실패할 수 있다.[1]

악의적인 당사자는 입력 길이를 확인하지 않는 프로그램에 과도한 데이터 입력을 제공하여 이러한 유형의 구현을 악용하는 스택 스매싱 공격을 시도할 수 있다. 이러한 프로그램은 데이터를 통째로 스택의 위치로 복사할 수 있으며, 그렇게 함으로써 자신을 호출한 프로시저의 반환 주소를 변경할 수 있다. 공격자는 이러한 프로그램에 제공할 수 있는 특정 유형의 데이터를 실험하여 현재 프로시저의 반환 주소가 스택 자체 내(그리고 공격자가 제공한 데이터 내) 영역을 가리키도록 재설정되도록 할 수 있으며, 이 영역에는 권한 없는 작업을 수행하는 명령어가 포함되어 있다.[1]

이러한 유형의 공격은 버퍼 오버플로 공격의 변형이며, 소프트웨어에서 매우 빈번한 보안 침해 원인이다. 그 이유는 가장 인기 있는 컴파일러 중 일부가 데이터와 프로시저 호출 모두에 공유 스택을 사용하고 데이터 항목의 길이를 확인하지 않기 때문이다. 또한 프로그래머는 데이터 항목의 크기를 확인하는 코드를 작성하지 않는 경우가 많으며, 크거나 작거나 한 데이터 항목이 스택에 복사되면 보안 침해가 발생할 수 있다.[1]

프로시저 내의 로컬 데이터와 프로시저 호출에 관한 정보는 대부분 공통 스택에 저장된다. 즉, 프로그램은 프로시저 호출의 리턴 주소라는 매우 중요한 정보를 보존하고 있는 스택에 데이터를 넣고 빼는 것이다. 데이터를 스택 상의 잘못된 영역에 쓰거나, 너무 큰 데이터를 스택에 써서 리턴 주소가 손상되면 프로그램이 이상 동작을 하게 된다(버퍼 오버런 공격).[1]

악의적인 사용자는 이러한 구현을 악용하여 입력 데이터의 크기를 확인하지 않는 프로그램에 너무 큰 데이터를 입력하기도 한다. 그러한 프로그램은 데이터를 스택에 저장하려다가 리턴 주소를 손상시킨다. 공격자는 실험을 통해 리턴 주소가 스택 영역 내(특히 공격자의 입력 데이터가 쓰인 영역 내)를 가리키게 되는 입력 데이터 패턴을 찾아내고, 허가되지 않은 조작을 하는 명령어를 입력 데이터에 포함시켜 보안을 뚫는다. 이러한 공격에 대해 프로그래머는 스택 처리에 주의를 기울여야 한다.[1]



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com