감자 텃밭

Buffer overflow ? 본문

System/System Theory Information

Buffer overflow ?

g2h 2021. 11. 15. 17:14

시스템 해킹의 바이너리 해킹이 일어나는 취약점 중 대표적이며 제일 흔한것이 Buffer overflow이다.

여기서 Buffer over flow란 무엇인가?

 

buffer에 할당된 이상의 크기를 입력받아 스택 내에 다른 buffer영역에 침범하는 행위 이다.

이게 무슨 말인가??

 


buffer와 overflow에 대해 알아보자.

 

Buffer 란?

 1. 데이터의 이동을 위해 일시적으로 데이터를 저장하고있는 저장 공간

 2. 키보드로 부터 입력받는 장치에 의해 저장되거나 출력하는 장치에 의해 해당 버퍼의 값이 출력됨.

 

Overflow 란? 

 1. over와 flow의 합성어로 넘친다는 의미를 가짐

 

그럼 Buffer Overflow는 즉 Buffer의 정해진 크기보다 더 많은 값이 들어와 해당 Buffer가 넘친다는 의미이다.

해당 Buffer Overflow는 매우 취약한 취약점으로 해당 취약점이 발생하면 인접 메모리를 덮어쓰게 되며, 정보노출, 오류, 오작동, 악의적 코드를 실행하는등의 악용이 일어나며 프로그램이 종료되면 돌아가야할 주소가 저장되어 있는 RET 주소를 제어할 수 있게된다.

 

그럼 Buffer Overflow는 왜 발생하는가??

- 프로그래머들이 입력함수를 사용할때 입력값을 검증하지 않아 발생하게 된다.

 

해당 취약점을 예방하기 위해서는 입력값 검증을 통해 입력값을 제한하거나, 안전한 입력함수를 사용하여야 한다.

 

해당 Buffer Overflow에 취약한 함수는 아래 표에 나와있는 함수들이 존재한다.

strcpy(), strcat(), gets(), fscanf(), sprintf(), sscanf(), vfscanf(), vsprintf(), vscanf(), vsscanf(), streadd(), strecpy(), strtrns()

위와같은 취약한 함수들이 존재하며, 입력값을 검증하는 read() 등의 함수를 사용하더라도 입력값을 제대로 검증하지 않는다면 Buffer Overflow취약점은 일어나게 된다.

 

해당 Buffer Overflow는 stack Buffer Overflow와 Heap Buffer Overflow의 두가지로 나뉘게 된다.

 


Stack
지역변수, 인자, 함수가 종료된 이후의 돌아갈 곳의 주소(ret)가 저장되어 있으며 해당 스택에서는
주로 Buffer Overflow를 이용하여 인접한 버퍼의 값을 원하는 값으로 변형시키기도 하지만 함수가 종료된 이후 돌아갈 곳의 주소가 저장되어 있는 ret에 원하는 주소값을 넣어 프로그램을 제어하는것이 주 목적이다.
Heap
 malloc, calloc등의 함수를 사용해 프로그래머가 직접 공간을 할당받는 동적할당에 의해 생성되며, 해당 Heap에서는 저장된 데이터 및 함수를 변경시켜 원하는 결과값을 얻는것이 주 목적이다.

 


ex

Buf [64] | SFP [4] | RET [4]

예를 들어 위와 같은 스택메모리가 존재할 때 Buf의 입력을 하기위한 함수가 취약할 경우

지정해놓은 64 바이트 이상의 값을 입력받게된다. 그렇게 되면 Buf의 크기 64바이트에 SFP 의 4바이트를 더한 68이트만큼의 임의의 값을 입력 후 system함수의 주소를 넣게되면 RET부분에 system함수의 주소가들어가게 되므로

해당 프로그램이 종료되면 RET에 의해 system함수가 실행된다.

 

하지만 위와같은 방법은 system 함수의 인자값으로 "/bin/sh" 문자열을 줘야 한다.

해당 기법은 RTL이라는 기법이며, 이 외에도 Buffer Overflow로 인한 공격 기법들은 수없이 많다.

SFP가 뭔지, BOF를 악용하여 사용하는 기법들에서는 다음에 다뤄보도록 하겠다.

 

 

 

 

 

참고자료
https://byounghee.tistory.com/20
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=luuzun&logNo=50190684185