글
버퍼오버플로우 04- 해쿨핸드북
메모리 맵 중에서도 특히 스택 영역은 버퍼 오버플로우 공격에 있어서 매우 중요한 부 분입니다. 앞서 말씀드린 바대로 스택 영역엔 함수 호출과 관련된 정보들, 그 중에서도 특히 리턴 어드레스가 저장되기 때문
스택(stack)이라는 단어는 차곡 차곡 쌓여진 더미를 의미
스택이란 “데이터 구조”라는 컴퓨터 분야에 나오는 개념으로서, 메모리의 데이터들을 효율적으로 다루기 위해 고안된 데이터 참조 방식 중 하나
먼저 입력된 데이터는 가장 아래쪽에 쌓이고 나중에 입력된 데이터는 그 위에 쌓이게 된다.
스택의 기본 개념: 가장 먼저 처리해야 할 것을 가장 가까운 곳에 둔다
쌓여진 데이터가 실제 사용될 때에는 가장 위의 것부터 반대순서로 사용
OS에 기본으로 구현되어 있는 스택을 “시스템 스택”이라고 하며 시스템 스택의 기본 데이터 크기는 프로그램의 레지스터 크기와 일치한다.
ex) 32bit 프로그램을 기준으로 한다면 시스템 스택 데이터의 기본 크기는 32비트(4바이트)이다.
PUSH: 스택에 새로운 자료를 추가하는 것, PUSH하면 할 수록 기존 데이터 위에 새로운 데이터가 순서대로 쌓아 올려지게 된다.
POP: PUSH에 의해 스택에 저장된 값을 다시 빼내어 내는 것은 POP
TOP: 현재 스택에 쌓인 데이터들의 위치중 가장 높은 위치의 메모리 주소값(실제로는 가장 낮은 주소값)
BOTTOM: 스택에서 가장 아랫부분에 해당하는 메모리 주소값(가장 높은 주소값)
*BOTTOM은 TOP과 달리 가장 아랫부분만 가리키기때문에 항상 동일하다.
TOP은 메모리 맵의 낮은 주소쪽인 왼쪽, BOTTOM은 높은 주소쪽인 오른쪽 에 해당
+스택이 항상 커널의 반대 방향으로 자 라기 때문에 영원히 커널을 만나지 않게되기 때문
+ 스택과는 달리 새로운 데이터가 추가될 수록 더 큰 메모리 주소를 할당받게 됨
스택을 그림으로 표현하는 방법은 3가지
1. 스택을 세로로
이유: 쌓여올라간다는 이미지 연상시킴. 더욱 직관적으로 표현하고 이해할 수 있다.
2. 스택을 세로로 그리되 위 아래 거꾸로 하는 법
이유: 높은 메모리 주소가 더 위에 있음을 표현하기 위함. but 스택 자체에 중점을 두어 표현할 떄엔 적절한 방식 X
3. 스택을 가로로 그리는 법
이유: 가로로 그려진 메모리 맵 아넹서 스택을 함께 이해하기 위해선 괜찮다.
주로 1번과 3번사용
가장 먼저 선언한 지역변수는 메모리 주소상 가장 높으며 가장 나중에 선언한 지역변수는 가장 낮은 주소에 위치한다
int 데이터는 4바이트기 때문에 스택 데이터의 기본 크기인 4바이트와 동일
하지만 1바이트인 char과 2바이트인 short 데이터형이 지역변수로 선언된다면?
4바이트에서 부족한 바이트만큼의 데이터가 임의로추가. ==> dummy 쓰레기값
●리턴 어드레스와 스택
하나의 함수에서 자식 함수로 실행 흐름이 바뀔 땐, 자식 함수에서 다시 부모 함수로 돌아가기 위한 주소인 “리턴 어드레스”가 스택에 저장
※중요한것
소스코드 상에서 선언된 순서와는 반대 순서로 스택에 저장된다.
이와 같은 특징은 차후 복잡한 구조의 버퍼오버플로우 취약점을 공략할 때 꼭 필요한 내용이다.
*스택프레임
함수와 스택 영역 사이에 밀접한 관련이 있는 이유?
“가장 먼저 처리해야 할 것을 가장 가까운 곳에 둔다"
가장 마지막에 호출된 함수가 반대로 가장 먼저 해제되는 모습이 앞서 봐온 스 택 구조와 일치.
그렇기 때문에 함수와 관련된 값들의 저장과 사용, 그리고 해제 는 스택이라는 자료 구조에 적합하다
버퍼 오버플로우 공격의 핵심인 “리턴어드레스”가 스택 영역에 저장된다는 점은 가장 중요!
'포너블' 카테고리의 다른 글
| Pwnable study 1주차[함수 프롤로그 & 에필로그] (0) | 2020.01.30 |
|---|---|
| 버퍼오버플로우 05- 해쿨핸드북 (0) | 2020.01.01 |
| 버퍼오버플로우 03 - 해쿨 핸드북 (0) | 2020.01.01 |
| 버퍼오버플로우 02 - 해쿨 핸드북 (0) | 2020.01.01 |
| 버퍼오버플로우 01 - 해쿨 핸드북 (0) | 2020.01.01 |