관리 메뉴

IT창고

System BufferOverFlow 본문

보안/System

System BufferOverFlow

방구석여포 2018. 1. 30. 22:26

버퍼 오버플로우(Buffer OverFlow)에 대해 알아보겠습니다.

버퍼오버플로우는 정상적인 접근이 불가능한 메모리 공간에 임의의 코드를 집어넣는 기법으로 1995년도에 처음 phrack사이트에서 Aleph One이란 저자명으로 smashing the stack for fun and profit이란 문서를 올려 최초공개 되었습니다. 


버퍼오버플로우가 생기는 원인으로 보안에 취약한 함수(scanf, gets, strcpy, ....)를 사용하는 경우입니다. 시스템 취약점의 거의 대부분은 버퍼오버플로우 취약점을 가지고 있습니다.



strcpy함수를 사용한 C언어 프로그램입니다. Hello! 인자를 넣어 보면 정상적인 출력이 됨을 확인할수있습니다. 하지만 만약 해당 인자에 메모리 크기를 넘어서는 값이 온다면 어떻게 될지 알아보겠습니다.


strcpy 함수는 buffer를 복사하며 크기를 확인하지않기 때문에 [20]을 넘어버리면 다른 메모리를 침범하게 되면서 에러가 일어납니다.



GDB 디버거로 확인해보면 eip레지스터에 A의 아스키코드(41)값이 들어가있는걸 확인할수있습니다. 이것을 메모리 변조라고 합니다.

이번에는 strcpy함수가 실행되는 부분에 브레이크를 걸어 더 자세히 살펴보도록 하겠습니다.


strcpy함수를 사용하기 바로 전에 멈춘 모습을 보면 saved ebp값이 정확하게 들어있습니다. 이제 ctrcpy함수를 사용하게 되면 입력받은 인자가 [20]보다 크기때문에 메모리가 입력받은 인자의 값으로 변조된 모습을 확인하수있습니다. 

위와 같은 실험으로 오버플로우 취약점으로 레지스터값을 변조하는게 가능한걸 알수있습니다.


위와 같이 메모리를 변조하여 자신이 원하는 값을 출력하게 할수도 있습니다.

만약 변조해야할 값이 숫자라면 문자열 이스케이프를 사용해야합니다. 예를 들어 1234의 값을 넣고 싶다면 

./target2 $(python -c 'print "A" * 20 +"\x21\x43\') 를 입력하여 원하는 숫자도 넣을수있습니다. 단 litle endian방식임으로 고려해서 넣어줘야합니다.


마지막으로 입력할수없는 숫자(bad character)에 대해알아보겠습니다.

1) 0x00 - NULL문자

- 마지막에 1byte만 가능합니다.

- 문자열의 끝을 NULL로 인식하는 경우에는 불가능합니다.

- 우회방법이 없기때문에 다른 방법을 찾아야만 합니다.


2) 0xff 

- 쉘 자체의 버그입니다.

- bash 버그로 이 버그를 고친 bash2를 사용하면 사용가능합니다.

- chsh -> /bin/bash2 로 변경가능하며 단 다음번 로그인부터 적용이 됩니다.


3) 0x20, 0x0a, 0x09 (공백, 엔터, 탭) - 화이트 스페이스

- 우회 방법으로 문자열 이스케이프를 사용할 경우에는 사용가능합니다

- 단 0x0a는 그래도 사용할수없습니다.

'보안 > System' 카테고리의 다른 글

System RTL 공격기법  (0) 2018.02.18
System 쉘 코드  (0) 2018.02.03
System 디버거(de-bugger)  (0) 2018.01.25
System main함수의 인자와 시스템콜  (0) 2018.01.23
System 메모리구조와 어셈블리어 함수  (0) 2018.01.22
Comments