ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [FTZ Level18 풀이]
    System/FTZ 2018.02.17 00:44

    [Level18 Code]

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    #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, NULLNULLNULL>= 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);
    }   
     
     
    cs

    굉장히 긴 코드가 Level18의 Attackme 코드다.

    파일 디크립트 함수 등 낯선 함수들이 있는데, 별거 없다.

    그냥 표준입력으로 입력받아서 입력값을 스위치문에서 분기해주는 코드다.


    여기서 눈여겨볼점은 check가 [0xdeadbeef]가 되면 shellout( ) 쉘을 실행시키는 함수가 실행된다는 것이다.

    일반적인 BOF를 일으켜서 RET값을 shellout( )주소로 변조하려고 하면, 첫번째 if문 예외처리에 걸리기 때문에 불가능하다.

    일단 밑에 스위치문들을 보자

    3개의 case문이 있는데, 그 중 0x08을 입력받으면 count-- 하는 case문에서 느낌이 좀 온다.

    또, Default case는 버퍼[count]에 값을 저장하고, count++ 한다.


    저 두개의 case문을 잘 이용하면 될 것같다.




    [Level18 Stack]

     count

     x

     check

     string[100]

     SFP

     RET

    스택상황은 이렇다.

    RET을 변조하는 것은 예외처리 때문에 불가능 하고, check영역에 BOF를 일으킬수도 없다. 일반적으론.

    하지만 우리에겐 인덱스를 --해주는 case문이 있다.

    따라서, string에서 check영역으로 인덱스값이 이동할때까지 0x08을 입력해주고 

    그 다음 deadbeef를 입력해주면 Shellout( )가 실행될 것이다.


    우선 string과 check의 offset을 알아보자


    [Level18 main]

    빨간색 박스는 위 코드에서 x와 count를 0으로 초기화 해주는 부분이고

    주황색 박스에서는 [EBP-104](Check)와 deadbeef를 비교하는 부분이다.

    여기서 check의 영역은 [EBP-104]임을 알 수 있다.


    [Level18 Switch문]

    두번째 주황색 박스를 보면 DEC [EBP-112]부분을 보면 저 부분이 count--해주는 부분임을 알 수 있다.

    (DEC는 -1해주는 어셈블리어다.)


    초록색 박스는 String[count] = x 해주는 부분인데, 처음에 주소값을 참조하는 곳을 보면 [EBP-100]을 EAX에 저장한다.

    그 후, [EBP-252]에 다시 EAX값을 저장하고 거기에 BYTE만큼 입력값을 저장하는데

    여기서 [EBP-100]공간이 String의 공간임을 알 수 있다.


    따라서 인덱스를 -4만큼 해주고, 그 후에 deadbeef를 저장해주면 쉘이 실행될 것이다.

    보는 것처럼 쉘이 잘 실행된 것을 볼 수 있다.

    자 이제 Level19로 넘어가보자


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

    [FTZ Level20 풀이]  (0) 2018.02.18
    [FTZ Level19 풀이]  (0) 2018.02.17
    [FTZ Level18 풀이]  (1) 2018.02.17
    [FTZ Level17 풀이]  (0) 2018.02.16
    [FTZ Level16 풀이]  (0) 2018.02.16
    [FTZ Level15 풀이]  (0) 2018.02.16

    댓글 1

Designed by Tistory.