[Pwnable] 6. Memory Corruption: Stack Buffer Overflow

Wonder_Land🛕·2022년 10월 19일
0

[Pwnable]

목록 보기
6/21
post-thumbnail

[Reference] : 위 글은 다음 내용을 제가 공부한 후, 인용∙참고∙정리하여 만들어진 게시글입니다.


  1. 서론
  2. 스택 버퍼 오버플로우
  3. Q&A
  4. 마치며

1. 서론

'스택 버퍼 오버플로우(Stack Buffer Overflow)'는 정말 유명한 취약점입니다.

세계 최초의 웜이라고 불리는 '모리스 웜'도 스택 버퍼 오버플로우 공격을 통해 전파되었다고 합니다.

그리고 이 취약점은 아직도 많은 소프트웨어에서 발생하고 있습니다.


2. 스택 버퍼 오버플로우

스택 버퍼 오버플로우는 스택의 버퍼에서 발생하는 오버플로우를 뜻합니다.

1) 버퍼(Buffer)

  • 버퍼(Buffer)
    : 일상적인 의미로는, 완충 장치
    : 컴퓨터 과학에서는, 데이터가 목적지로 이동되기 전에 보관되는 임시 저장소

데이터 처리속도가 다른 두 장치가 있을 때,
이 둘 사이에 오가는 데이터를 임시로 저장해 두는 것은 일종의 완충 작용을 합니다.

이 두 장치 사이에 '버퍼(Buffer)'라는 임시 저장소를 두고,
이를 통해 간접적으로 데이터를 전달하게 합니다.

송신 측은 버퍼로 데이터를 전송하고, 수신 측은 버퍼에서 데이터를 꺼내 사용합니다.

이렇게 하면 버퍼가 가득 찰 때까지는 유실되는 데이터 없이 통신할 수 있습니다.

빠른 속도로 이동하던 데이터가 안정적으로 목적지에 도달할 수 있게 완충 작용을 해주는 것이 버퍼의 역할이라고 할 수 있습니다.

현대에는 이러한 의미가 많이 희석되어,
데이터가 저장될 수 있는 모든 단위를 버퍼라고 부르기도 합니다.

스택에 있는 지역 변수는 '스택 버퍼',
힙에 할당된 메모리 영역은 '힙 버퍼'라고 합니다.


2) 버퍼 오버플로우(Buffer Overflow)

  • 버퍼 오버플로우(Buffer Overflow)
    : 버퍼가 넘치는 현상

버퍼는 제각기 크기를 가지고 있습니다.

int로 선언한 지역변수는 4바이트를 갖는 식으로 말이죠.

그런데 만약 10개의 원소를 갖는 char배열에다가,
20바이트 크기의 데이터를 넣으면 오버플로우가 발생합니다.

일반적으로 버퍼는 메모리 상에서 연속해서 할당되어 있습니다.
따라서 어떤 버퍼에서 오버플로우가 발생하면, 뒤에 있는 버퍼들의 값이 조작될 위험이 있습니다.

이처럼 버퍼 오버플로우는 어떤 메모리 영역에서도 발생해도 큰 위험으로 이어집니다.


3) 버퍼 오버플로우의 위험성

(1) 중요 데이터 변조

만약 버퍼 오버플로우가 발생하는 버퍼 뒤에 중요한 데이터가 있다면,
해당 데이터가 변조됨으로써 문제가 발생할 수 있습니다.

예를 들어, 입력 데이터에서 악성 데이터를 감지하여 경고해주는 프로그램이 있을 때,
악성의 조건이 변경된다면, 실제로 악성 데이터가 들어와도 알람이 울리지 않을 수 있습니다.

(2) 데이터 유출

C언어에서 정상적인 문자열은 널바이트로 종결되며,
표준 문자열 출력 함수들은 널바이트를 문자열의 끝으로 인식합니다.

만약 어떤 버퍼에 오버플로우를 발생시켜,
다른 버퍼와의 사이에 있는 널바이트를 모두 제거하면,
해당 버퍼를 출력시켜서 다른 버퍼의 데이터를 읽을 수 있습니다.

획득한 데이터는 각종 보호기법을 우회하는데 사용될 수 있으며, 해당 데이터 자체가 중요한 정보일 수도 있습니다.

(3) 실행 흐름 조작

함수를 호출할 때 반환 주소를 스택에 쌓고,
함수에서 반환될 때 이 주소를 꺼내어 원래의 실행 흐름으로 돌아갑니다.

그런데 이를 공격자의 관점에서 바라보면,
'스택 버퍼 오버플로우로' 반환 주소(Return Address)를 조작하면 어떨까요?

실제로 함수의 반환 주소를 조작하면 프로세스의 실행 흐름을 바꿀 수 있습니다.


3. Q&A

-


4. 마치며

드디어 시스템 해킹의 가장 기본인 스택 버퍼 오버플로우에 대해 알아봤습니다.

사실 강의자료를 보면 이해가 훨씬 잘 되지만,
역시 실제로 활용해보면 쉽지 않네요...

pwntool을 이용해서 해보는데, 처음 해 본 거라 그런지 사용법도 미숙하고,
다른 글보면서 한 거라 제가 제대로 이해한 건지도 잘 모르겠네요ㅠㅠ

[Reference] : 위 글은 다음 내용을 제가 공부한 후, 인용∙참고∙정리하여 만들어진 게시글입니다.

profile
아무것도 모르는 컴공 학생의 Wonder_Land

0개의 댓글