hackerschool 문제/FTZ

[Hackerschool FTZ] - level 9 문제

Roronoa 2022. 11. 21. 03:17
반응형

문제 내용

[그림 1] 힌트 내용

/usr/bin/bof의 소스코드를 출력하고 있다.

소스코드

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

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");
   }

}

해당 소스코드를 해석하면 버퍼 2개가 선언되어 있고 fgets로 buf에 40바이트만큼 입력창에서 입력을 받고 있다.

그리고 buf2에 저장된 2바이트가 go문자랑 같으면 0을 리턴하므로 참이되어 Real User ID, Effective User ID 가 3010인 bash 쉘을 실행한다.

 

[그림 2] tmp에 bof파일 생성

tmp에 bof.c 파일을 만들어 코드를 복붙한 후 gcc로 컴파일을 진행하였다.

 

[그림 3] disas main

그림 3번은 disas main의 결과이다.

strncmp함수 부근을 보면 eax에 ebp-24의 주소값을 옮기고 있다. 그리고 strncmp를 하기때문에 ebp-24부근에 buf2의 배열이 있음을 알 수 있다.

 

[그림 4] 입력으로부터 buf2사이까지의 거리

A를 많이 입력을 하고 스택을 확인해보면 0xbfffdec0부터 입력이 된것을 알 수 있다.

그리고 ebp - 24의 위치는 0xbfffded0이므로 사이의 크기는 16바이트이다.

따라서 우리가 쓰레기값은 16바이트 넣고 go문자열을 넣으면 level10의 쉘을 얻을 수 있을것이다.!!

 

[그림 5] level10으로 권한상승

A를 16번 넣고 go문자를 넣으니 level10으로 권한상승에 성공하였다.

 

[그림 6] level10 password

권한상승 후 my-pass 명령어로 패스워드를 확인하였다.

level10 password

interesting to hack!
반응형