level18

 

[level18@ftz level18]$ cat hint

#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
void shellout(void);
int main()
{
  char string[100];
  int check;
  int x = 0;
  int count = 0;
  fd_set fds;
  printf("Enter your command: ");
  fflush(stdout);
  while(1)
    {
      if(count >= 100)
        printf("what are you trying to do?\n");
      if(check == 0xdeadbeef)
        shellout();
      else
        {
          FD_ZERO(&fds);
          FD_SET(STDIN_FILENO,&fds);

          if(select(FD_SETSIZE, &fds, NULL, NULL, NULL) >= 1)
            {
              if(FD_ISSET(fileno(stdin),&fds))
                {
                  read(fileno(stdin),&x,1);
                  switch(x)
                    {
                      case '\r':
                      case '\n':
                        printf("\a");
                        break;
                      case 0x08:
                        count--;
                        printf("\b \b");
                        break;
                      default:
                        string[count] = x;
                        count++;
                        break;
                    }
                }
            }
        }
    }
}

void shellout(void)
{
  setreuid(3099,3099);
  execl("/bin/sh","sh",NULL);
}

 힌트를 확인해보면 다음과 같다. 요약을 해보자면 한 글자씩 입력을 받을 때마다 count를 늘리고, string[count] 명령을 사용해서 값을 대입한다. 또한 0x08이 입력될 경우에는 count의 값을 하나 감소시킨다. 또한 count의 값이 100 이상이면 "what are you trying to do?"라고 출력하고, check가 "0xdeadbeef"일 경우 쉘이 실행되어 문제를 해결 할 수 있다. 

 

 여기서 주의해서 볼 점은 string의 위치이다. 여태까지 bufferoverflow 시킬 변수는 배열보다 먼저 할당이 되었는데, 이번에는 string 배열이 overflow 시킬 check 변수보다 먼저 할당이 되었다.

 

 

 각 변수의 주소를 확인해보았다. 먼저 check 변수의 위치는 0xffffffff98이다. string 변수의 위치는 0xffffff9c이고, count 변수의 위치는 0xffffff90이다. 

 

 즉 변수가 count check string의 순서로 존재한다. 따라서 여태까지 했던 string의 변수를 오버플로우 시켜서 check 변수의 값을 변조시킬 수 없다. 이걸 모르고 삽질을 많이 했었다. 이 문제를 해결하기 위해서는 string[-1] 같은 방식으로 값을 대입해야 한다. check와 string의 주소 차이는 c-8=4 이므로 \x08을 4번 대입해 4를 빼준 후 "\xdeadbeef"를 넣는다. 

 

 이렇게 대입하면 check의 값이 "\xdeadbeef"가 되어서 쉘이 실행된다. 

 

 

 swimming in pink

728x90

'CTF > 시스템' 카테고리의 다른 글

protostar stack1  (0) 2020.10.29
protostar stack0  (0) 2020.10.29
해커스쿨 FTZ level17  (0) 2020.09.29
해커스쿨 FTZ level16  (0) 2020.09.24
해커스쿨 FTZ level15  (0) 2020.09.24