본문 바로가기
Hack/ftz

ftz 풀이 level9

by Choraengyi 2016. 12. 7.

 ftz level9를 풀어보겠습니다.


/usr/bin/bof 의 소스가 나오면서 이를 이용하여 level10의 권한을 얻으라고 합니다.



간단한 소스 분석부터 하겠습니다.


#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>


main(){


  char buf2[10];                                    //char 형으로 buf2 배열 선연 10바이트

  char buf[10];                                      //char 형으로 buf 배열 선연 10바이트


  printf("It can be overflow : ");                //해당 문장 출력

  fgets(buf,40,stdin);                           //입력받은값을 buf에 저장하는데 크기는 40바이트 이하여야 합니다.


  if ( strncmp(buf2, "go", 2) == 0 )           //buf2의 앞 2바이트와 "go" 를 비교했을때 같으면

   {

        printf("Good Skill!\n");                  //해당 문장 출력

        setreuid( 3010, 3010 );                   //해당 UID의 권한을 부여합니다.

        system("/bin/bash");                      //"/bin/bash" 명령을 실행합니다.

   }


}


 해당 C언어 소스를 보면, 결과적으로 buf2의 앞 2바이트에 go 라는 문자가 있어야 문제를 해결할 수 있음을 알 수 있습니다.

그런데 입력은 buf에만 할 수 있게 코딩 되있습니다. 

그러나, 이미 It can be overflow 라는 힌트가 있고 buf 배열은 10바이트로 설정되있으나 입력 받아서 buf에 저장하는

최대크기는 40바이트로 4배가 더 큽니다. 오버플로우에 대해서 짚고 넘어 가겠습니다.

 버퍼오버플로우 : 해킹기법중 하나, 오버플로우를 해석하면 넘쳐 흐르다 로서 버퍼 오버플로우는 데이터를 저장할때, 정해진 메모리 공간을 넘어 다른 인접 메모리공간에 저장하여 오류를 내거나 취약점이 생기게 하여 비정상적인 작동을 하게 합니다. 예방을 위해서는 각 데이터가 들어갈 메모리의 위치를 검사하는 것입니다. 위 코드에서 버퍼 오버플로우를 방지하기 위해서는 입력받는 문자의 크기를 10으로 제한해주거나 버퍼경계 검사를 실시하는 것 입니다.

이제, 그림으로 어떤 방식으로 go 문자를 buf2에 삽입할지 보겠습니다.

메모리 구조와 버퍼오버플로에 대한 설명이 잘되있어서 링크 올렸습니다.


 초기에 배열생성시에 아래와 같이 생성됩니다. 

buf2

 

 

 

 

 

 

 

 

 

 

buf

 

 

 

 

 

 

 

 

 

 


그 다음, 값을 입력 받아 buf에 값을 저장하게 되는데 만약 0123456789 를 입력했을 경우, 아래와 같이 buf 공간에


데이터가 입력됩니다.


buf2

 

 

 

 

 

 

 

 

 

 

 buf

 9

 8

 7

 6

 5

 4

 3

 2

 1

 0


 그렇다면 여기에서 값을 더 입력해 버퍼오버플로우를 이용하여 buf2에 "go"문자열을 입력시킬 수 있습니다.

buf2

 

 

 

 

 

 

 

 

 o

 g

 buf

 9

 8

 7

 6

 5

 4

 3

 2

 1

 0


 위와 같이 되면 권한을 받을 수 있는 조건문으로 갈 수 있기 때문에, 우선 입력해 보겠습니다.

0123456789go 를 입력해 보겠습니다.



그러나 실행해도 아무런 변화가 일어나지 않았습니다. 각 버퍼사이에 불필요한 값이 잡히기 때문인데, 

불필요한 값의 크기가 얼만큼인지 가늠하기 힘들기 때문에 1바이트씩 늘려가며 반복 시도를 해보겠습니다.

buf2

 

 

 

 

 

 

 

 

 o

 g

 불필요

 ?

 buf

 9

 8

 7

 6

 5

 4

 3

 2

 1

 0


1바이트씩 추가하며 계속 입력한 결과 6바이트를 추가후에 입력했을때 명령어가 실행됨을 볼 수 있습니다.


권한을 얻었으면 my-pass를 입력하여 다음으로 가는 패스워드를 획득하면 되겠습니다.



ftz level9를 풀어보았습니다.




728x90
반응형

'Hack > ftz' 카테고리의 다른 글

ftz 풀이 level11  (0) 2016.12.28
ftz 풀이 level10  (0) 2016.12.12
ftz 풀이 level8  (0) 2016.12.01
ftz 풀이 level7  (0) 2016.11.29
ftz 풀이 level6  (0) 2016.11.28

댓글