Information Security Study

[HackerSchool_FTZ] Level 9 본문

System

[HackerSchool_FTZ] Level 9

gayeon_ 2023. 11. 9. 18:22

힌트로 /usr/bin/bof 의 소스코드를 받았다.

 

먼저 코드를 보면 bur, buf2를 char형 배열로 10개를 할당한다.

buf2를 먼저 할당해줬기 때문에 buf2는 buf보다 더 높은 주소를 가지게 된다.

 

이후, 'It can be overflow : '문자를 출력한 다음 fgets로 buf에 40byte 만큼 입력을 받는다.

이때 할당된 buf 배열보다 더 많은 입력값을 받기 때문에 버퍼오버플로우가 발생한다.

 

버퍼 오버 플로우(Buffer OverFlow)

: 시스템 해킹의 대표적인 공격 방법 중 하나이다.

데이터가 지정된 크기의 공간보다 더 많은 입력을 통해 해당 메모리 공간을 벗어나는 경우이다.

프로그래밍 언어와 취약한 함수가 있는 경우 이를 이용해 공격을 시도하며 공격이 성공할 경우 시스템의 권한을 상승시키거나 악성 행위를 할 수 있기 때문에 공격에 대한 방어를 철저히 해야한다.

 

버퍼 오버 플로우가 발생하면 입력은 buf에 받지만 그 메모리 공간을 벗어나는 입력을 했을 경우 buf2의 값까지도 영향을 줄 수 있다.

 

 

strncmp 함수를 통해 buf2의 값과 "go"라는 문자열의 2byte를 비교하게 된다.

비교하는 값이 같다면 strncmp 함수는 0을 반환하게 된다.

-> 0과 같다면 다음 레벨의 권한을 부여하고 shell을 실행시켜 level10의 권한을 얻게 된다.

 

 

데이터 입력은 낮은주소에서 높은주소로 입력되기 때문에 만약 buf가 buf2보다 먼저 선언되었다면 buf에서의 입력으로 buf2에 영향을 줄 수 없다.

 

 

 

buf의 10byte를 채워주고 buf2의 첫영역부터 "go"를 입력해보았다.

 

 

 

 

아무것도 일어나지 않았다.

컴파일 되는 과정에서 자동으로 buf와 buf2 사이에 dummy 값이 생성된다.

이를 알기 위해 실행파일을 GDB라는 디버깅 툴을 이용해 분석했다.

 

 

GDB

: 보통은 GDB라고 부르는 GNU 디버거(GNU Debugger)는 GNU 소프트웨어 시스템을 위한 기본 디버거이다.

GDB는 다양한 유닉스 기반의 시스템에서 동작하는 이식성이 있는 디버거이며 컴퓨터 프로그램의 실행을 추적하고 수정할 수 있는 많은 기능들을 제공한다.

 

 

 

권한이 없는 것 같아 실행파일을 복사해서 분석했다.

 

 

 

복사도 안되는 것 같아 힌트파일의 소스코드를 통해 직접 컴파일했다.

./tmp 파일로 들어가서 소스코드를 컴파일해야 한다. (tmp디렉터리 안에 파일이 생성 가능)

 

 

 

소스코드

vi를 통해 소스코드를 붙여넣고 gcc를 통해 컴파일했다.

 

 

 

프로그램이 잘 동작했다.

 

 

 

다시 gdb를 실행했다.

 

 

main(){ 
  
  char buf2[10]; 
  char buf[10]; 
  
  printf("It can be overflow : "); 
  fgets(buf,40,stdin); 
  
  if ( strncmp(buf2, "go", 2) == 0 ) 
   { 
        printf("Good Skill!\n"); 
        setreuid( 3010, 3010 ); 
        system("/bin/bash"); 
   } 
  
}

소스코드를 보면

먼저 fgets 함수를 실행할 때 buf의 주소를 인자로 사용하게 된다.

 

 

 

fgets(buf,40,stdin); 

 

0x0804844b <main+43>: lea    eax,[ebp-40]
0x0804844e <main+46>: push   eax

fgets 함수 사용 전 인자로 buf 주소를 push해주는 과정

-> ebp-40 주소 값을 가지고 있는 것을 알 수 있다.

 

 

strncmp(buf2, "go", 2) 

 

0x08048461 <main+65>: lea    eax,[ebp-24]
0x08048464 <main+68>: push   eax

strncmp 함수 사용 전 인자로 buf2 주소를 push 해주는 과정

-> ebp-24 주소 값을 가지고 있는 것을 알 수 있다.

 

buf: ebp-40

buf2: ebp-24

-> buf와 buf2의 거리는 16byte

 

buf(10)와 buf2(10) 사이의 dummy 값은 6byte인 것도 알 수 있다.

-> buf에서 16byte 넘게 입력받으면 buf2의 값을 변조할 수 있다.

 

 

 

q 명령어를 통해 gdb를 종료하고 실행해봤다.

 

 

 

 

 

 

buf2에 "go"값이 잘 입력됐다!

 

 

 

 

 

 

 

원본 파일에 입력했다.

level10의 계정으로 로그인 된 것을 볼 수 있다.

 

 

 

 

 

 

my-pass로 패스워드를 확인했다.

 

 

 

 

 

 

 

 

참고 자료

https://she11.tistory.com/20

 

[HackerSchool] FTZ Level9 풀이

FTZ LEVEL9부터 버퍼 오버 플로우 지식을 기초로 하는 문제가 등장합니다. 기초가 없으신 분들은 아래 링크에 달고나님의 문서를 올려두었습니다. https://she11.tistory.com/23 쭉 읽으면서 공부하시면 좋

she11.tistory.com

 

'System' 카테고리의 다른 글

[HackerSchool_FTZ] Level 7  (0) 2023.11.12
[HackerSchool_FTZ] level 10  (0) 2023.11.09
[HackerSchool_FTZ] level6  (0) 2023.10.08
[HackerSchool_FTZ] level5  (0) 2023.10.08
[HackerSchool_FTZ] level4  (0) 2023.10.01