- 스택의 개념
- 스택의 구조
- 스택 code
- 스택 오버플로우
스택의 개념
: 스택은 프로그램에서 함수 호출과 관련된 데이터를 저장하는 메모리 영역. 함수가 호출될 때, 스택에는 다음과 같은 정보가 순서대로 쌓임 ( 함수 매개변수 -> 반환주소 -> 지역변수 -> TOP(Stack Pointer) )
언뜻 생각하기엔 스택이 점점 쌓여 나갈 수록 메모리 주소 값도 커질 것이며, 그렇기 때문에 TOP이 오른쪽, BOTTOM이 왼쪽에 해당할 것만 같지만 실제로는 그 반대!! Top이 왼쪽, BOTTOM이 오른쪽임. 그렇기 때문에 스택에 새로운 데이터가 추가될 수록 TOP(Stack Pointer)에 해당하는 메모리 주소 값은 반대로 점점 작아짐. 스택의 BOTTOM은 항상 커널과 맞닿 는 부분에 해당하는 0xc0000000 주소 값이 됨.
1-2) 스택의 구조 : 사진과같음
1-3) 스택 원리 : 스택은 이 데이터를 "후입선출(LIFO)" 방식으로 관리한다.
즉, 가장 나중에 들어간 데이터가 가장 먼저 나오는 구조
아래서부터 함수 매개변수 : 반환주소 : 지역변수 : 데이터들....top ( 이곳이 호출스택)
스택 관련 보안 개념
1) 스택 버퍼 오버플로우(Stack BOF) : 버퍼오버플로우의 한 종류. 프로그램의 호출스택(Call Back) 메모리영역에서 발생하는 보안 취약점. 함수 호출과 관련된 메모리가 너무 많아서 스택버퍼 한계를 넘어버리는것. 그래서 더이상의 함수 호출 정보를 저장할 수 없을 때 발생함. 재귀함수 호출이 너무 많거나, 지역변수가 너무 많거나 등등
*스택 오버플로우 보안*
1. 스택 카나리(Stack Canary) : stack bof가 일어나는것을 탐지하는데 사용된다. 왜냐면 프로그램 시작하기 전에 어떤 정수를 스택 반환 포인터 전에 놓고, 함수 결과반환주소를 사용하기 전에 이 숫자가 바뀌었는지 검사하면 됨.
2. 실행 불가능 스택(Non-Executable Stack) : 아예 스택에서의 실행을 못하게 막아버리는 법.
->ROP(Return Oriented Programming) 반환지향형 프로그래밍 : 실행 불가능한 메모리와 코드서명 같은 보안 방어가 있을때 사용. 공격자는 프로그램의 제어흐름을 하이제킹하기 위해 call stack의 제어를 얻고 '가젯'(코드 스니펫)이라고 불리는 선택된 기계어들을 실행하여 새로운 동작을 만들어낸다.
-> Return to Libc : 실행방지 비트가 존재하는 경우 이것을 우회하기 위해 생긴 해킹기법. 완성된 레고모델..이라고 비유할 수 있지. 이미 만들어진 레고모델인 라이브러리 함수를 가져와서 새로운 목적에 사용하는것임. 이것도 ROP의 한 형태로, 공격자가 프로그램의 표준 라이브러리 함수를 실행하도록 만든다. 예를들어서 system()함수를 호출하여 공격자가 원하는 명령어를 실행하도록 만듦. 이미 만들어져 있는 함수를 가져다 쓰는거지.
->Return to ShellCode : 공격자가 쉘코드 스택이 아닌 다른 실행가능한 메모리영역 (ex, 힙)에 삽입해서 그거 실행되게 하기
-> Rtl Chaining (Return-to-libc Chaining) : 여러개 완성된 라이브러리함수 세트 실행되게 만들기.
3. 랜덤화 : 프로그램의 메모리공간을 랜덤으로 배치해버려서 공격자가 쉘코드를 '어디에 놔야하누...;;' 하게 만들기
'개발 과 보안 > 자료구조 및 알고리즘' 카테고리의 다른 글
컴퓨터 구조_데이터 저장 단위 "WORD" (0) | 2023.03.14 |
---|