농소

버퍼 오버플로우(Buffer Overflow), 취약점 본문

Security/System Hacking

버퍼 오버플로우(Buffer Overflow), 취약점

농소 2018. 1. 31. 01:53

취약점


  - 에러의 한 종류

  - 모든 취약점은 에러다.

  - 하지만 모든 에러는 취약점이라고 할 순 없고, 여러 에러중에 취약점이 발생


메모리 변조


 버퍼(스택) 오버 플로우


  - 1995년도에 처음 발표

  - smashing the stack for fun and profit // phrack 사이트에서 이런 문서가 나옴, 첫 시작

  - by Aleph One (바이너리 분석에서 유명한 분)


  이러한 버퍼 오버플로우가 생기는 이유는 바로 취약한 함수를 사용하기에 발생.


  취약한 함수 : scanf, gets, strcpy, . . .


그중 strcpy를 예를 들자면



우선 두번째 인자값을 buffer2에 복사하는 c코드를 작성하였다.

이제 실행파일을 만들고 여러 테스트를 해보면


1. 20바이트를 넘지않는 정상적인 값을 넣었을때 정상적으로 복사됨을 확인 가능하다.

2. 20바이트를 넘는 값을 넣었을때 buffer1의 영역까지 침범하여 값이 채워졌다.

3. 훨신 더 많은 값을 넣었을때 Segmentation fault 즉, 에러가 발생 했다.


어떻게 된건지 자세히 알아보기 위해 메모리의 구조를 확인해보면



첫번째로 그 크기에 맞는 정상값을 넣었을 경우. 정상적으로 해당 영역에 값이 들어있음을 확인할 수 있다.



두번째로 buffer2의 크기보다 더 큰 입력값을 넣었을 경우 ebp-20의 buffer1영역까지 침범하여 값이 들어가게된다.



마지막으로 더 많은 입력을 넣는경우 saved eip 의 값 까지 덧씌워져 에러가 발생한다.


이런 일이 일어나는 이유는 바로 strcpy함수는 길이체크를 하지않는다는 점에 있다.

대안책으로는 길이체크를 하는 strncpy함수를 이용하면 해결이 된다.




 실습 메모리를 조작하여 출력값을 임의의 수로 변환해 보아라.


[root@nongso /root]# ./cat 

WHAT: 12345678

WHAT: 12345678


[root@nongso /root]# ./cat 

WHAT: 12345678

WHAT: 87654321

 


그냥 a를 20번 숫자 87654321하게되면 여기서 숫자는 문자로 인식하므로 사용할순 없고 제대로 출력할려면 두가지 방법이 있다


1. 아스키코드표를 참조하여 해당 숫자로 변환되는 기호를 찾아서 넣는다.

2.문자열 이스케이프 시퀸스를 이용한다.




bad character


1. 0x00 : NULL 입력할 방법이 전혀 없음

./cat $(python -c 'print "A" * 20 + "\x00\x00\x00\x00"') ( X )

null뒤에는 다른문자를 넣을 수 없다.


  - 마지막에 한 바이트 가능 그외에는 전혀 넣을 수 없다.

  - 문자열의 끝을 널로 인식하는 경우 절대 불가능




2. 0xff : bash 버그중 하나 (이 버전 에서만)

./cat $(python -c 'print "A" * 20 + "\xff\xff\xff\xff"') ( X )


  해결책

  - 쉘 교체: bash2



3. 0x20, 0x0a, 0x09 : <white space> 공백 , 엔터, 탭

./cat $(python -c 'print "A" * 20 + "\x20aaaa"')

이 경우 공백으로 받아들여 세번째 arg로 인식한다


  해결책

  - bash: ', " 로 사용하면 가능


./cat "$(python -c 'print "A" * 20 + "\x20\x20\x20\x20"')"    // ( O )

./cat "$(python -c 'print "A" * 20 + "\x0a\x0a\x0a\x0a"')"    // 0a는 안됨

./cat "$(python -c 'print "A" * 20 + "\x09\x09\x09\x09"')"    // ( O )


변조된것을 볼때 이런것을 잘 확인해야함 꼭!!! 연습하고 확인.. 나중에 문자열 넣다가 안되는경우 대부분 여기서 발목잡힘




권한 상승


-SETUID : effective User ID

-SETGID : effective Group ID


x가 아닌 s로 표현


실행하는 동안에는 소유자의 권한으로 실행. <-setuid

root만 쓸수 있는 명령어들을 사용하기 위해


ex) login 명령어 // root: login -> id, pw -> 비교: /etc/shadow 일치하면 인증


시스템 해킹에서 공격자가 주타겟으로 삼는것이 취약점과 setuid가 있는 실행파일이다.

이 두가지가 있어야만 권한상승을 할 수 있기에 해당 시스템의 정보를 변조하거나 탈취할 수 있음.