Buffer Overflow in Cpp

C++는 브라우저, 게임 개발 등 높은 성능을 요구하는 프로그램을 개발할때 종종 쓰입니다. 게다가 아직도 많은 사람들이 업데이트를 하며, CppCon이 있을 정도로 커뮤니티도 방대하기까지 합니다.

그러나 C++에서도 메모리를 직접 수정하고 관리할 수 있기 떄문에 C의 메모리 커럽션 취약점을 무시 못합니다.

다른 점으로는 높은 수준의 문법으로 작성되었기 때문에 이러한 추상화 단계의 코드에서 어디서 메모리 커럽션이 나는지 파악하기 힘든 경우가 많습니다.

이번 시간에 Cpp에서 메모리 커럽션이 나는 경우는 어떻고 취약한 코드는 어떤지 체크해봅시다.

#include <iostream>

using namespace std

int main(void) {
  char buf[20];
  cin >> buf;
}

이 코드는 char형의 buf를 20만큼의 배열을 받고 입력을 받는 코드입니다. C언어보단 간략화 되서 보기에는 괜찮아 보이는 일반적인 코드이지만, 이 작은 코드에도 취약점이 있습니다.

이 cin 입력 함수에서는 길이 검증을 받지 않고 입력한 그대로 buf에 입력을 받습니다. 이로 인해 길이 검증을 하지 않음을 통해 버퍼 오버플로우가 발생하게 됩니다.

그러니 저 코드를 다음과 같이 수정하면 버퍼오버플로우는 발생하지 않습니다.

#include <iostream>

using namespace std

int main(void) {
  string buf;
  cin >> buf;
}

Container Overflow

STL에서 컨테이너(container)는 같은 타입의 여러 객체를 저장하는 일종의 집합이라 할 수 있습니다.

컨테이너는 클래스 템플릿으로, 컨테이너 변수를 선언할 때 컨테이너에 포함할 요소의 타입을 명시할 수 있습니다.

컨테이너에는 복사 생성과 대입을 할 수 있는 타입의 객체만을 저장할 수 있습니다. 또한, 컨테이너는 요소의 추가 및 제거를 포함한 다양한 작업을 도와주는 여러 멤버 함수를 포함하고 있습니다.

-TCP shcool 에서 발췌 -