[ Pwnable ] BOF, Buffer OverFlow 취약점 분석 실습을 하기 위한 이론
2024. 11. 21. 20:37

이 내용은 '해킹대회 출전을 위한 시스템해킹(Pwnable) 입문' 강의 내용을 포함하고 있습니다.

스스로 공부하고, 공부한 것을 정리하기 위한 목적으로 올리는 포스팅입니다.

본 실습에서 다루는 모든 보안 공격 기법은 오직 학습 및 실습 환경에서만 사용해야 하며,

허가받지 않은 시스템이나 서비스에 대한 해킹 시도는 명백한 불법 행위입니다.

이에 따른 모든 법적 책임은 사용자 본인에게 있습니다. 항상 윤리적인 해킹 원칙을 지켜주시기 바랍니다.

 

 

입력 길이를 검증하지 않는 함수와 Buffer OverFlow

코드에서 get 함수가 있으면 굉장히 위험하다. gets 함수는 입력을 그냥 받아주는 함수이며, 입력 값 검증 없이 그대로 입력을 받는다는 점이 키포인트이다. 

출처 : 해킹대회 출전을 위한 시스템해킹(Pwnable) 입문 강의

 

위 사진과 같이 컴퓨터는 메모리 안에 값을 저장할 수 있다. 하지만 그 공간은 무한하지 않기 때문에, 유한한 공간에 너무나도 큰 값을 넣게 되면 그 공간을 가득 채울 수 있을 것이다. 컴퓨터 메모리 안에는 다른 중요한 정보가 들어있을 수 있기 때문에 큰 값을 넣어 가득 채우게 되면 문제가 발생할 것이다.

 

 

스택에 저장되는 값들

출처 : 해킹대회 출전을 위한 시스템해킹(Pwnable) 입문 강의

 

컴퓨터 메모리에 입력하는 공간의 이름을 스택 메모리라고 한다. C언어에서 프로그램을 짜고 어떤 함수 안에서 변수 혹은 배열을 선언하게 되면 항상 이 스택이라는 공간에 값이 들어가게 된다. 이러한 값들을 지역변수라고 부른다.

스택 안에는 Return Addr도 같이 존재한다. 프로그램 동작은 무조건 함수로 이루어져 있다.

main은 프로그램이 가장 먼저 시작할 떄 실행하는 함수이며, 함수의 호출(call)과 복귀(return)의 이해가 있어야 한다.

 

EBP 값은 이전 스택 프레임의 시작 주소이다.

스택 프레임을 나눠주는 역할이 스택에 저장된 EBP의 역할로, EBP는 이전 함수가 사용하던 스택 프레임의 시작 주소가 어디인지 나타내 준다. 함수 실행이 종료되면 손쉽게 이전 스택 프레임으로 복귀할 수도 있다.

 

출처 : 해킹대회 출전을 위한 시스템해킹(Pwnable) 입문 강의

 

EIP와 EBP는 모두 레지스터로, 스택에 저장되는 값(Reutrn Addr과 value in EBP)은 이 레지스터 안에 들어있는 값이다.

EIP 레지스터 역할은 CPU가 지금 실행중인 코드의 위치를 담고 있는 것, 따라서 EIP 레지스터에 담기는 값은 코드 영역 어딘가에 있는 주소가 되는 것이다. 이 EIP가 바로 PC(Program Counter)에 해당하는 레지스터이다.

EBP 레지스터 역할은 지금 실행중인 함수의 스택 프레임 시작 위치를 담고 있는 것, 따라서 EBP 레지스터에 담기는 값은 스택 영약 어딘가에 있는 주소가 되는 것이다.

스택에 저장하는 것은 이 레지스터 안에 담겨 있는 '값'이다. EIP에 있는 값을 저장하면 당연히 코드 영역의 메모리 주소가 저장이 될 것이고, EBP에 있는 값을 저장하면 당연히 스택 메모리 영역의 메모리 주소가 저장이 될 것이다.

프로그램에 gets와 같이 입력 길이를 검증하지 않는 함수로 지역 버퍼에 값을 입력하는 부분이 있다면 Stack BOF 취약점이 일어날 수 있으며 주의해야 한다.

 

 

출처 : 해킹대회 출전을 위한 시스템해킹(Pwnable) 입문 강의

 

Stack Buffer OverFlow

  • local 변수에 입력받는 함수가 입력 길이를 검증하지 않으면 stack에 있는 버퍼를 넘어 값을 쓸 수 있다.
  • PC(Program Counter)는 Callee 함수가 실행을 종료하고 Return Address를 그대로 가져가 별도의 검증없이 해당 주소 코드를 실행시킨다.

스택 버퍼에 대한 입력을 통해 약속된 지역 버퍼를 넘어서 뒤에 있는 Return Address 값을 마음대로 바꿀 수 있다면 지금 실행하고 있는 callee 함수를 끝마치고 되돌아갈 caller 함수 위치를 마음대로 바꿀 수 있을 것이다. 이 공격이 Stack Buffer에서 발생하는 OverFlow를 이용한 Return Address OverWrite 공격기법이다. 

모든 취약점과 공격 기법들은 [취약점]을 이용한 [공격기법]으로 표현이 가능하다.