'System'에 해당되는 글 39건

  1. 2019.04.26 6. wolfman -> darkelf
  2. 2019.04.26 [LOB] 5. orc -> wolfman
  3. 2019.04.26 [LOB] 4. goblin -> orc
  4. 2019.04.26 [LOB] 3. cobolt -> goblin
  5. 2019.04.26 [LOB] 2. gremlin -> cobolt
  6. 2019.04.26 [LOB] 1. Gate -> gremlin
  7. 2019.03.19 [FTZ school] level 19
  8. 2019.03.19 [FTZ school] level 18
  9. 2019.03.19 [FTZ school] level 17
  10. 2019.03.19 [FTZ school] level 16
System/LOB2019. 4. 26. 18:31

▲ LOB 6번 문제. darkelf.c와 darkelf 파일이 존재한다. 

해당 힌트는  egg&buffer&length이다. 자세히 알아보자.

▲ 코드에서는 egg, buffer 이외에 인자값의 길이를 체크해준다. 

▲ 일단 우리는 buffer안에 값을 못 쓰니까 buffer밖에 shellcode를 입력해 주어야 한다. 근데 buffer에 길이 입력 제한이 존재한다. 이러면 어떻게 해야할까??

▲ 답은 argv[2] 즉, 두번째 인자값을 이용하면 된다.

gcc가 아니고 gdb임

▲ 일단 아무렇게나 입력해 보고 두번째 인자값의 주소를 찾아준다.

▲ 이후 우리가 알아낸 해당 주소를 ret에 덮어씌우면 된다.

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

[LOB] 8. orge -> troll  (0) 2019.04.26
[LOB] 7. darkelf -> orge  (0) 2019.04.26
[LOB] 5. orc -> wolfman  (0) 2019.04.26
[LOB] 4. goblin -> orc  (0) 2019.04.26
[LOB] 3. cobolt -> goblin  (0) 2019.04.26
Posted by BadSchool
System/LOB2019. 4. 26. 18:26

 

▲ lob 5번 문제. orc -> wolfman으로 넘어가는 문제이다. wolfman.c와 wolfman 파일이 존재한다.

힌트로는 egg hunter & buffer hunter가 있다. 더 자세히 알아보자

▲ 기존에 4번에 존재했던 egghunter 이외에 buffer hunter가 추가되었다. memset으로 buffer에서 40만큼을 0으로 만들어 준다. 

▲ 따라서 우리는 환경변수, buffer안에 shellcode 넣기가 불가능 하다. 해당 문제는 이전과 똑같이 진행해 주면 된다.

▲ 이전 문제와 같은 방법

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

[LOB] 7. darkelf -> orge  (0) 2019.04.26
6. wolfman -> darkelf  (0) 2019.04.26
[LOB] 4. goblin -> orc  (0) 2019.04.26
[LOB] 3. cobolt -> goblin  (0) 2019.04.26
[LOB] 2. gremlin -> cobolt  (0) 2019.04.26
Posted by BadSchool
System/LOB2019. 4. 26. 18:21

 

▲ LOB 4번 문제. goblin -> orc 문제이다. orc.c와 orc 파일이 존재하는데, 힌트에 EGG hunter라고 쓰여있다.

더 자세히 알아보자.

▲ orc.c 코드이다. buffer를 40만큼 할당해 주었으나, egghunter부분에서 environ즉 환경변수 부분을 memset으로 모두 지워준다. 따라서 환경변수에 무슨 값을 넣던 모두 사라지게 된다.

그리고 아래 if문에서는 첫번째 인자값의 48번째가 0xbf인지 아닌지 체크한다.

따라서 현재까지 조건은 '환경변수'를 이용한 공격이 사용 불가하며, 입력한 인자값 중 48번째 값이 '0xbf'이어야 한다.

▲ buf[44]안에 쉘 코드를 넣어야 하니 조금 좁은 감이 있다. 따라서 우리는 buffer안에 shellcode를 넣는 것이 아닌

buffer 밖에 shellcode를 넣어 공격을 실행한다.

▲ 메모리를 계산해 보자. buf가 40만큼의 칸을 가지며 sfp가 4만큼의 칸을 가지므로 ret까지의 거리는 44가 된다.

