yehey's 공부 노트 \n ο(=•ω<=)ρ⌒☆

버퍼 오버플로우 (BOF, Buffer OverFlow) 본문

컴퓨터 시스템/시스템 해킹

버퍼 오버플로우 (BOF, Buffer OverFlow)

yehey 2020. 9. 9. 01:44

버퍼

:시스템이 연산작업을 하는데 있어 필요한 데이터를 일시적으로 저장하는 메모리 상의 임의의 공간

(다른 말로는 큐라고도 한다.)

:대부분의 프로그램에서는 버퍼를 스택에 생성한다. 

 

스택
:함수 내에서 선언한 지역변수가 저장되고 함수가 끝나면 반환하는 저장공간

 

버퍼 오버플로우 (BOF, Buffer OverFlow)

:미리 준비된 버퍼에 버퍼의 크기보다 큰 데이터를 쓸 때 발생한다. ('덮어쓰기'라고 생각하면 더 쉽다!)

:정상적인 경우에는 접근할 수 없는 메모리 공간에 접근해서 임의로 값을 바꾸는 것

 

스택 구조 예시, 출처: (달고나)와우해커 BOF 기초문서

 

 40바이트의 스택이 준비되어있다고 가정하자.

-40바이트 이하의 데이터를 버퍼에 쓰는 것은 아무런 지장이 없다.

-만약 41~44바이트의 데이터를 쓴다면 준비된 버퍼(40바이트)를 다 소진한 후 남은 4바이트는 이전 함수의 base pointer가 담긴 공간을 침범할 것이다.

-45~48바이트를 쓴다면 return address가 저장되어 있는 RET 공간을 침범하게 된다.

-48바이트를 넘긴다면 RET를 넘어서 그 이전에 스택에 저장되어 있던 데이터도 바뀌게 된다.

=>시스템에게 첫 명령어를 간접적으로 내릴 수 있는 부분은 return address가 있는 위치!

 

return address
:현재 함수의 base pointer 바로 위에 존재, return address에 있는 값이 EIP에 들어간다.

 

:: 공격자가 메모리 상의 임의의 위치에 원하는 코드를 저장시켜놓고 return address가 저장되어 있는 지점에 공격자의 코드 주소를 대신 넣어 EIP가 공격자가 원하는 코드가 실행될 수 있게 하는 공격

(공격자는 버퍼가 넘칠 때 RET자리에 원하는 주소를 쓸 수 있다)

 

BOF 공격 간단 요약

-버퍼가 넘칠 수 있는 코드 찾기 (BOF 취약점 찾기)

-return address의 정확한 위치 찾기

=> return address의 정확한 위치를 찾아 RET 직전까지 의미없는 값으로 버퍼를 채운 후 우리가 원하는 코드의 주소를 RET에 넣으면 공격 끝!

 

BOF에 취약한 함수: 처리하는 문자열의 최대 크기를 정하지 않는 함수

  • strcpy

  • strcat

  • gets

  • fscanf

  • scanf

  • sprintf

  • sscanf

  • vfscanf

  • vsprintf

  • vscanf

  • vsscanf

  • streadd

  • strecpy

  • strtrns

BOF 공격 예시

위에서 분석한 스택 구조를 이용해서 BOF 공격 예시를 들어보겠음!

function() 함수에는 strcpy라는 BOF 취약점이 존재한다고 가정하자.

strcpy(buffer, 입력 값)은 길이 체크를 하지 않기 때문에 버퍼의 크기에 관계없이 입력 값을 복사한다.

->ESP에서 return address(RET)까지 44바이트를 채워주고 return address에 공격코드의 주소를 넣어주면 된다. (공격 코드는 쉘코드를 사용한다고 가정.)

 

공격 코드 구성 예시 출처:(달고나)와우해커 BOF 기초문서

위의 그림과 같은 공격코드를 구성해서 strcpy의 입력 값 자리에 넣어준다!

 

공격코드의 스택 상 위치 출처: (달고나)와우해커 BOF 기초문서

이제 공격 코드가 들어간 후의 스택을 살펴보자!

공격코드가 들어간 스택 출처:(달고나)와우해커 BOF 기초문서

참고로 데이터가 저장되는 순서는 Little endian 방식을 따른다.

=>return address값을 넣을 때도 Little endian방식을 따라 바이트 순서를 뒤집어서 넣어야 한다.

(ex) return address: 59/FF/E3/74 ----> 74/E3/FF/59

 

현재 RET에는 임의의 값이 넣어져 있는데 여기에 쉘 코드 시작지점의 주소를 넣어주면

(여기서는 쉘 코드의 정확한 위치를 안다고 가정한다!)

쉘 코드 위치를 return address에 넣어준 모습 출처:(달고나)와우해커 BOF 기초 문서

이대로 함수가 실행되고 리턴될 때, return address에는 우리가 지정한 쉘 코드의 주소가 있기 때문에

쉘 코드 주소가 EIP에 들어가게 되고 쉘이 실행된다!

=>BOF 공격 끝

 

Shell (쉘)
:커맨드라인 인터프리터, 사용자의 명령어를 읽고 실행한다.
Windows의 cmd와 비슷해보이지만 훨씬 강력한 프로그래밍이다.

Shell code (쉘코드)
:시스템의 특정 명령을 실행하는 작은 사이즈 프로그램 (기계어로 작성되어있음)
공격 대상의 시스템 명령어 쉘을 실행시킨다는 의미, 공격 이후 실행될 프로그램(payload)으로 사용된다.

 

+예시에서는 쉘 코드가 24byte 공간에 다 들어갈 수 있었지만 RET위의 버퍼 공간이 쉘 코드를 넣을 만큼 충분하지 않으면 다른 공간을 찾아야 한다.

 

'컴퓨터 시스템 > 시스템 해킹' 카테고리의 다른 글

BOF - 환경변수 이용하기  (0) 2020.09.10
BOF - NOP Sled (NOP Slide)  (0) 2020.09.09
Comments