따라서 nop*44 + shellcode address + shellcode를 입력해 주면 된다.

▲ 근데 공격해보니 segmentation fault (core dumped)가 뜬다. gdb로 볼 때랑 메모리 주소가 바뀌어서 그렇다.

gdb -q -c core 명령어로 core dumped를 확인하여 메모리 주소를 다시 찾아 준다.

 

▲ 다시 알아낸 주소로 공격하면 공격 성공.

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

6. wolfman -> darkelf  (0) 2019.04.26
[LOB] 5. orc -> wolfman  (0) 2019.04.26
[LOB] 3. cobolt -> goblin  (0) 2019.04.26
[LOB] 2. gremlin -> cobolt  (0) 2019.04.26
[LOB] 1. Gate -> gremlin  (0) 2019.04.26
Posted by BadSchool
System/LOB2019. 4. 26. 18:13

 

▲ lob 3번 문제. cobolt -> goblin 문제이다. goblin.c와 goblin파일이 존재한다.

▲ goblin.c 소스코드와 goblin disasm 사진. gets함수가 buf에 사이즈를 정의하지 않고 입력받고 있다. 우리는 이곳을 공격지점으로 한다.

▲ 2번 문제와 공격 페이로드 방식 같음.

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

6. wolfman -> darkelf  (0) 2019.04.26
[LOB] 5. orc -> wolfman  (0) 2019.04.26
[LOB] 4. goblin -> orc  (0) 2019.04.26
[LOB] 2. gremlin -> cobolt  (0) 2019.04.26
[LOB] 1. Gate -> gremlin  (0) 2019.04.26
Posted by BadSchool
System/LOB2019. 4. 26. 18:09

 

▲ LOB 두번째 문제. gremlin -> cobolt 문제이다. 파일은 cobolt.c와 cobolt 두개가 있다.

▲ 소스코드로는 buffer를 16만큼 할당해 주고 인자값을 argv로 받는다. 그리고 strcpy로 첫번째 인자 값을 buffer에 복사해 준다. 우리는 해당 strcpy를 공격지점으로 잡는다.

▲ 이후는 1번 문제와 같다. EGG에 쉘을 넣은 환경변수를 만들고, 해당 시작 주소를 알아내 nop*(16+4) + EGGShell 을 입력해준다.

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

6. wolfman -> darkelf  (0) 2019.04.26
[LOB] 5. orc -> wolfman  (0) 2019.04.26
[LOB] 4. goblin -> orc  (0) 2019.04.26
[LOB] 3. cobolt -> goblin  (0) 2019.04.26
[LOB] 1. Gate -> gremlin  (0) 2019.04.26
Posted by BadSchool
System/LOB2019. 4. 26. 18:05

 

▲ Lob의 시작. 첫번째 인 gate -> gremlin 문제이다. 파일은 gremlin.c, gremlin 두가지가 있다.

▲ gremlin.c와 gremlin의 disasm내용, 딱 봐도 취약한 strcpy가 존재한다. 우리는 이를 공격한다.

▲ disasm을 확인해 보자. 시작에서 sub로 esp를 0x100 = 256_ten 만큼의 버퍼를 할당 해 주었다. 그렇다면 그 앞에 차례로 SFP[4], RET[4]가 존재한다. 

두가지 방법이 있는데 buf에 shellcode에 넣거나 환경변수에 shellcode에 넣는 방법 두가지가 있다. 나는 환경변수에 넣는 EGG Shell 공격 방법을 사용한다.

▲ 첫번째 명령어로 EGG라는 환경 변수에 공격 페이로드를 넣었다. 그리고 간단한 C코드 getenv()로 EGG쉘의 주소값을 알아낸다.

▲ EGG쉘의 시작주소는 0xBFFFFE43. 따라서 공격 페이로드는 nop*(256+4)개 + 0xBFFFFE43이 된다.

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

6. wolfman -> darkelf  (0) 2019.04.26
[LOB] 5. orc -> wolfman  (0) 2019.04.26
[LOB] 4. goblin -> orc  (0) 2019.04.26
[LOB] 3. cobolt -> goblin  (0) 2019.04.26
[LOB] 2. gremlin -> cobolt  (0) 2019.04.26
Posted by BadSchool
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